oracle存储过程语法与使用

oracle存储过程语法与使用

大家好,又见面了,我是你们的朋友全栈君。

oracle 存储过程的基本语法

1.基本结构

代码语言:javascript复制 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL;

5 END;行1:

CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它;

行2:

IS关键词表明后面将跟随一个PL/SQL体。

行3:

BEGIN关键词表明PL/SQL体的开始。

行4:

NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句;

行5:

END关键词表明PL/SQL体的结束

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.SYS_REFCURSOR 型游标,该游标是Oracle 以预先定义的游标,可作出参数进行传递 。(带参数的游标)

例子1:

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;

例子2:

create or replace procedure test(rsCursor out SYS_REFCURSOR) is

cursor SYS_REFCURSOR;

name varhcar(20);

begin

OPEN cursor FOR select name from student where … –SYS_REFCURSOR 只能通过OPEN 方法来打开和赋值

LOOP

fetch cursor into name –SYS_REFCURSOR 只能通过fetch into 来打开和遍历 exit when cursor%NOTFOUND; –SYS_REFCURSOR 中可使用三个状态属性: —%NOTFOUND( 未找到记录信息) %FOUND( 找到记录信息) —%ROWCOUNT( 然后当前游标所指向的行位置)

dbms_output.putline(name);

end LOOP;

rsCursor := cursor;

end test;

//

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

1.在oracle中,数据表别名不能加as,如:

select a.appname from appinfo a;– 正确

select a.appname from appinfo as a;– 错误

但是挑出的表中的字段可以取别名

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

代码语言:javascript复制 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 statement3.在利用select…into…语法时,必须先确保数据库中有该条记录,否则会报出”no data found”异常。

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

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

例子:

存储过程的定义与运行:

代码语言:javascript复制create or replace procedure mypro as Cursor months is select TABLE_NAME from user_tables t where t.TABLE_NAME like 'BSA_201612%';

test varchar2(30) := 'test str';

numb number :=1;

begin for mon in months loop dbms_output.put_line(test);

--select count(*) from mon into numb;

dbms_output.put_line(mon.TABLE_NAME);

end loop;

end mypro;

set serveroutput on;

exec mypro;发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/160791.html原文链接:https://javaforall.cn

相关推荐

【白酒价格】兰陵酒紫气东来白酒价格表大全及多少钱一瓶
在哪个应用商店能下载365

【白酒价格】兰陵酒紫气东来白酒价格表大全及多少钱一瓶

📅 10-10 👍 886
【攻略】 血源詛咒本篇全 29 套服裝 共 97件 拿法介紹 @血源詛咒 哈啦板
专家谈:喝骨头汤真的有益健康吗?
365平台客服电话

专家谈:喝骨头汤真的有益健康吗?

📅 07-11 👍 802
史上最大力度投入!京东推出新品成长“百千亿”计划,打造新品营销阵地
中國泉州 10 間最佳飯店(TWD 1,278 起)
在哪个应用商店能下载365

中國泉州 10 間最佳飯店(TWD 1,278 起)

📅 09-22 👍 929
十大最好看的狗排名
在哪个应用商店能下载365

十大最好看的狗排名

📅 09-08 👍 411