【转】oracle 存储过程的基本语法及注意事项
1.基本结构 
CREATE OR REPLACE PROCEDURE 存储过程名字
(
    参数1 IN NUMBER,
    参数2 IN NUMBER
) IS
变量1 INTEGER :=0;
变量2 DATE;
BEGIN
END 存储过程名字
2.SELECT INTO STATEMENT
  将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条
  记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)
  例子: 
  BEGIN
  SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx;
  EXCEPTION
  WHEN NO_DATA_FOUND THEN
      xxxx;
  END;
  ...
3.IF 判断
  IF V_TEST=1 THEN
    BEGIN 
       do something
    END;
  END IF;
4.while 循环
  WHILE V_TEST=1 LOOP
  BEGIN
 XXXX
  END;
  END LOOP;
5.变量赋值
  V_TEST := 123;
6.用for in 使用cursor
  ...
  IS
  CURSOR cur IS SELECT * FROM xxx;
  BEGIN
 FOR cur_result in cur LOOP
  BEGIN
   V_SUM :=cur_result.列名1+cur_result.列名2
  END;
 END LOOP;
  END;
7.带参数的cursor
  CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID;
  OPEN C_USER(变量值);
  LOOP
 FETCH C_USER INTO V_NAME;
 EXIT FETCH C_USER%NOTFOUND;
    do something
  END LOOP;
  CLOSE C_USER;
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 a;-- 正确 select a.appname from appinfo as a;-- 错误
select a.appname from appinfo as a;-- 错误2.在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用游标的话就另当别论了。
 select af.keynode into kn from APPFOUNDATION af where af.appid=aid and af.foundationid=fid;-- 有into,正确编译
  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
  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
  Error: PLS-00428: an INTO clause is expected in this SELECT statement

3.在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。
4.在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会报错
 select keynode into kn from APPFOUNDATION where appid=aid and foundationid=fid;-- 正确运行
 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;-- 运行阶段报错,提示
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
ORA-01422:exact fetch returns more than requested number of rows
5.在存储过程中,关于出现null的问题
 create table A(
create table A( id varchar2(50) primary key not null,
id varchar2(50) primary key not null, vcount number(8) not null,
vcount number(8) not null, bid varchar2(50) not null -- 外键
bid varchar2(50) not null -- 外键  );
); select sum(vcount) into fcount from A where bid='xxxxxx';
select sum(vcount) into fcount from A where bid='xxxxxx'; if fcount is null then
if fcount is null then fcount:=0;
    fcount:=0; end if;
end if;6.Hibernate调用oracle存储过程
 this.pnumberManager.getHibernateTemplate().execute(
        this.pnumberManager.getHibernateTemplate().execute( new HibernateCallback() {
                new HibernateCallback() { public Object doInHibernate(Session session)
                    public Object doInHibernate(Session session) throws HibernateException, SQLException {
                            throws HibernateException, SQLException { CallableStatement cs = session
                        CallableStatement cs = session .connection()
                                .connection() .prepareCall("{call modifyapppnumber_remain(?)}");
                                .prepareCall("{call modifyapppnumber_remain(?)}"); cs.setString(1, foundationid);
                        cs.setString(1, foundationid); cs.execute();
                        cs.execute(); return null;
                        return null; }
                    } });
                });欢迎访问:找与淘网
 
                    
                     
                    
                 
                    
                
 
                 
                            
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号