sqlplus有相关的了命令:比如alter procedure prodedure_name compile;
创新互联公司2013年成立,是专业互联网技术服务公司,拥有项目做网站、成都网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元市南做网站,已为上家服务,为市南各地企业和个人服务,联系电话:18980820575
第一次编译的时候只要在后面加一个/当做执行符号,那么就可以进行编译。
Oracle中出现无效对象,就是因为在创建函数或存储过程等,里边的内容书写不正确导致。如果要重新编译,需要先修正错误,然后编译。
工具:Oracle 10g、PL/SQL
步骤:
1、在PL/SQL中打开出现编译错误的函数或存储过程,这里以存储过程为例。
2、右键点击该存储过程,选择“编辑”。
3、根据错误提示,找到错误,并修改错误。
4、改正错误后,点击左上方的“齿轮”状按钮。
5、运行成功后,则该存储过程就会变为编译成功的状态。
一般情况下不会出现一个包编译时间很长的情况,出现何种情况一般是你的数据库慢,可能是服务器慢,也可能是网络慢,也可能是客户端慢。
先看看数据库现在在忙什么?如果现在数据库真的很忙,或者数据库出现要夯住的状态,其他的操作也慢,那么就要考虑数据库的瓶颈了,这个分析起来就麻烦了。
如果仅仅编译这个慢,其他的不那么慢,那么可能是你的机器的问题,换一台试试,有时可能你的这个用户操作过多,或者过长时间不操作,导致进程假死,这个也是有可能发生的。另外看看,是不是有人也在操作这个包,如果是的话,那么编译确实很慢。
如果是网络慢,或者服务器慢,那么就几乎真的没办法了,数据库工程师如果对系统较熟悉的可以找找看问题,不过真的没啥可以改的。
如果就是因为服务器不行,包太大,那么就分包,把一个包变成两个,标_1和_2,或者_A,_B呗。
//通过编写的连接类创建一个连接
dbconn db = new dbconn();
Connection con1 = db.conn;
String callSQL1 = new String();
ResultSet rs1 = null;
//创建一个CallableStatement变量st1来调用存储过程信息
CallableStatement st1 = null;
try {
st1 = con1.prepareCall("{ call p(?,?,?,?) }");
st1.setString(1, "参数1");
st1.setString(2, "参数2");
st1.setString(3, "参数3");
st1.registerOutParameter(4,Types.INTEGER); //此处4 代表第一个"?" 则表示存储过程返回的值 这里要注意Types的类型,当需要有返回值时
st1.execute();
System.out.println(st1.getInt(4));//输出存储过程的返回值,当有返回值时
} catch (Exception error) {
try {
con1.rollback(); //操作不成功则回退
} catch (Exception ex9) {
ex9.printStackTrace();
}
out.print("系统出错" + error.getMessage());
} finally {
try {
if (st1 != null) {
st1.close();
}
} catch (Exception error) {
}
db.disconnect();
}
编译的存储过程的时候,程序死住,等待一会出现ora-04021错误解决办法:
1.可能被锁住
查看v$lockedselect b.sid,b.serial#,b.machine,b.terminal,b.program,b.process,b.status from v$lock a , v$session b
where a.SID = b.SID
得到死锁session的SID,SERIAL#参看这个是否为你自己用户下的,然后kill掉session
2.可能被挂起
查看v$session_waitselect b.serial#,a.* from v$session_wait a,v$session
bwhere a.sid = b.sid得到等待的session的sid和serial#3.查看dba_ddl_locksselect
session_id sid, owner, name, type,
mode_held held, mode_requested request
from dba_ddl_locks
where name = 'your_package_name'