Oracle pl/sql查询,它以emp中的deptno作为输入,并返回dept表中的ename、sal所有列

Oracle pl/sql查询,它以emp中的deptno作为输入,并返回dept表中的ename、sal所有列,oracle,stored-procedures,procedures,cursors,rowtype,Oracle,Stored Procedures,Procedures,Cursors,Rowtype,谁能帮我解决这个问题 我需要编写一个pl/sql查询,该查询将emp中的deptno作为输入,并返回ename、sal以及dept表中的所有列。我不想单独声明这些列,而是希望使用%rowtype 我试过几种方法。下面提到其中之一。 创作- CREATE OR REPLACE PROCEDURE PROC01( DNO EMP.DEPTNO%TYPE, REC OUT DEPT%ROWTYPE, NAME OUT EMP.ENAME%TYPE,

谁能帮我解决这个问题

我需要编写一个pl/sql查询,该查询将emp中的deptno作为输入,并返回ename、sal以及dept表中的所有列。我不想单独声明这些列,而是希望使用%rowtype

我试过几种方法。下面提到其中之一。 创作-

    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”类型错误
提前感谢…

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

程序:

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;

那么,您在使用这种方法时遇到的问题是什么呢?非常感谢Ramin提供的解决方案。但是,如果dept表有20列,我必须打印所有列而不声明每个列,那么该怎么办呢?您必须为所有20列创建一个行类型,然后在一个行类型中获取它。关键是不能同时使用行类型和普通类型。下面是创建类型的示例:创建或替换类型full\u mailing\u address\u type为OBJECT Street VARCHAR280、City VARCHAR280、State CHAR2、Zip VARCHAR210;我们可以使用2种行类型吗??我的意思是REC dept%rowtype,REC emp%rowtype在程序创建中??并像declare REC DEPT%ROWTYPE一样声明它们;REC1 EMP%行类型;我的光标系统参考光标;把我的光标移到rec,rec1不,我不这么认为。