1 2 3 4 5 6 7 8 9 | IS CURSORcur ISSELECT* FROMxxx; BEGIN FORcur_result incur LOOP BEGIN V_SUM :=cur_result.列名1+cur_result.列名2 END; ENDLOOP; END; |
7. 带参数的cursor
1 2 3 4 5 | CURSORC_USER(C_ID NUMBER) ISSELECTNAMEFROMUSERWHERETYPEID=C_ID; OPENC_USER(变量值); FETCHC_USER INTOV_NAME; EXIT WHENFETCHC_USER%NOTFOUND; CLOSEC_USER; |
8. 用pl/sql developer debug
连接数据库后建立一个Test WINDOW,在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试
关于oracle存储过程的若干问题备忘
1.在oracle中,数据表别名不能加as,如:
1 2 | selecta.appname fromappinfo a;-- 正确 selecta.appname fromappinfo asa;-- 错误 |
也许,是怕和oracle中的存储过程中的关键字as冲突的问题吧
2.在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用游标的话就另当别论了。
1 2 3 4 | selectaf.keynode intokn fromAPPFOUNDATION af whereaf.appid=aid andaf.foundationid=fid;-- 有into,正确编译 selectaf.keynode fromAPPFOUNDATION af whereaf.appid=aid andaf.foundationid=fid;-- 没有into,编译报错,提示:Compilation Error: PLS-00428: an INTO clause is expected in this SELECT statement |
3.在利用select…into…语法时,必须先确保数据库中有该条记录,否则会报出”no data found”异常。
可以在该语法之前,先利用select count(*) from 查看数据库中是否存在该记录,如果存在,再利用select…into…
4.在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会报错
1 2 3 4 5 6 | --正确 selectkeynode intokn fromAPPFOUNDATION whereappid=aid andfoundationid=fid; --错误 selectaf.keynode intokn fromAPPFOUNDATION af whereaf.appid=appid andaf.foundationid=foundationid; -- 运行阶段报错,提示ORA-01422:exact fetch returns more than requested number of rows |
5.在存储过程中,关于出现null的问题
假设有一个表A,定义如下:
1 2 3 4 5 | createtableA( id varchar2(50) primarykeynotnull, <a class="keylink"href="https://www.2cto/kf/ware/vc/"target="_blank"> vcount number(8) notnull, bid varchar2(50) notnull-- 外键 ); |
如果在存储过程中,使用如下语句:
1 | selectsum(vcount) intofcount fromA wherebid='xxxxxx'; |
如果A表中不存在bid=”xxxxxx”的记录,则fcount=null(即使fcount定义时设置了默认值,如:fcount number(8):=0依然无效,fcount还是会变成null),这样以后使用fcount时就可能有问题,所以在这里最好先判断一下:
1 2 3 | if fcount isnullthen fcount:=0; endif; |
这样就一切ok了。
6.Hibernate调用oracle存储过程
1 2 3 4 5 6 7 8 9 10 11 12 | this.pnumberManager.getHibernateTemplate().execute( new HibernateCallback() { publicObject doInHibernate(Session session) throws HibernateException, SQLException { CallableStatement cs = session .connection() .prepareCall("{call modifyapppnumber_remain(?)}"); cs.setString(1, foundationid); cs.execute(); returnnull; } }); |
本文地址:百科问答频道 https://www.neebe.cn/wenda/930785_3.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!