【问题标题】:pl/sql query which takes deptno from emp as input and return ename, sal all the columns from dept tablepl/sql 查询,它将 emp 中的 deptno 作为输入并返回 ename,sal 表中的所有列
【发布时间】:2015-01-14 02:10:48
【问题描述】:

谁能帮我解决这个问题。

我需要编写一个 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”类型错误 提前谢谢...

【问题讨论】:

  • 那么您在使用这种方法时遇到了什么问题?

标签: oracle stored-procedures procedures cursors rowtype


【解决方案1】:

这个错误是因为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;

【讨论】:

  • 非常感谢 Ramin 的解决方案。但是如果 dept 表有 20 列,我必须打印所有列而不声明每一列。
  • 您必须为所有 20 列创建一个 ROW TYPE,然后在一个 ROW TYPE 中获取它。关键是你不能同时使用 ROW TYPE 和普通类型。这是创建类型的示例:CREATE OR REPLACE TYPE full_mailing_address_type AS OBJECT ( Street VARCHAR2(80), City VARCHAR2(80), State CHAR(2), Zip VARCHAR2(10) );
  • 我们可以使用 2 行类型吗?我的意思是 REC dept%rowtype, REC emp%rowtype 在过程创建?并将它们声明为 DECLARE REC DEPT%ROWTYPE; REC1 EMP%ROWTYPE; my_cursor sys_refcursor;并将 my_cursor 获取到 rec, rec1
  • 不,我不这么认为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-01
  • 2017-03-24
相关资源
最近更新 更多