数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

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


发布日期:2021年03月13日
 
oracle存储过程的基本语法及注意事项

基本结构

CREATE OR REPLACE PROCEDURE 存储过程名字

(

参数 IN NUMBER

参数 IN NUMBER

) IS

变量 INTEGER :=;

变量 DATE;

BEGIN

END 存储过程名字

SELECT INTO STATEMENT

将select查询的结果存入到变量中可以同时将多个列存储多个变量中必须有一条

记录否则抛出异常(如果没有记录抛出NO_DATA_FOUND)

例子

BEGIN

SELECT colcol into 变量变量 FROM typestruct where xxx;

EXCEPTION

WHEN NO_DATA_FOUND THEN

xxxx;

END;

IF 判断

IF V_TEST= THEN

BEGIN

do something

END;

END IF;

while 循环

WHILE V_TEST= LOOP

BEGIN

XXXX

END;

END LOOP;

变量赋值

V_TEST := ;

用for in 使用cursor

IS

CURSOR cur IS SELECT * FROM xxx;

BEGIN

FOR cur_result in cur LOOP

BEGIN

V_SUM :=cur_result列名+cur_result列名

END;

END LOOP;

END;

带参数的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;

用pl/sql developer debug

连接数据库后建立一个Test WINDOW

在窗口输入调用SP的代码F开始debugCTRL+N单步调试

关于oracle存储过程的若干问题备忘

在oracle中数据表别名不能加as

select aappname from appinfo a; 正确

select aappname from appinfo as a; 错误

也许是怕和oracle中的存储过程中的关键字as沖突的问题吧

在存储过程中select某一字段时后面必须紧跟into如果select整个记录利用游标的话就另当别论了

select afkeynode into kn from APPFOUNDATION af where afappid=aid and affoundationid=fid; 有into正确编译

select afkeynode from APPFOUNDATION af where afappid=aid and affoundationid=fid; 没有into编译报错提示Compilation

Error: PLS: an INTO clause is expected in this SELECT statement

在利用selectinto语法时必须先确保数据库中有该条记录否则会报出no data found异常

可以在该语法之前先利用select count(*) from 查看数据库中是否存在该记录如果存在再利用selectinto

在存储过程中别名不能和字段名称相同否则虽然编译可以通过但在运行阶段会报错

select keynode into kn from APPFOUNDATION where appid=aid and foundationid=fid; 正确运行

select afkeynode into kn from APPFOUNDATION af where afappid=appid and affoundationid=foundationid; 运行阶段报错提示

ORA:exact fetch returns more than requested number of rows

在存储过程中关于出现null的问题

假设有一个表A定义如下

create table A(

id varchar() primary key not null

vcount number() not null

bid varchar() not null 外键

);

如果在存储过程中使用如下语句

select sum(vcount) into fcount from A where bid=xxxxxx;

如果A表中不存在bid=xxxxxx的记录则fcount=null(即使fcount定义时设置了默认值fcount number():=依然无效fcount还是会变成null)这样以后使用fcount时就可能有问题所以在这里最好先判断一下

if fcount is null then

fcount:=;

end if;

这样就一切ok了

Hibernate调用oracle存储过程

thispnumberManagergetHibernateTemplate()execute(

new HibernateCallback() {

public Object doInHibernate(Session session)

throws HibernateException SQLException {

CallableStatement cs = session

nnection()

prepareCall({call modifyapppnumber_remain(?)});

cssetString( foundationid);

csexecute();

return null;

}

});

上一篇:OracleSQL精妙SQL语句讲解

下一篇:实现数据行的权限控制(Policy的应用)