【问题标题】:Error executing dynamic select query inside a stored procedure in IBM DB2在 IBM DB2 的存储过程中执行动态选择查询时出错
【发布时间】:2019-04-08 14:08:49
【问题描述】:

下面的代码有什么问题?我正在尝试在 DB2 的存储过程中执行动态查询。我的程序正在创建中

CREATE PROCEDURE  get_users( in offsetValue integer,
                              in sortCol varchar(20)            
                            )
  SPECIFIC get_users
  LANGUAGE SQL 

  Re:  BEGIN

    DECLARE SELECT_STATEMENT VARCHAR(8000);
    DECLARE SQL_STATEMENT STATEMENT;

    DECLARE c_emp CURSOR FOR SQL_STATEMENT;

    set SELECT_STATEMENT = 'select * from users;';

    PREPARE SQL_STATEMENT FROM SELECT_STATEMENT;

    EXECUTE SQL_STATEMENT; 

    open c_emp;
  END Re

但是当我使用

调用程序时
call get_users(3, 'email_id');

我收到以下错误

SQL Error: DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=;;select * from users;END-OF-STATEMENT, DRIVER=4.24.92

可能出了什么问题?

【问题讨论】:

  • 我假设您需要一个光标来读取数据。
  • 我创建了一个游标,稍后我在执行该行后打开该游标。我应该如何使用游标来读取数据?
  • 执行 FETCH 而不是 EXECUTE? (打开、获取、关闭。)
  • 之前我使用游标执行了相同的操作。但这不是动态查询。只有当我引入动态查询时,我才会遇到这个问题。
  • select * from users之后直接删除;

标签: sql stored-procedures plsql db2 dynamicquery


【解决方案1】:

错误太多... 试试这个:

--#SET TERMINATOR @

CREATE OR REPLACE PROCEDURE  get_users( in offsetValue integer,
                              in sortCol varchar(20)            
                            )
  SPECIFIC get_users
  DYNAMIC RESULT SETS 1
  LANGUAGE SQL 

  Re:  BEGIN
    DECLARE SELECT_STATEMENT VARCHAR(8000);
    DECLARE SQL_STATEMENT STATEMENT;
    DECLARE c_emp CURSOR WITH RETURN FOR SQL_STATEMENT;

    set SELECT_STATEMENT = 'select * from users';
    PREPARE SQL_STATEMENT FROM SELECT_STATEMENT;
    open c_emp;
  END Re
  @

【讨论】:

  • 根据您调用此 SP 的代码,您可以在游标定义中添加“WITH HOLD”子句以避免意外关闭它,例如,如果您的调用代码使用自动提交并发出其他一些语句在从 SP 的结果集中获取期间...
  • db2中的print语句是什么?我试过 DBMS_OUTPUT.PUT_LINE。但它不起作用。另外,我尝试了 SET SERVEROUTPUT ON。即使这样也行不通
  • 您使用什么工具来打印结果?您尝试调用的确切顺序是什么?这必须在 db2 命令行处理器 (DB2 CLP) 中工作。其他工具必须在内部调用相应的 SP 以向您显示内部缓冲区的内容,您的 dbms_outpt.put_line 调用将它们的输出放置在其中。
  • 我们如何从java代码中调用上述过程??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
  • 2013-01-08
  • 1970-01-01
  • 2020-04-04
  • 1970-01-01
相关资源
最近更新 更多