【问题标题】:SELECT Data FROM CURSOR of PACKAGE, print itSELECT Data FROM CURSOR of PACKAGE,打印
【发布时间】:2013-08-04 20:07:56
【问题描述】:

我想打印Cursor_pkg.c1.row_emp 的数据,例如:Cursor_pkg.c1.row_emp.last_nameCursor_pkg_func.Print_Cur 程序有效后将存在于Cursor_pkg.row_emp 中。我该怎么做?

  1. 我用 cursor 和 rec 创建 PACKAGE
  2. 我使用在 rec 中获取游标数据的过程创建 PACKAGE
  3. 我想输出获取的数据。怎么样?

有两个问题:我想从包emp_rec(行)输出数据,我想直接从包Cursor_pkg_func程序输出 附言主要思想是存储数据和用于获取和选择数据的过程/函数

 CREATE OR REPLACE PACKAGE Cursor_pkg AUTHID DEFINER IS
        CURSOR C1 IS
            SELECT last_name, job_id FROM employees
            WHERE job_id LIKE '%CLERK%' AND manager_id > 120
            ORDER BY last_name;
        row_emp C1%ROWTYPE;     
    END Cursor_pkg;
    /

CREATE OR REPLACE PACKAGE Cursor_pkg_func IS
PROCEDURE Print_Cur;
END Cursor_pkg_func;
/

CREATE OR REPLACE PACKAGE BODY Cursor_pkg_func IS
    PROCEDURE Print_Cur IS
    BEGIN
        OPEN Cursor_pkg.C1;
        LOOP
            FETCH Cursor_pkg.C1 INTO Cursor_pkg.row_emp;
            EXIT when Cursor_pkg.C1%NOTFOUND;
            DBMS_OUTPUT.put_line(Cursor_pkg.row_emp.last_name);
        END LOOP;
        CLOSE Cursor_pkg.C1;
     END;
END;
/

BEGIN 
Cursor_pkg_func.Print_Cur;
END;

但我想在没有创建函数的情况下从 Cursor_pkg.row_emp PACKAGE 中选择和打印。 以及如何不仅打印 last_name 还打印所有行? 错误开始于:最后三个语句有什么问题?

CREATE OR REPLACE PACKAGE Cursor_pkg_func IS
TYPE outrec_typ IS RECORD (
    var_char2  VARCHAR2(30)
  );
  TYPE outrecset IS TABLE OF outrec_typ;
  FUNCTION f_trans (p in number ) RETURN outrecset PIPELINED;
END Cursor_pkg_func;
/

CREATE OR REPLACE PACKAGE BODY Cursor_pkg_func IS
    FUNCTION f_trans (p in number) RETURN outrecset PIPELINED IS
    out_rec outrec_typ;
    BEGIN
        OPEN Cursor_pkg.C1;
        LOOP
            FETCH Cursor_pkg.C1 INTO Cursor_pkg.row_emp;
            EXIT when Cursor_pkg.C1%NOTFOUND;
        END LOOP;
        LOOP
        out_rec.var_char2 := Cursor_pkg.row_emp.last_name;
        PIPE ROW(out_rec);
        DBMS_OUTPUT.put_line(out_rec.var_char2);
        END LOOP;
        CLOSE Cursor_pkg.C1;
     RETURN;
     END f_trans;
END Cursor_pkg_func;
/

begin
Cursor_pkg_func.f_trans(5);
end;
/

【问题讨论】:

  • 您遇到错误了吗?或者您面临的问题是什么?
  • 您应该调查 DBMS_OUTPUT 和 UTL_FILE 包。分享和享受。
  • 输出到哪里?你已经有dbms_output,所以你只需要set serveroutput on,如果你的客户支持吗?或者您想返回一个您的客户端可以处理的引用游标(包括仅在 SQL*Plus 中打印)?
  • SET SERVEROUTPUT ON 始终开启 :)
  • 我从不使用 UTL_FILE 因为我不知道

标签: sql oracle select fetch database


【解决方案1】:

你已经定义了一个流水线函数,这不是调用它的方式:

SQL> begin
  2  Cursor_pkg_func.f_trans(5);
  3  end;
  4  /
Cursor_pkg_func.f_trans(5);
*
ERROR at line 2:
ORA-06550: line 2, column 1:
PLS-00221: 'F_TRANS' is not a procedure or is undefined
ORA-06550: line 2, column 1:
PL/SQL: Statement ignored


SQL> 

您需要使用 TABLE() 函数。虽然这样您会发现代码中的错误:

SQL>  select * from table(Cursor_pkg_func.f_trans(5))
  2   /

SMITH
SMITH
SMITH
''''
SMITH
SMITH
SMITH
SMITH
ERROR:
ORA-00028: your session has been killed



273660 rows selected.

SQL> 

请注意,我必须从另一个会话中终止该会话,否则它仍会运行。所以让我们简化函数并摆脱那个毫无意义的第二个循环......

CREATE OR REPLACE PACKAGE BODY Cursor_pkg_func IS
    FUNCTION f_trans (p in number) RETURN outrecset PIPELINED IS
    out_rec outrec_typ;
    BEGIN
        OPEN Cursor_pkg.C1;
        LOOP
            FETCH Cursor_pkg.C1 INTO Cursor_pkg.row_emp;
            EXIT when Cursor_pkg.C1%NOTFOUND;
            out_rec.var_char2 := Cursor_pkg.row_emp.last_name;
            PIPE ROW(out_rec);
        END LOOP;
        CLOSE Cursor_pkg.C1;
     RETURN;
     END f_trans;
END Cursor_pkg_func;
/

....然后看!

SQL> select * from table(Cursor_pkg_func.f_trans(5))
  2  /

VAR_CHAR2
------------------------------
ADAMS
JAMES
MILLER
SMITH

SQL> 

“当我添加开始和结束时;选择不起作用”

您已经创建了一个流水线函数。你为什么这么做?你应该这样做的原因是你想要一个可以在 SELECT 语句的 FROM 子句中使用的 PL/SQL 函数。这就是流水线函数的用例。所以将调用放入匿名 PL/SQL 块中确实没有意义。

但无论如何。

请阅读文档。它非常全面,在线且免费。 PL/SQL Reference 中的相关部分是关于静态 SQL 的章节。很明显,PL/SQL 中的 SELECT 语句必须始终将记录提取到某个描述的变量中。在这方面,匿名 PL/SQL 块与存储过程相同。 Find out more

【讨论】:

  • 感谢 APC,我的问题是因为我尝试边做边学。还有很多要学习的,但非常感谢。
  • 在您发现错误之前,我将其重新制作为 CREATE OR REPLACE PACKAGE BODY Cursor_pkg_func IS FUNCTION f_trans (p in number) RETURN outrecset PIPELINED IS out_rec outrec_typ;开始打开 ​​Cursor_pkg.C1; LOOP FETCH Cursor_pkg.C1 INTO Cursor_pkg.row_emp;当 Cursor_pkg.C1%NOTFOUND 时退出; out_rec.var_char2 := Cursor_pkg.row_emp.last_name;管道行(out_rec); DBMS_OUTPUT.put_line(out_rec.var_char2);结束循环;关闭 Cursor_pkg.C1;返回;结束 f_trans; END Cursor_pkg_func; /
  • BEGIN select * from table(Cursor_pkg_func.f_trans(5)) END; /当我添加开始和结束时;选择不工作
猜你喜欢
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
  • 1970-01-01
  • 2011-12-06
相关资源
最近更新 更多