oracle 存储过程的基本语法

栏目: 数据库 · Oracle · 发布时间: 5年前

内容简介:1.基本结构将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)

1.基本结构

CREATE OR REPLACE PROCEDURE 存储过程名字 
( 
   参数1 IN NUMBER, 
   参数2 IN NUMBER 
) IS 
变量1 INTEGER :=0; 
变量2 DATE; 
BEGIN 
 
END 存储过程名字 

oracle 存储过程的基本语法

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 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 modifyapppnumber_remain(?)}"); 
 
                       cs.setString(1, foundationid); 
 
                       cs.execute(); 
 
                       return null; 
 
                   } 
 
               }); 
 
  

以上所述就是小编给大家介绍的《oracle 存储过程的基本语法》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

C语言点滴

C语言点滴

赵岩 / 人民邮电出版社 / 2013-10-1 / 45.00元

C语言兼具高级语言和汇编语言的特点,学习起来难度较大,令不少初学者望而生畏。同时,C语言又是一门应用非常广泛的编程语言,在实际应用中如何根据不同的应用场景高效地使用C语言,也是大家非常感兴趣的话题。  《C语言点滴》精心选取C语言一些必备知识,这也是初学者容易搞不清楚、犯错误的知识点,进行深入地分析和介绍,以期帮助读者清除C语言学习之路上的“绊脚石”,降低初学入门的难度,培养继续深入的兴趣。  全......一起来看看 《C语言点滴》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换