以下代码是在PLSQL Developer 6.0环境中运行的。为了方便,我们使用 scott/tiget登陆PL/SQL,然后拷贝好样例表: 生成emp_copy表: create table emp_copy as select * from emp; 生成dept_copy表: create table dept_copy as select * from dept;
下面我们可以来进行学习了:
1. 子程序 a. 创建过程:
/**//*建立一个存储过程find_emp,or replace表示可以覆盖重新建立这个存储过程,(emp_no)是该存储过程的参数*/ createorreplaceprocedure find_emp(emp_no number) /**//*默认的in类型参数,表示是传入的参数*/ as empname varchar(20);/**//*声明一个变量用来存储员工姓名*/ begin select ename into empname from emp_copy where empno=emp_no; /**//*将传入的参数值作为查询条件*/ dbms_output.put_line('雇员姓名是 '|| empname); exception when no_data_found then dbms_output.put_line('雇员编号没有找到'); end find_emp; /**//*find_emp过程结束*/ /
执行方式: SQL> set serveroutput on; SQL> execute find_emp(7900); 雇员姓名是 JAMES
PL/SQL procedure successfully completed
SQL>
b. 创建带IN和OUT参数的过程
createorreplaceprocedure itemdesc(item_code INnumber,t_sal out varchar2) /**//*带一个传入参数,一个输出参数*/ as sals number; begin select sal into sals from emp_copy where empno=item_code; /**//*条件是输入参数*/ if sals>2000then t_sal :='工资普通'; elsif sals>4000then t_sal :='工资偏高'; else t_sal :='工资偏低'; endif; end; /
c. 函数:与过程类似,区别是函数必须有返回值,过程不一定有返回值。而函数主要是为了实现某一些功能,而过程主要用来操作数据的。
/**//*创建一个有业务功能的函数*/ createorreplacefunction emp_sals(sals number) /**//*参数是待检查的员工工资*/ returnvarchar2/**//*返回的值是varchar2类型*/ as min_sal number; /**//*申明两个变量*/ max_sal number; begin selectmax(sal),min(sal) into max_sal,min_sal from emp_copy; /**//*给两个变量赋值*/ if sals>=min_sal and sals<max_sal then return'输入的工资数在员工合理范围内'; else return'输入的工资不合理'; endif; end; /
调用函数: SQL> set serveroutput on; SQL> select emp_sals(4000) from dual;
/**//*程序包规范代码 其实就是程序包声明,先声明程序包内包括了一些什么子程序*/ set serveroutput on; createorreplace package pack_test /**//*创建pack_test程序包*/ is procedure prod_emp(eno number); /**//*包括一个过程*/ function func_emp(sals number) returnvarchar2; /**//*包括一个函数*/ end pack_test; /
/**//*程序包主体*/ set serveroutput on; createorreplace package body pack_test as /**//*过程的主体*/ procedure prod_emp(eno number) is names varchar2(50); begin select ename into names from emp_copy where empno=eno; dbms_output.put_line('员工姓名:'|| names); end prod_emp; /**//*函数的主体*/ function func_emp(sals number) returnvarchar2 is min_sal number; /**//*申明两个变量*/ max_sal number; begin selectmax(sal),min(sal) into max_sal,min_sal from emp_copy; /**//*给两个变量赋值*/ if sals>=min_sal and sals<max_sal then return'输入的工资数在员工合理范围内'; else return'输入的工资不合理'; endif; end func_emp; end pack_test; /