您当前的位置: 首页 > 数据库教程 > Oracle教程 > oracle存储过程的基本语法及注意事项

oracle存储过程的基本语法及注意事项

作者:不详 来源:网络 发布时间: 2011-10-15 10:42 点击:
1.基本结构 CREATE OR REPLACE PROCEDURE存储过程名字 ( 参数1IN NUMBER, 参数2IN NUMBER )IS 变量1INTEGER:=0; 变量2DATE; BEGIN END存储过程名字 2.SELECT INTO STATEMENT 将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条 记录,否则抛出

oracle存储过程的基本语法及注意事项

  1.基本结构
  
  CREATE OR REPLACE PROCEDURE存储过程名字
  
  (
  
  参数1IN NUMBER,
  
  参数2IN NUMBER
  
  )IS
  
  变量1INTEGER:=0;
  
  变量2DATE;
  
  BEGIN
  
  END存储过程名字
  
  2.SELECT INTO STATEMENT
  
  将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条
  
  记录,否则抛出异常(如果没有记录抛出NODATAFOUND)
  
  例子:
  
  BEGIN
  
  SELECT col1,col2into变量1,变量2FROM typestruct where xxx;
  
  EXCEPTION
  
  WHEN NODATAFOUND THEN
  
  xxxx;
  
  END;
  
  ...
  
  3.IF判断
  
  IF VTEST=1THEN
  
  BEGIN
  
  do something
  
  END;
  
  END IF;
  
  4.while循环
  
  WHILE VTEST=1LOOP
  
  BEGIN
  
  XXXX
  
  END;
  
  END LOOP;
  
  5.变量赋值
  
  VTEST:=123;
  
  6.用for in使用cursor
  
  ...
  
  IS
  
  CURSOR cur IS SELECT*FROM xxx;
  
  BEGIN
  
  FOR curresult in cur LOOP
  
  BEGIN
  
  VSUM:=curresult.列名1+curresult.列名2
  
  END;
  
  END LOOP;
  
  END;
  
  7.带参数的cursor
  
  CURSOR CUSER(CID NUMBER)IS SELECT NAME FROM USER WHERE TYPEID=CID;
  
  OPEN CUSER(变量值);
  
  LOOP
  
  FETCH CUSER INTO VNAME;
  
  EXIT FETCH CUSER%NOTFOUND;
  
  do something
  
  END LOOP;
  
  CLOSE CUSER;
  
  8.用pl/sql developer debug
  
  连接数据库后建立一个Test WINDOW
  
  在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试
  
  关于oracle存储过程的若干问题备忘
  
  1.在oracle中,数据表别名不能加as,如:
  
  select a.appname from appinfo a;--正确
  
  select a.appname from appinfo as a;--错误
  
  也许,是怕和oracle中的存储过程中的关键字as冲突的问题吧
  
  2.在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用游标的话就另当别论了。
  
  select af.keynode into kn from APPFOUNDATION af where af.appid=aid and af.foundationid=fid;--有into,正确编译
  
  select af.keynode from APPFOUNDATION af where af.appid=aid and af.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.在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会报错
  
  select keynode into kn from APPFOUNDATION where appid=aid and foundationid=fid;--正确运行
  
  select af.keynode into kn from APPFOUNDATION af where af.appid=appid and af.foundationid=foundationid;--运行阶段报错,提示
  
  ORA-01422:exact fetch returns more than requested number of rows
  
  5.在存储过程中,关于出现null的问题
  
  假设有一个表A,定义如下:
  
  create table A(
  
  id varchar2(50)primary key not null,
  
  vcount number(8)not null,
  
  bid varchar2(50)not null--外键
  
  );
  
  如果在存储过程中,使用如下语句:
  
  select sum(vcount)into fcount from A where bid=“xxxxxx“;
  
  如果A表中不存在bid="xxxxxx"的记录,则fcount=null(即使fcount定义时设置了默认值,如:fcount number(8):=0依然无效,fcount还是会变成null),这样以后使用fcount时就可能有问题,所以在这里最好先判断一下:
  
  if fcount is null then
  
  fcount:=0;
  
  end if;
  
  这样就一切ok了。
  
  6.Hibernate调用oracle存储过程
  
  this.pnumberManager.getHibernateTemplate().execute(
  
  new HibernateCallback()...{
  
  public Object doInHibernate(Session session)
  
  throws HibernateException,SQLException...{
  
  CallableStatement cs=session
  
  .connection()
  
  .prepareCall("{call modifyapppnumberremain(?)}");
  
  cs.setString(1,foundationid);
  
  cs.execute();
  
  return null;
  
  }
  
  });

分享到:
本文"oracle存储过程的基本语法及注意事项"由远航站长收集整理而来,仅供大家学习与参考使用。更多网站制作教程尽在远航站长站。
顶一下
(0)
0%
踩一下
(0)
0%
[点击 次] [返回上一页] [打印]
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
关于本站 - 联系我们 - 网站声明 - 友情连接- 网站地图 - 站点地图 - 返回顶部
Copyright © 2007-2013 www.yhzhan.com(远航站长). All Rights Reserved .
远航站长:为中小站长提供最佳的学习与交流平台,提供网页制作与网站编程等各类网站制作教程.
官方QQ:445490277 网站群:26680406 网站备案号:豫ICP备07500620号-4