ORACLE存储过程,函数,包,游标1、 PL/SQL语句块
PL/SQL语句块只适⽤于Oracle数据库,使⽤时临时保存在客户端,⽽不是保存在数据库。
基本语法:
Sql代码
1. declare
2. 变量声明、初始化
3. begin
4. 业务处理、逻辑代码
5. exception
6. 异常捕获
7. end;
变量声明:<;变量名> <;类型及长度> [:=<;初始值>]
例:v_name varchar2(20):=’张三’;
2、循环语句
loop循环语法:
Sql代码
1. loop
2. exit when 表达式
3. end loop;
while循环语法:
Sql代码
1. while 表达式
2. loop
3. end loop;
for循环语法:
Sql代码
1. for <;变量> in <;变量取值范围(⼩值..⼤值,如1..100)> loop
2. end loop;
for循环的变量可不做声明及初始化。
3、 if判断语句
基本语法:
Sql代码
1. if <;表达式> then
2. …
3. el if <;表达式> then
4. …
5. el
6. …
7. end if;
8. end if;
例:
Sql代码
1. declare
2. v_identity number(4):=0;鹰眼巴顿
3. begin
4. loop
5. if v_identity=1 then
6. dbms_output.put_line('v_identity=1');
7. el if v_identity=3 then
8. dbms_output.put_line('v_identity=3');
9. el if v_identity=6 then
10. exit;
11. el
12. dbms_output.put_line('v_identity is not 1 or 3');
13. end if;
14. end if;
15. end if; -- 注意,有多少个if就要有多少个end if结束标志。
16.
17. v_identity:=v_identity+1;
18.
19. end loop;
20.
21. exception
22. when others then dbms_output.put_line('error!');
23. end;
4、分⽀ca
基本语法:
上海演讲培训Sql代码
1. ca <;变量>
2. when 常量 then
3. …
4. when 常量 then
5. …
6. el
7. …
8. end ca;
例:
Sql代码
1. declare
2. v_number number(4):=3;
3. v_string varchar(20):='abc';
4. begin
5. ca v_number
6. when 1 then
7. dbms_output.put_line('v_number is '||1);
8. when 2 then
9. dbms_output.put_line('v_number is '||2);
10. when 3 then
11. dbms_output.put_line('v_number is '||3);
12.
13. end ca;
14.
15. ca v_string
16. when 'ab' then
17. dbms_output.put_line('v_string is '||'ab');
byzantine
18. when 'bc' then
19. dbms_output.put_line('v_string is '||'bc');
20. el -- 缺省匹配
21. dbms_output.put_line('v_string is other value');
22. end ca;
23.
24. exception
nonresident
25. when others then dbms_output.put_line('error!');
26. end;
5、异常(exception)
声明异常语法:<;异常名> exception;
抛出异常语法:rai <;异常名>;
捕获异常语法:when <;异常名> then 异常处理语句;
例:
Sql代码
1. declare
2. v_input varchar2(1):='&throw';-- 动态输⼊
3. v_exception_1 exception; -- ⾃定义异常
4. v_exception_2 exception;
5. others exception; -- 系统异常
6.
7. begin
犯罪心理第一季
8. if v_input='1' then
9. rai v_exception_1; -- 抛出异常
10. el if v_input='2' then
11. rai v_exception_2;
12. el
13. rai others;
14. end if;
15. end if;
16.
17. exception
18. -- 捕获异常
19.
20. when v_exception_1 then dbms_output.put_line('throw exception: v_exception_1');
21. when v_exception_2 then dbms_output.put_line('throw exception: v_exception_2');
22. when others then dbms_output.put_line('throw exception: others');
23.
24. end;
6、游标(cursor)
声明游标语法:cursor <;游标名> is lect语句;
声明ref游标语法:<;游标名> is ref cursor;
打开游标语法:open <;游标名>;
移动游标并获取数据语法:fetch <;游标名> into <⽤于保存读取的数据的变量的名>;
关闭游标语法:clo <;游标名>;
游标属性(游标的属性必须在关闭游标之前):
%isopen: 判断游标是否打开
%notfound: 找不到数据时
%found:
%rowcount: 返回当前游标已扫描的数据⾏数量
游标分类:1、显⽰游标(⾃定义游标);2、隐⽰游标(系统游标);3、REF游标
例:
Sql代码
1. declare
2. v_row test%rowtype; -- 匹配t_test表中⼀⾏所有的数据类型
3. cursor v_cur is
4. lect * from test;-- 声明游标
5. begin
6. open v_cur;-- 打开游标
8. fetch v_cur into v_row;-- 将游标所在⾏的数据转存到v_row中
9. exit when v_cur%notfound; -- 当游标到最后⼀⾏时跳出
10. dbms_output.put_line('id = '||v_row.t_id||' name = '||v_row.t_name||' msg = '||v_row.t_msg);
11. end loop;
12. clo v_cur;-- 关闭游标
13. exception
14. when others then dbms_output.put_line('throw exception: others');
15. end;
-- REF游标 --
Sql代码
1. create or replace package upk_lect_test
2. as
3. type uc_test is ref cursor; -- 声明ref游标
4. end upk_lect_test;
5.
6. -- 存储过程中调⽤ref游标,并将查询结果以游标的⽅式返回
7. create or replace procedure up_lect_test_2
8. (uc_result out upk_lect_test.uc_test)
oltc
9. is
10. begin
11. open uc_result for lect * from t_test;
12. end up_lect_test_2;
7、通配类型操作符
%type: 通配某⾏某列数据类型,如v_name t_test.t_name%type;通配表t_test中的t_name。
%rowtype: 通配⼀⾏所有列的数据类型,如 v_row t_test%rowtype;匹配t_test表中⼀⾏所有的数据类型。
8、存储过程(procedure)
基本语法:
dcgSql代码
1. create procedure <;过程名>(<;参数列表,⽆参时忽略>)
2. as|is
3. 变量声明、初始化
4. begin
5. 业务处理、逻辑代码
6. exception
7. 异常捕获、容错处理
8. end <;过程名>;
参数:<;参数名> in|out|in out <;参数类型,⽆长度说明> ,如:v_name varchar2
in:⼊参
out:出参
in out:出⼊参
注:as|is表⽰as或is
调⽤语法:
1)、exec <;过程名>;
2)、execute <;过程名>;
3)、在PL/SQL语句块中直接调⽤
例:
Sql代码
1. create or replace procedure up_wap(v_param1 in out varchar2,v_param2 in out varchar2)
2. is
3. v_temp varchar2(20);
5. dbms_output.put_line('交换前参数1:'||v_param1||' 参数2:'||v_param2);
6. v_temp:=v_param1;
7. v_param1:=v_param2;
8. v_param2:=v_temp;
ankara9. dbms_output.put_line('交换后参数1:'||v_param1||' 参数2:'||v_param2);
10.
11. exception
12. when others then dbms_output.put_line('There is a error when the procedure up_wap executing!');
13. end up_wap;
-- 调⽤存储过程
Sql代码
1. declare
2. v_param1 varchar2(20):='param1';
3. v_param2 varchar2(20):='param2';
4. begin
5. up_wap(v_param1 => v_param1,v_param2 => v_param2);
6. end;
9、⾃定义函数(function)
基本语法:
Sql代码
1. create function <;函数名>(<;参数列表,⽆参时忽略>)
2. return <;返回值类型,⽆长度说明>
3. as|is
4. 变量声明、初始化
5. begin
6. 业务处理、逻辑代码
7. return <;返回的值>;
8.
9. exception
10. 异常捕获、容错处理
11. end <;函数名>;
参数:in ⼊参
自学日语教材
注:只有⼊参的类型。
在存储过程和⾃定义函数中的参数的传递(⼊参和出参)不能使⽤%type或%rowtype匹配,不能使⽤空值null,但是存储过程可以返回空值。
例:
Sql代码
1. create function uf_lect_name_by_id_test(v_id in number)
2. return varchar2
逃出洛杉矶
3. is
4. v_name t_test.t_name%type;
5. begin
6. lect t_name into v_name from t_test where t_id=v_id;
7. return v_name;
8.
9. exception
10. when others then
11. dbms_output.put_line('error');
12. end uf_lect_name_by_id_test;
13.
14.
15. lect uf_lect_name_by_id_test(1) 姓名 from dual;-- lect调⽤
16.
17. declare --pl/sql语句块调⽤