2024.07.12 oracle存储过程练习

--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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值