过程
创建过程:
(参数名 in / out type,
参数名 in / out type, ...
) is
begin
end 过程名; 参数中IN是表示输入,out表示输出
举例子:
create or replace procedure pro_1( a invarchar2,b out varchar2)
is
str varchar2(100);
begin
str:='Your input is '||a;
b:=str;
dbms_output.put_line(b);
end;
调用过程
上面的函数可以这样使用:EXECUTE pro_1('S',b);
删除过程
修改过程
过程的参数类型以及传递
函数
语法如下: create or replace function function_name
(
参数名 [方式1] 数据类型1,
参数名2 [方式2] 数据类型2, ........
)
return 函数要返回的值
is|as
begin
end;
注意事项: 如果表达式类型与定义不相同的时候,白哦大师可以被转换成函数定义子句return中指定的类型。同时,控制将立即返回调用环境。
执行
var v1 varchar2(100)
exec :v1:=function_name
也可以在程序中调用函数
declare
m number;
f number;
begin
m:=count('m');
end;
删除函数:
create or replace function get_sal(empnamein varchar2) return number is
Result number;
begin
select sal into Result from emp where ename=empname;
return(Result);
end get_sal;
执行:
SQL> var sal number
SQL> exec :sal:=get_sal('scott');
程序包
用于将逻辑相关的pl/sql块或(变量、常量、自定义数据类型、异常、过程、函数、游标)等组织在一起,作为一个完整的单元存储在数据库中,来标识成程序包。类似于java中的类。其中变量相当于类中的成员变量,过程和函数相当于类的方法
基本原理
程序包有两个部分,一个是说明部分和包体部分,这两个部分都独立的存储在数据字典中。
说明部分是包与应用程序之间的接口,只是过程,函数,游标等名称或者首部。
包体才是这些过程、函数、游标的具体实现。
一般处理方法是:先独立的进行过程和函数的编写,待较为完善后,再逐渐按照逻辑相关性进行打包。
应该尽可能的减少说明部分。因为对包体的更新不会导致重新编译包的应用程序。而对说明部分的更新则需要重新编译每个调用包的应用程序。
创建包
1、包说明部分:
他是对包内所有的不见进行一个简单的说明,每个部件可以被外界应用程序访问,其中的过程,函数,变量,常量游标都是公共的。
创建格式:
create package 包名
is
变量,常量,以及数据类型定义;
游标定义头部;
函数、过程的定义和参数列表以及返回类型;
end 包名;
举个例子:
CREATE OR REPLACE
package p_stu
as
--定义结构体
type re_stu is record(
rname student.name%type,
rage student.age%type
);
--定义游标
type c_stu is ref cursor;
--定义函数
function numAdd(num1 number,num2 number)return number;
--定义过程
procedure GetStuList(cid in varchar2,c_st out c_stu);
end;
包体部分:
create package body 包名
as
游标、函数、过程的具体定义;
end 包名;
举个例子:
CREATE package body p_stu
as
--游标和结构体,包规范中已声明,包体中不用再声明,直接使用。
--实现方法
function numAdd(num1 number,num2 number)return number
as
num number;
begin
num:=num1+num2;
return num;
end;
--实现过程
procedure GetStuList(cid varchar2,c_st out c_stu)
as
r_stu re_stu; --直接使用包规范中的结构
begin
open c_st for select name,age from student where classid=cid;
-- 如果已经在过程中遍历了游标,在使用这个过程的块中,将没有值。
-- loop
-- fetch c_st into r_stu;
-- exit when c_st%notfound;
-- dbms_output.put_line('姓名='||r_stu.rname);
-- end loop;
end;
end;
调用包:
方式:包名.变量名(常量名)【游标名】【函数名】【过程名】
举个例子:
SQL> var sal number
SQL> exec :sal:=my_package.F_count_num('M');
删除包
drop package 包名
create or replace package 已存在的包名