Oracle复习笔记(七)
yfun1('KING');
dbms_output.put_line('EMPNO:' || empno);
end;
六、复合类型
记录(record):
--根据编号查询员工姓名和薪水(复合类型――记录)
create or replace procedure myproc2(e_empno number)
is
type record_type is record(v_ename emp.ename%type,v_sal emp.sal%type);
ename_sal_recode record_type;
begin
select ename,sal into ename_sal_recode from emp where empno = e_empno;
dbms_output.put_line('ENAME,SAL:' || ename_sal_recode.v_ename || ' ' || ename_sal_recode.v_sal);
end;
表(table):
--根据员工姓名查询该员工上级(复合类型――表)
create or replace procedure myproc3(e_ename varchar2)
is
type emp_table_type is table of emp.ename%type index by binary_integer;
emp_table emp_table_type;
begin
select e2.ename into emp_table(0) from emp e1,emp e2 where e2.empno = e1.mgr and e1.ename = upper(e_ename);
dbms_output.put_line('MGR:' || emp_table(0));
exception when no_data_found then
dbms_output.put_line('该员工不存在或没有上级!');
end;
--取出emp表所有员工姓名(复合类型――表)
create or replace procedure myproc4
as
type emp_table_type is table of emp.ename%type index by binary_integer;
emp_table emp_table_type;
num number;
begin
select count(*) into num from emp;
dbms_output.put_line('EMP TABLE ALL ENAME:');
for i in 1..num loop
select e2.ename into emp_table(i) from (select rownum rn,e1.* from (select * from emp order by empno) e1) e2 where e2.rn = i;
dbms_output.put_line(emp_table(i));
end loop;
end;
七、程序包:用于封装子程序、游标、变量等对象
1、组成
1)包规范 package
用于声明公共成员和子程序规范(定义接口)
2)包主体 package body
用于声明私有成员和实现子程序(定义类实现接口)
--包规范
create or replace package mypack1
is
procedure test1;
procedure test2;
end;
--包主体
create or replace package body mypack1
is
--test1
procedure test1
is
begin
db
ms_output.put_line('my is test1');
end;
--test2
procedure test2
is
begin
test1();
dbms_output.put_line('my is test2');
end;
end;
begin
mypack1.test2();
end;
/*----------------------------------------动态sql----------------------------------------*/
注:execute immediate sql执行结果只能取出单行单列或多列,如多行必须使用游标
--根据员工姓名查询薪水
declare
type my_record_type is record(e varchar2(20),s number);
strSql varchar2(100);
my_record my_record_type;
begin
strSql := 'select ename,sal from emp where ename = ''KING''';
execute immediate strSql into my_record;
dbms_output.put_line(my_record.e || ' ' || my_record.s);
end;
/*----------------------------------------分页存储过程----------------------------------------*/
--定义包
create or replace package pagePack as
type pageCursorType is ref cursor; --游标类型
procedure pageProc(
tableName varchar2, --表名
showField varchar2, --查询字段
whereText varchar2, --查询条件
orderText varchar2, --排序字段[asc] || [desc]
pageIndex number, --当前页码
pageSize number, --每页显示几条
counter out number, --总记录数
pageCount out number, --总页数
pageCursor out pageCursorType --结果集
);
end pagePack;
--实现包体
create or replace package body pagePack as
procedure pageProc(
tableName varchar2, --表名
showField varchar2, --查询字段
whereText varchar2, --查询条件
orderText varchar2, --排序字段[asc] || [desc]
pageIndex number, --当前页码
pageSize number, --每页显示几条
counter out number, --总记录数
pageCount out number, --总页数
pageCursor out pageCursorType --结果集
)
as
strSql varchar2(500);
wText varchar2(100);
oText varchar2(100);
begin
--判断是否有where条件
if whereText is not n