子程序
PL/SQL命名程序块的定义在PL/SQL程序块的声明部分,用户称之为子程序。
子程序=过程+函数
存储过程(命名的PL/SQL块,相当于JAVA里面的方法)
创建存储过程的语法:
create [ or replace] procedure<procedure_name>
(<arg1 [mode] datatype>,…………)
is|as
[declaration]
begin
[exception]
end[procedure_name];
三种调用方式
第一种 通用
call proc1();
第二种 pl/sql sql 窗口
begin
proc1();
end;
第三种
exec proc1(); sql命令提示符
传参。in(输入 default) out(输出) in out(输入输出)
数据类型不能申明长度。
举例
--第一个
create or replace procedure proc1
as
begin
dbms_output.put_line('hello!');
end;
--调用
call proc1();
begin
proc1();
end;
exec proc1();
-- in 传值: 传入的是一个常量
create or replace procedure proc1(a in number,b varchar, c varchar)
as
begin
a:=11;
insert into dept values(a,b,c);
commit;
end;
-- out 输出: 输入的值被忽略
create or replace procedure proc2(a number,b out number)
as
v emp.sal%type;
begin
select sal into v from emp where empno=a;
b:=v;
end;
declare
b number(7,2);
begin
b:=10;
proc2(7369,b);
dbms_output.put_line('工资:'||b);
end;
-- in out 传引用,传的是对象本身,
create or replace procedure proc3(a in out integer ,b in out integer)
as
temp int;
begin
temp:=a;
a:=b;
b:=temp;
end;
declare
a int;
b int;
begin
a:=10;
b:=20;
dbms_output.put_line('传入前a: '||a);
dbms_output.put_line('传入前b: '||b);
proc3(a,b);
dbms_output.put_line('传入后a: '||a);
dbms_output.put_line('传入后b: '||b);
end;
select * from emp;
--函数 function
-- 语法,一定两个return
create or replace function fun1(a int) return int
as
v emp.sal%type;
begin
select sal into v from emp where empno=a;
return v;
end;
select fun1(7369) from dual;
总结:
函数与过程不同
返回不同: 过程 可以返回,可以不返回,可以返回多个
函数,一定要返回一个
调用方式不同: 过程 单独调用 java CallableStateMent接口
函数 写在SQL里面 java PrereparedStateMent接口
程序包
程序包是对相关类型、变量、常量、游标、异常、过程和函数的封装。
由包规范和包主体两部分组成
--包头: 对外声明作用,对外是可见的,声明我这个包里有什么东西
create or replace package pack1
as
procedure proc1(a number,b out number);
function fun1(a number) return number;
end;
--包体 对外是不可观的黑盒,实现包头的声明
create or replace package body pack1
is
procedure proc1(a number,b out number)
as
begin
select sal into b from emp where empno=a;
end proc1;
function fun1(a number) return number
as
v number(7,2);
begin
select sal into v from emp where empno=a;
return v;
end fun1;
end pack1;
--调用
declare
a int;
b number(7,2);
begin
a:=&工号;
pack1.proc1(a,b);
dbms_output.put_line('工资:'||b);
select fun1(a) into b from dual;
dbms_output.put_line('工资:'||b);
end;
select pack1.fun1(7369),sal from emp;