1.包体是一种实现在包中声明函数与过程的数据对象(在包体中实现的函数或者过程必须先在包中声明)
在调用包中的方法或者过程时①控制台中 exec 方案名.包名.过程名(参数...);或者call 方案名.包名 函数名(参数...);(call可以在java中使用)
create package body 包名 is
create procedure 过程名(参数列表...) is
begin
end;
create function 函数名(参数列表... ) return 数据类型
is
begin
end;
end;
2.pl/sql里面定义变量赋初值时要用:=来赋初值.
3.可以用%type来定义变量类型比如为了让v_ename的类型更加灵活,我们使用v_ename emp.ename%type;这样v_ename就根据所在列自动决定数据类型.
4.复合变量(composite)包括pl/sql记录与pl/sql表
复合类型里面的pl/sql记录类似于高级语言中的结构体(引用pl/sql记录成员时需要加记录变量作为前缀)例如:
type 记录名称 is record(
变量1 变量类型,
变量......
)
使用记录的具体代码
create or replace procedure pro1(v_in_empno in number)is
type comp is record(
v_sal emp.sal%type,
v_empno emp.empno%type
);
w_w comp;
begin
select sal,empno into w_w from emp where empno=v_in_empno;
dbms_output.put_line('工资'||w_w.v_sal||'empno'||w_w.v_empno);
end;
5.pl/sql表相当于java中的数组基本语法为
type 自己定义的pl/sql数据类型 is table of 表名.列名%type index by binary_integer;
变量名 自己定义的pl/sql数据类型
6.参照变量
参照变量是用于存放数值指针的变量.通过参照变量可以使应用程序共享相同对象,降低占用空间.编写pl/sql程序时可以用游标变量(ref cursor)和对象类型变量(ref obj_type)两种参照变量类型.
7.游标变量通过游标变量我们可以取出结果集任何一行的数据基本语法:
type 自定义游标名 is ref cursor;
变量名 自定义游标名;
open 游标变量 for select语打开游标句;()
fetch 游标变量into 其他变量;(取出当前游标指向的行)
游标变量%notfound(判断游标是否指向记录最后)
close 游标名(关闭游标)
8.编写一个输入部门号即输出所有符合条件的员工姓名及工资的过程.
create or replace procedure pro2(v_in_deptno in number)
is
type v_cursor is ref cursor;
v_v v_cursor;
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
open v_v for select ename,sal from emp where deptno=v_in_deptno;
loop
exit when v_v%notfound;
fetch v_v into v_ename,v_sal;
dbms_output.put_line('员工'||v_ename||'工资为'||v_sal);
end loop;
close v_v;
end;
(使用游标变量的四个步骤中定义游标变量类型定义游标变量两个步骤是在begin之前,open与fetch两个步骤在begin与end之间完成)
9.注意fetch的用法,判断是否notfound要在fetch与输出之间判断,否则会多输出一次最后一条记录.具体什么原因以后再说吧,现在没有书网上搜不到不想研究了.
10.自己写的例子:(调用时注意前面加exec)
create or replace procedure pro3(v_in_deptno number)
is
type sal_cursor is ref cursor;
v_cursor sal_cursor;
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
open v_cursor for select ename,sal from emp where deptno=v_in_deptno;(注意select语句前面有一个for)
loop
fetch v_cursor into v_ename,v_sal;
exit when v_cursor%notfound;(注意判断是否为notfound位置)
dbms_output.put_line('部门号为'||v_in_deptno||'的部门的员工'||v_ename||'工资为'||v_sal);
end loop;
close v_cursor;(注意关闭游标)
end;