Oracle Procedure 存储过程语法(二)

2014-11-24 17:55:33 · 作者: · 浏览: 1
_print_ename(id number) is
name emp.ename%type;
begin
select ename into name from emp where empno=id;
dbms_output.put_line('职员姓名:'||name);
end pro_print_ename;
procedure pro_print_sal(id number) is
salary emp.sal%type;
begin
select sal into salary from emp where empno=id;
dbms_output.put_line('职员工资:'||salary);
end pro_print_sal;
function fun_re_date(id number) return date is
bedate emp.hiredate%type;
begin
select hiredate into bedate from emp where empno=id;
return bedate;
end fun_re_date;
end pack_op;


示例8:调用程序包中创建的过程和函数
exec pack_op.pro_print_ename(7900);
exec pack_op.pro_print_sal(7900);
select pack_op.fun_re_date(7900) from dual;


示例9:演示程序包中的游标
创建包规范
create or replace package pack_emp is
cursor cur_emp return emp%rowtype;
procedure pro_cur;
end pack_emp;


创建包主体
create or replace package body pack_emp is
cursor cur_emp return emp%rowtype is
select * from emp;
procedure pro_cur is
rec_emp emp%rowtype;
begin
open cur_emp;
loop
fetch cur_emp into rec_emp;
exit when cur_emp%notfound;
if rec_emp.sal<1000 then
dbms_output.put_line('员工工资:'||rec_emp.sal||',需加倍努力争取提高工资');
elsif rec_emp.sal>=1000 and rec_emp.sal<2000 then
dbms_output.put_line('员工工资:'||rec_emp.sal||',工资一般,争取搞个部门经理做做');
else
dbms_output.put_line('员工工资:'||rec_emp.sal||',工资不错,争取搞个总经理做做');
end if;
end loop;
end pro_cur;
end pack_emp;


调用程序包中的过程以调用程序包中的游标
exec pack_emp.pro_cur;


示例10:存储过程返回游标的子程序包(此程序包返回r_cur游标)
CREATE OR REPLACE package SCOTT.pk_wt
is
type mytype is ref cursor;
procedure p_wt(mycs out mytype);
end;


CREATE OR REPLACE package BODY SCOTT.pk_wt
is
procedure p_wt(mycs out mytype)
is
r_cur mytype;
begin
open r_cur for select * from emp;
mycs:=r_cur;
end p_wt;
end pk_wt;


查询有关过程、函数和程序包的信息:USER_OBJECTS数据字典视图
column object_name format a18
select object_name,object_type from user_objects where object_type in ('PROCEDURE','FUNCTION','PACKAGE','PACKAGE BODY');



注意事项:


1, 存储过程参数不带取值范围,in表示传入(只能位于等号右边),out表示输出(只能位于等号左边),in out表示该类型既能被赋值也能传值;


2, 变量带取值范围,后面接分号


3, 在判断语句前最好先用count(*)函数判断是否存在该条操作记录


4, 用select 。。。into。。。给变量赋值


5, 在代码中抛异常用 raise+异常名


6, 用select时,后面必须接into字段,在游标和循环里面就另当别论了


7,在package里,不能create or replace


8,不写in,out,默认为in