PL/SQL, DBMS_SQL 无法显示数据

Posted

技术标签:

【中文标题】PL/SQL, DBMS_SQL 无法显示数据【英文标题】:PL/SQL, DBMS_SQL can not display data 【发布时间】:2016-08-05 09:23:47 【问题描述】:

我是 DBMS_SQL 的新手。我正在尝试从光标中获取第一行,但没有显示任何内容。我做错了什么?这是一个代码:

CREATE OR REPLACE PROCEDURE TEST_SQL 
IS 
     id_var             NUMBER; 
     name_var           VARCHAR2(30); 
     sal_var      Number; 
     source_cursor      INTEGER; 
     countp             INTEGER; 
  BEGIN 


     source_cursor := dbms_sql.open_cursor; 
     DBMS_SQL.PARSE(source_cursor, 
         'SELECT employee_id, first_name, salary FROM employees where department_id = 50', 
          DBMS_SQL.NATIVE); 
     DBMS_SQL.DEFINE_COLUMN(source_cursor, 1, id_var); 
     DBMS_SQL.DEFINE_COLUMN(source_cursor, 2, name_var, 30); 
     DBMS_SQL.DEFINE_COLUMN(source_cursor, 3, sal_var); 
     countp := DBMS_SQL.EXECUTE(source_cursor); 


  DBMS_SQL.COLUMN_VALUE(source_cursor, 1, id_var); 
         DBMS_SQL.COLUMN_VALUE(source_cursor, 2, name_var); 
         DBMS_SQL.COLUMN_VALUE(source_cursor, 3, sal_var); 

 dbms_output.put_line('id_var: '||id_var ||', name_var: '||name_var ||', sal_var: '|| sal_var);


  END; 
/ 

输出是:

PROCEDURE TEST_SQL compiled
anonymous block completed
id_var: , name_var: , sal_var:

编辑:学校错误 - 忘记了 Fetch_rows -.- 一切正常!

【问题讨论】:

更新了答案。输出如上。 Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit 看起来很奇怪,这是一个愚蠢的问题,你的表中是否真的有 department_id = 50 的记录。另外,您是否使用 oracle 定义的函数进行显示,何时可以使用简单的光标轻松完成。 训练用的。是的,记录存在。它的 HR SCHEMA。 即使你打印了你的计数器,它也会告诉你光标没有获取任何记录.. 【参考方案1】:

你不是fetching 任何数据;你需要做的:

DBMS_SQL.FETCH_ROWS(source_cursor);

所以这行得通:

CREATE OR REPLACE PROCEDURE TEST_SQL 
IS 
     id_var             NUMBER; 
     name_var           VARCHAR2(30); 
     sal_var      Number; 
     source_cursor      INTEGER; 
     countp             INTEGER; 
  BEGIN 

     source_cursor := dbms_sql.open_cursor; 
     DBMS_SQL.PARSE(source_cursor, 
         'SELECT employee_id, first_name, salary FROM employees where department_id = 50', 
          DBMS_SQL.NATIVE); 
     DBMS_SQL.DEFINE_COLUMN(source_cursor, 1, id_var); 
     DBMS_SQL.DEFINE_COLUMN(source_cursor, 2, name_var, 30); 
     DBMS_SQL.DEFINE_COLUMN(source_cursor, 3, sal_var); 
     countp := DBMS_SQL.EXECUTE(source_cursor); 

     countp := DBMS_SQL.FETCH_ROWS(source_cursor);

     DBMS_SQL.COLUMN_VALUE(source_cursor, 1, id_var); 
     DBMS_SQL.COLUMN_VALUE(source_cursor, 2, name_var); 
     DBMS_SQL.COLUMN_VALUE(source_cursor, 3, sal_var); 

     dbms_output.put_line('id_var: '||id_var ||', name_var: '||name_var ||', sal_var: '|| sal_var);

  END; 
/

set serveroutput on
exec test_sql;

PL/SQL procedure successfully completed.

id_var: 120, name_var: Matthew, sal_var: 8000

或者正如 Tony Andrews 指出的那样,将这两个步骤与 EXECUTE_AND_FETCH 结合起来。

当然,您可能希望在循环中进行提取,因为这只会提取并显示查询返回的第一行。

【讨论】:

我正要发布类似的帖子,但提到了DBMS_SQL.EXECUTE_AND_FETCH,这是另一种选择。 +1,因为我们不应该再多说。 Alex - 是的,我已经解决了。我已经编辑了我的帖子。不过谢谢!

以上是关于PL/SQL, DBMS_SQL 无法显示数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle 中调试 PL/SQL 集合的值?

PL/SQL 函数错误 - 无法理解

解决PL/SQL使用无法导出dmp

PL/SQL连接时,报无法解析指定的字符串

动态SQL和PL/SQL的EXECUTE选项分析

Navicat能连接,但pl/sql无法连接oracle数据库