pl / sql查询,它将来自emp的deptno作为输入并返回ename,sal来自dept表的所有列

时间:2014-11-17 08:03:47

标签: oracle stored-procedures procedures cursors rowtype

任何人都可以帮我解决这个问题。

我需要编写一个pl / sql查询,它将来自emp的deptno作为输入并返回ename,sal以及dept表中的所有列。(我不想单独声明列,而是我想使用%行类型)。

我已经尝试过几种方式。其中一个在下面提到。 创造 -

    CREATE OR REPLACE PROCEDURE PROC01(
       DNO EMP.DEPTNO%TYPE, 
       REC OUT DEPT%ROWTYPE, 
       NAME OUT EMP.ENAME%TYPE, 
       SAL OUT EMP.SAL%TYPE
       , MY_CURSOR OUT SYS_REFCURSOR)
    IS 
    BEGIN
        OPEN MY_CURSOR FOR 
             SELECT D.*, ENAME, SAL  
             FROM EMP, DEPT D 
             WHERE EMP.DEPTNO = D.DEPTNO 
            AND D.DEPTNO = DNO;
    END PROC01;
    /

--Declare & Execution
    DECLARE
      REC DEPT%ROWTYPE;
      NAME EMP.ENAME%TYPE;
      SAL EMP.SAL%TYPE;
      MY_CURSOR SYS_REFCURSOR;
    BEGIN
      PROC01(&DNO,REC, NAME, SAL, MY_CURSOR);
      LOOP
        FETCH MY_CURSOR INTO REC, NAME, SAL;
        EXIT WHEN MY_CURSOR%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(REC.DNAME||'  '||NAME||'  '||SAL);
      END LOOP;
      CLOSE MY_CURSOR;
    END;
    /

错误: - INTO列表中的表达式“REC”类型错误 提前谢谢......

1 个答案:

答案 0 :(得分:0)

错误是因为oracle无法同时在rec类型和普通类型中获取游标。 我改变了你的查询,它现在正在运作!

程序:

CREATE OR REPLACE PROCEDURE PROC01(DNO IN emp.deptno%TYPE,
                                         /*REC OUT DEPT%ROWTYPE,
                                         NAME OUT EMP.ENAME%TYPE,
                                         SAL OUT EMP.SAL%TYPE,*/
                                         MY_CURSOR OUT SYS_REFCURSOR) IS
BEGIN
  OPEN MY_CURSOR FOR
    SELECT D.*, ENAME, SAL
      FROM EMP, DEPT D
     WHERE EMP.DEPTNO = D.DEPTNO
       AND D.DEPTNO = DNO;
END PROC01;

测试代码:

DECLARE
  REC       DEPT%ROWTYPE;
  DEPTNO    DEPT.deptno%TYPE;
  DNAME     DEPT.dname%TYPE;
  LOC       DEPT.loc%TYPE;
  NAME      EMP.ENAME%TYPE;
  SAL       EMP.SAL%TYPE;
  MY_CURSOR SYS_REFCURSOR;
BEGIN
  PROC01(&DNO, /*REC, NAME, SAL,*/ MY_CURSOR);
  LOOP
    FETCH MY_CURSOR
      INTO /*REC*/ DEPTNO, DNAME, LOC, NAME, SAL;
    EXIT WHEN MY_CURSOR%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE( /*REC.*/ DNAME || '  ' || NAME || '  ' || SAL);
  END LOOP;
  CLOSE MY_CURSOR;
END;