2013-08-03 78 views
0

我想要打印Cursor_pkg.c1.row_emp的数据,例如:将在Cursor_pkg_func.Print_Cur程序工作后存在的Cursor_pkg.c1.row_emp.last_name。我该怎么做?从包装的游标中选择数据,打印它

  1. 我创建的软件包光标和REC
  2. 我创建的程序包中取出REC
  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打印照片,无需创建功能。 以及如何打印不仅姓氏,但所有行? 错误开始于:最后三条语句有什么问题?

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; 
/
+2

您是否收到错误?或者你面临的问题是什么? –

+0

您应该调查DBMS_OUTPUT和UTL_FILE包。分享并享受。 –

+0

输出到哪里?你已经有'dbms_output'了,所以你只需要'设置serveroutput',如果你的客户端支持这个'还是要返回客户端可以处理的引用游标(包括仅在SQL * Plus中打印)? –

回答

2

您已经定义了一个管道函数,这是不是调用的方式:

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> 

你需要使用一个表()函数。虽然那么你会发现这个bug在你的代码:

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参考中的相关部分是关于静态SQL的章节。它清楚地表明,PL/SQL中的SELECT语句必须将总是取记录到某个描述的变量中。在这方面,匿名PL/SQL块与存储过程相同。 Find out more

+0

谢谢APC,我的问题是因为我试图通过做。还有很多要学习,但非常感谢。 – ifooi

+0

在您发现错误之前,我将其重新创建为创建或更换包装体Cursor_pkg_func IS 功能f_trans(p编号)RETURN outrecset流水线是 out_rec outrec_typ; BEGIN OPEN Cursor_pkg.C1; LOOP \t \t FETCH Cursor_pkg.C1 INTO Cursor_pkg.row_emp; \t \t \t Cursor_pkg.C1%NOTFOUND时退出; \t \t \t out_rec.var_char2:= Cursor_pkg.row_emp.last_name; \t \t \t PIPE ROW(out_rec); DBMS_OUTPUT.put_line(out_rec.var_char2); END LOOP; 关闭Cursor_pkg.C1; \t RETURN; END f_trans; END Cursor_pkg_func; / – ifooi

+0

BEGIN select * from table(Cursor_pkg_func.f_trans(5)) END; /当我添加开始和结束;选择不工作 – ifooi