--23.编写一个存储过程,传入一个部门编号,并返回一个参数(只有一个in模式,一个out模式),返回值包含该部门的所有员工编号、员工姓名、工作三列信息:
create or replace procedure q11 (
dn in number,
emp_cursor out sys_refcursor
) is
begin
open emp_cursor for --为目标查询开启游标
select empno, ename, sal
from emp
where deptno = dn;
end;
declare
emp_cursor sys_refcursor;
v_empno emp.empno%type;
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
q11(10, emp_cursor);
loop
fetch emp_cursor into v_empno, v_ename, v_sal;
exit when emp_cursor%notfound;
dbms_output.put_line(v_empno || ' ' || v_ename || ' ' || v_sal);
end loop;
close emp_cursor;
end;
--24.写出一个分页的存储过程:
/*
定义如下:
tablepager(tablename,pagesize,curpage)
调用:
tablePager('EMP',10,2)
例如:每页显示10条,查询emp表中第2页的数据,那么第2页就是 11-20条。
*/
CREATE OR REPLACE PROCEDURE tablepager (
table_name IN VARCHAR2, -- 表名
page_size IN NUMBER, -- 每页记录数
cur_page IN NUMBER -- 当前页码
)
IS
v_sql VARCHAR2(4000);
v_start_row NUMBER;
v_end_row NUMBER;
TYPE cursor_ref IS REF CURSOR;
my_cursor cursor_ref;
-- Declare a record type that matches the structure of the table
v_record SYS_REFCURSOR;
v_empno EMP.EMPNO%TYPE;
v_ename EMP.ENAME%TYPE;
v_sal EMP.SAL%TYPE;
BEGIN
-- 计算分页的起始和结束行号
v_start_row := page_size * (cur_page - 1) + 1;
v_end_row := page_size * cur_page;
-- 构建动态 SQL 语句
v_sql := 'SELECT empno, ename, sal FROM (
SELECT a.*, ROWNUM rnum FROM (
SELECT * FROM ' || table_name || '
) a
WHERE ROWNUM <= :end_row
)
WHERE rnum >= :start_row';
OPEN my_cursor FOR v_sql USING v_end_row, v_start_row;
LOOP
FETCH my_cursor INTO v_empno, v_ename, v_sal;
EXIT WHEN my_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_empno || ', ' || v_ename || ', ' || v_sal);
END LOOP;
CLOSE my_cursor;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
begin
tablepager('emp',10,2);
end;
select a.*,rownum from (select * from emp) a