存储过程 存储过程可以有多个或者零个输入输出参数,但通常没有返回值。存储过程是已经编译好的代码,所以执行效率非常高 存储过程创建语句
create [or replace] procedure 存储过程名 [(输入、输出参数、in/out模式参数)] is/as begin sentences; [exception sentences;] end 存储过程名;
举例一个没有参数的存储过程
create or replace procedure pro_no_par is begin update employees set salary=salary+100 where employee_id=100; commit; dbms_output.put_line('工资已经调整!!'); end pro_no_par;
结果:
begin pro_no_par; end; 匿名块已完成 工资已经调整!!
举例一个带in模式参数的存储过程 参数的方式有三种:指定名称传递;按位置传递;混合方式传递 注意混合方式传递从使用【指定名称传递】的位置开始,后面的参数必须使用【指定名称传递】
create or replace procedure pro_in_par ( var_1 in nvarchar2, var_2 in number) is begin update employees set salary=salary+var_2 where first_name=var_1; commit; dbms_output.put_line(var_1||'的工资已经增加了'||var_2||'!'); end pro_in_par;
结果:
begin execute pro_in_par(var_1=>'Steven',var_2=>100); end 匿名块已完成 Steven的工资已经增加了100! begin execute pro_in_par('Steven',var_2=>100); end 匿名块已完成 Steven的工资已经增加了100! pl/sql developer下的调用语法 begin pro_in_par('Steven',100); end --举例混合参数输入,后面的参数没有使用【指定名称传递】 execute pro_in_par(var_1=>'Steven',100); 在行 42 上开始执行命令时出错: execute pro_in_par(var_1=>'Steven',100) 错误报告: ORA-06550: 第 1 行, 第 34 列: PLS-00312: 一个定位相关参数没有说明其相关性 ORA-06550: 第 1 行, 第 7 列: PL/SQL: Statement ignored 06550. 00000 - "line %s, column %s:\n%s" *Cause: Usually a PL/SQL compilation error. *Action:
观察存储过程中变量的使用(存储过程的输入输入参数,字符型不用定义长度,内部的字符型型变量是需要带长度的)
内部的变量不需要用declare,内部变量的定义在as之后,
begin end 之前
--表准备 create table chl_simple(fid int,fname varchar2(200)); --存储过程 create or replace procedure chl_ztablecreate01 (var_fname in varchar2) as var_sql varchar2(200); begin var_sql:=var_fname; insert into chl_simple(fid,fname) values(1,var_sql); end; --存过程调用 begin chl_ztablecreate01('12345'); end;举例一个带out模式和in out模式参数存储过程
create procedure pro_out_par ( var_1 in out number, var_2 out employees.first_name%type, var_3 out employees.phone_number%type) is begin select first_name,phone_number into var_2,var_3 from employees where employee_id=var_1; end pro_out_par; --执行 declare ex_var_1 number; ex_var_2 employees.first_name%type; ex_var_3 employees.phone_number%type; begin ex_var_1:=102; pro_out_par(ex_var_1,ex_var_2,ex_var_3); dbms_output.put_line('员工号为'||ex_var_1||'的员工姓名是;'||ex_var_2||',联系电话是:'||ex_var_3); end;结果;
匿名块已完成 员工号为102的员工姓名是;Lex,联系电话是:515.123.4569只有努力不会背叛 博文仅供参考,欢迎大家来访。如有错误之处,希望批评指正。