存储过程:特定操作
函数:特定功能,返回特定的值
create or replace procedure proc_name
arg1 mode datetype,
arg2 mode datetype,
is/as
pl/sql
create or repalce procedure test1
is
begin
dbms_output.put_line('this is my first procedure.');
end;
exec test1
SQL>set serveroutput on;
call test1();
ctrl+tab切换
create or replace procedure test2
(
a in number,
b in varchar2
)
is
begin
dbms_output.put_line(a);
dbms_output.put_line(b);
end;
exec test2(1,'aaa');
调用按参数的位置或名称
exec test(a=>22,b=>'bbb');
create or replace procedure add_proc
(
x in number,
y in number,
z out number
)
as
begin
z:=x+y;
end;
var z varchar2(10);
exec add_proc(2,5,:z);
print z;
create or replace procedure test4
(
a in out number,
b in out number
)
as
a:=100;
b:=200;
begin
exec test4()
exec :n1:=1000;
exec :n2:=2000;
end;
查看存储过程内容
select text from user_source where name=upper('test4');
select text from all_source where owner='scott';
spool c:\aaa.sql;
spool off;
create or replace procedure test6
(
a number,
b number
)
is
begin
update myemp set sal=+sal+b where empno=a;
end;
show error procedure test6;
select text from user_errors where name='test6'
create or replace procedure test7(
v1 in varchar2,
v2 out number
)
is
vsal number;
begin
select sal into vsal emp where ename=v1;
if vsal>2000 then
v2:=100;
end if;
end;
declare
value1 varchar(10):='SMITH';
value2 number;
begin
test7(value1,value2);
dbms_output.put_line(values);
end;
create or replace procedure test8
as
value1 varchar(10):='KING';
value2 number;
begin
test7(value1,value2);
dbms_output.put_line(value2);
end;
删除存储
drop procedure test4
函数
create or replace function functionname
(
arg1 in|out|in out type [default value],
arg2
)
return type
is | as
begin
end;
create or replace function getempsal(p_empno number)
return number
as
vsal emp.sal%type;
begin
select sal into vsal from emp where empno=p_empno
return sval;
select getempsal(7369) from dual;
declare
sal emp.sal%type;
begin
sal:=getempsal(7369);
dbms_output.put_line(sal);
end;
create or replace function getdeptname(empname varchar2)
return varchar2
as
v_dname dept.dname%type;
begin
select dname into v_dname from dept where deptno=(select deptno from emp where ename=empname);
return v_dname;
exception
when ...then;
end;
包 package
包头(包规范)类似java的interface
包体
create or replace package packagename
as | is
create or replace package body packagename
is | as
begin
end;
--包头
create or repalce package pkg_1
as
procedure p_test;
function f_test return varchar2;
end;
--包体
create or replace package body pkg_1
as
procedure p_test
is
begin
dbms_output.put_line('hello world');
end;
function t_test
return varchar2
is
begin
return 'Hello world!';
end;
end;
--执行
select pkg_1.f_test from dual;
--包头
create or repalce package pkg_1
as
procedure p_test;
function t_test2(p_deptno in number,
p_code out number,
p_desc out varchar2 )
return number;
end;
--包体
create or replace package body pkg_2
as
procedure p_test
is
begin
dbms_output.put_line('hello world');
end;
function t_test2(p_deptno in number,
p_code out number,
p_desc out varchar2 )
return number,
as
v_emp emp%rowtype;
type cur_type is ref cursor;
cur_emp cur_type;
begin
open cur_emp for 'select * from emp where deptno:=a' using p_deptno;
loop
fetch cur_emp into v_emp;
exit when cur_emp%notfound;
dbms_output.put_line(v_emp.ename);
end loop;
close cur_emp;
p_close:=sqlcode;
p_desc:=substr(sqlerrm,1,100);
return 0;
end;
exception
when others then
p_code:=sqlcode;
p_desc:=substr(sqlerrm,1,100);
reuturn -1;
end f_test2;
--测试
declare
v_return number;
v_code number;
v_desc varchar2(100);
begin
v_return :=pkg_2.f_test2(10,v_code,v_desc);
if v_return = 0 then
dbms_output.put_line('the function is correct!');
dbms_output.put_line(v_code);
dbms_output.put_line(v_desc);
else
dbms_output.put_line('the function is error!');
end if;
end;
end pck_2;
--执行
select pkg_1.f_test from dual;
纯度级别
purity level
create or replace package purity is
v1 number(9,2);
v2 number(9,2);
funciton ...
funcstion...
pragma restrict_references(v1,WNPS);
end;