oracle存储过程没法编译
你怎么查的锁?v$locked_object?dba_ddl_locks查了没,可能是ddl的锁,如果不能编译,一编译就死,也可能是ddl的锁导致的,以前碰到过。如果能找到锁,那就简单了。
不过还碰到过一种特别扯淡的情况,关掉自己的连接,然后换一台电脑从新来过,就OK了,这种情况也碰到过。
‘贰’ ORACLE 存储过程被锁,编译不了,怎么解锁
一些ORACLE中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长时间不释放,有时实在没办法,只好重启数据库。现在提供一种方法解决这种问题,那就是在ORACLE中杀不掉的,在OS一级再杀。
1.下面的语句用来查询哪些对象被锁:
select object_name,machine,s.sid,s.serial#
from v$locked_object l,dba_objects o ,v$session s
where l.object_id=o.object_id and l.session_id=s.sid;
2.下面的语句用来杀死一个进程:
alter system kill session '24,111'; (其中24,111分别是上面查询出的sid,serial#)
【注】以上两步,可以通过Oracle的管理控制台来执行。
3.如果利用上面的命令杀死一个进程后,进程状态被置为"killed",但是锁定的资源很长时间没有被释放,那么可以在os一级再杀死相应的进程(线程),首先执行下面的语句获得进程(线程)号:
select spid, osuser, s.program
from v$session s,v$process p
where s.paddr=p.addr and s.sid=24 (24是上面的sid)
4.在OS上杀死这个进程(线程):
1)在unix上,用root身份执行命令:
#kill -9 12345(即第3步查询出的spid)
2)在windows(unix也适用)用orakill杀死线程,orakill是oracle提供的一个可执行命令,语法为:
orakill sid thread
其中:
sid:表示要杀死的进程属于的实例名
thread:是要杀掉的线程号,即第3步查询出的spid。
例:c:>orakill orcl 12345
‘叁’ ORACLE存储过程批量未编译
对存储过程中用到的表进行过alter处理
譬如你对存储过程中用到的表a,加了一个字段,虽然对存储过程中整体内容不影响,但是alter处理后,你会发现,这些存储过程变成未编译通过的了,这个时候只要重新编译一下就行,当然也有alter后,存储过程编译不过去的情况,这个时候你就需要重新写里边的内容了
‘肆’ oracle 创建存储过程报错, PACKAGE BODY SCOTT.EMP_SAL_MANAGEMENT 编译错误
子程序或游标 'P_P_BONUS' 已在程序包说明中声明, 必须在程序包体中对其进行定义。意思是你已经声明了这个存储过程P_P_BONUS,但是没有在包体(PACKAGE BODY )中定义,就是你还需要在包体中定义P_P_Bonus的实现部分
‘伍’ oracle存储过程 编译有问题
存储过程存有三种类型的参数
1、in (只能传入值,在程序中不能修改)
2、out (必须在程序中赋值)
3、in out (兼顾以上两点)
所以你的错误在于 你的 name 是 in 类型,因此在程序中是不能给其赋值的
select name into name from users;
是错误的,改成out 类型就可以了。
‘陆’ Oracle 定义存储过程不能执行怎么办
无效状态有两种可能:
1、一种是你的存储过程编辑没有成功,创建了,但里面有语法错误。
‘柒’ 写了一个Oracle存储过程,编译没通过,请帮忙看下哪里有语法问题。
有错误啊!
create or replace procere adjust_inventory(p_goods_id in number,p_adjust_count in number)
as
declare
goods_count number(6,0);
adjust_goods_name number(6,0);
begin
if (p_goods_id is null) then
dbms_output.put_line( '商品ID为空,不能操作');
return;
end if;
select surplus into goods_count from y_goods where goods_id =p_goods_id;
if (goods_count < p_adjust_count) then
dbms_output.put_line( '商品调整数量大于库存量,不能操作');
return;
end if;
update y_goods set surplus = surplus - p_adjust_count where goods_id = p_goods_id;
select surplus into goods_count from y_goods where goods_id = p_goods_id;
select goods_name into adjust_goods_name from y_goods where goods_id = p_goods_id;
dbms_output.put_line( goods_name || '的库存成功调整,目前库存数量为' || goods_count);
end;
end adjust_inventory;