存储过程语法
一、什么是PL/SQL结构化查询语言(Structured Query Language,简称SQL)是用来访问关系型数据库一种通用语言,其执行特点是非过程化,即不用指明执行的具体方法和途径,而是简单的调用相应语句来直接取得结果即可。
有些复杂的业务流程又要求相应的程序来描述?
PL/SQL通过增加了用在其它过程性语言(java/python/…)中的结构来对SQL进行了扩展,使得它不仅是一个数据库查询语言,而且也是一个编程语言。
1、PL/SQL基本语法及实例用法:/*PL/SQL语法:******************************************/
declare –申明部分<可选>
begin –执行部分
pl/sql 控制语句;
错误发生异常时执行的动作;
/********************************************************/
declare
begin –程序主题部分
dbms_output.put_line(‘打印结束’);
/********************************************************/
type和%rowtype
type属性
— 例:
declare
type;
— 使用%rowtype属性
— 例:
declare
— v_empRecord将与表EMP有相同的结构。如果表的定义改变了,则记录的类型也随之改变。
/************************************************************/
declare
begin
where empno=7369;
’empno=’||v_empRecord.empno);
‘ename=’||v_empRecord.ename);
‘job=’||v_empRecord.job);
‘sal=’||v_empRecord.sal);
/********************************************************/
2、PL/SQL 循环结构/******************************************************************************/
— 基本循环
语句序列
exit when 布尔表达式为真退出循环;
— while loop循环
while 条件 loop
end loop;
for loop循环
for 计数器v_i in [reveres]低界.1..10.高界
语句序列
/******************************************************************************/
declare
— v_counter scott.dept.deptno%type :=41;
loop
‘loop’);
exit when v_counter>=50;
end loop;
while loop.
declare
type := 51;
while v_cunter<=60 loop
‘while loop’);
end loop;
for loop.
declare
type := 61;
for v_i in v_counter..v_counter+9 loop
‘for loop’);
end;
3、PL/SQL 异常处理/******************************************************************************/
declare
type;
type := 1000;
select sal into v_sal from scott.emp where empno=v_empno;
if v_sal<=2000 then update scott.emp set sal=sal+100 where empno=v_empno;
if;
when no_data_found then –固定用法:no_data_found
‘:不存在’);
then –固定用法:too_many_rows
‘:存在多个,请使用游标’);
then
‘存在其他未知错误’);
/******************************************************************************/
二、游标用游标来指代一个DMLSQL操作返回的结果集。即当一个对数据库的查询操作返回一组结果集时,用游标来标注这组结果集,以后通过对游标的操作来获取结果集中的数据信息。游标(Cursor):用来查询数据库,获取记录集合(结果集)的指针可以让开发者一次访问一行结果集,在每条结果集上作操作。游标的过程:有明确的游标申明和操作过程;操作过程包括游标的申明,打开游标,取值,关闭游标。cursor cursor_name is select_statement(select * from emp); — 定义游标open cursor_name; — 打开游标fetch cursor_name into {variable_list | record_variable}; — 提取游标数据:就是检索结果集合中的数据行,放入指定的输出变量中;对该记录进行处理,直到活动集合中没有记录close cursor_name; –关闭游标,以释放游标所占的系统资源–游标定义实例
declare
v_ename varchar(20);
begin
loop
exit when c_emp%notfound;
‘-‘ || v_ename);
close c_emp;
declare
type;
type;
begin
loop
delete from scott.dept t where t.dname=v_dn and t.deptno <> v_dno;
exit when c_dept%notfound;
close c_dept;
三、存储过程存储过程是一种PL/SQL块,以命名的数据库对象形式存储于数据库当中。
可以传递参数给存储过程;存储过程可以有返回值,也可以没有返回值;存储过程的返回值必须通过参数带回。为什么要写存储过程?1.效率高: 存储过程编译一次后,就会存到数据库,每次调用时都直接执行。2.降低网络流量:存储过程编译好会放在数据库,我们在远程调用时,不会传输大量的字符串类型的sql语句。3.复用性高:存储过程往往是针对一个特定的功能编写的,当再需要完成这个特定的功能时,可以再次调用该存储过程。4.可维护性高:当功能要求发生小的变化时,修改之前的存储过程比较容易,花费精力少。5.安全性高:完成某个特定功能的存储过程一般只有特定的用户可以使用,具有使用身份限制,更安全。语法:– 创建存储过程的语法结构
is | as
local variable declaration>
<executable statement>
<exception handlers>
end [p_name<存储过程名称>];
–创建带参数的存储过程时,有三种模式:in(输入)、out(输出)、in out(输入和输出)
in可以省略不写
–(1)在命令窗口执行
— (2) 用PL/SQL 调用
procedure p_name<存储过程名称>;
–(1)没有参数的时候不需要加括号。即第1条语句不能这样写:
–(2)如果有INSERT,UPDATE,DELETE语句,则一定要有COMMIT语句。
综合案例/*****************************************************************************/
create procedure a_pd
begin
where deptno in(80,81);
‘信息部’);
‘运营部’);
end;
begin
end;
select * from scott.dept;
–创建带参数的存储过程时,有三种模式:in(输入)、out(输出)、in out(输入和输出)
in可以省略不写
–走,案例:根据输入的员工编号,打印员工姓名
–创建包含输入参数的存储过程
in number)–in 可以不写
v_ename varchar(40);
select ename into v_ename from scott.emp where empno=p_empno;
exception
then
‘不存在’);
–调用存储过程
a_pd_1(73690);
— 输出结果:SMITH
–创建包含一个输入参数和一个输出参数的存储过程
in number,ename out varchar)
ename_temp varchar(50);
select ename into ename_temp from scott.emp
where empno=eno;
exception
then
‘未找到!’);
— 调用存储过程的输出参数
declare
begin
dbms_output.put_line(v_a);
/**************************************************************************/
create procedure a_pd_3(x1 in out number,x2 in out number)
v_temp number;
v_temp := x1;
x2 := v_temp;
declare
num2 number := 20;
a_pd_3(num1,num2);
dbms_output.put_line(num2);
/****************************************************************************/
Oracle专题汇总