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的代,F9debug,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(
50primary key not null,
vcount number(
8not null,
bid varchar2(
50not 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.Hibernateoracle储过

        this.pnumberManager.getHibernateTemplate().execute(
                
new HibernateCallback() ...{
                    
public Object doInHibernate(Session session)
                            
throws HibernateException, SQLException ...{
                        CallableStatement cs = session
                                .connection()
                                .prepareCall("{call modifyapppnumber_remain(?)}");
                        cs.setString(1, foundationid);
                        cs.execute();
                        
return null;
                    }
                });

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值