oracle 子程序

存储过程:特定操作
函数:特定功能,返回特定的值

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;

猜你喜欢

转载自inotgaoshou.iteye.com/blog/1416295