存储过程:特定操作 函数:特定功能,返回特定的值 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;