【问题标题】:Select INTO with binding parameters not working with execute immediate选择 INTO,绑定参数不与立即执行一起使用
【发布时间】:2021-03-09 03:08:29
【问题描述】:

我有以下查询,执行时返回 1:

SELECT COUNT(*)  FROM TABLE_NAME WHERE Column1='x' AND Column2='y';

在我的 PL/SQL 块中,我需要评估上述条件以执行业务逻辑。以下是简化版:

DECLARE
   column1 VARCHAR(20):='x';
   column2 VARCHAR(20):='y';
   rows_no NUMBER :=0;
   sql_query VARCHAR2(200) :='SELECT COUNT(*)  FROM TABLE_NAME WHERE Column1=:1 AND Column2=:2';

BEGIN

  EXECUTE IMMEDIATE sql_query INTO rows_no USING column1, column2;
  DBMS_OUTPUT.PUT_LINE('ROWS NO: '|| rows_no);

END;

PL/SQL 块的执行结果为 0,与执行查询时的结果为 1 不同。我想我遵守绑定参数的规则来查询 select into 在 PL/ SQL。我将不胜感激任何帮助或指导。

最好的问候, 兰多。

附言

当我在下面进行修改时:

DECLARE
   column1 VARCHAR(20):='x';
   column2 VARCHAR(20):='y';
   rows_no NUMBER :=0;
   sql_query VARCHAR2(200) :='SELECT COUNT(*)  FROM TABLE_NAME WHERE Column1=''x'' AND Column2=''y''';

BEGIN

  EXECUTE IMMEDIATE sql_query INTO rows_no;
  DBMS_OUTPUT.PUT_LINE('ROWS NO: '|| rows_no);

END;

结果是:1

我有一个循环,它从 excel 文件中读取数据并将其插入到数据库表(Table_name)中。需要上面的结果来防止插入重复记录。提交在过程结束时发出。

这意味着如果从过程中添加记录,则在过程完成之前它保持未提交状态。

我怀疑这是一个问题,未提交的插入无法从其他连接访问,但在当前连接中,它们应该是可访问的。以下是plsql块的所有简化逻辑:

DECLARE;
--declaration variables
BEGIN
      LOOP
         -- fetching information from excel file
         EXECUTE IMMEDIATE sql_query INTO rows_no;
         DBMS_OUTPUT.PUT_LINE('ROWS NO: '|| rows_no);
         IF rows_no=0 THEN
           -- insert the information read from excel in database table
           rows_inserted:=rows_inserted+1;
         END IF;
      END LOOP;
   IF  rows_inserted>0 THEN
        COMMIT;
        DBMS_OUTPUT.PUT_LINE('ROWS INSERTED: '||rows_inserted);
        ELSE 
        DBMS_OUTPUT.PUT_LINE('No rows were inserted');
   END IF;
END

【问题讨论】:

  • 如果您不使用绑定变量并使用与正常查询相同的常量查询(输出为 1),PL/SQL 块的输出是什么?您的 PL/SQL 块似乎是正确的。
  • 无法复制问题db<>fiddle。 (你确定你有COMMITted 数据吗?)
  • 如果我运行查询,数据是可用的。在具有绑定参数的 plsql 中运行的相同查询返回 0 数据。提交在过程结束时发出。需要该条件来防止插入重复记录。

标签: oracle plsql dynamic-sql bind-variables


【解决方案1】:

问题很可能是Oracle外部的,请尝试重新测试以下脚本 (输出显示为注释)

create table tab (column1 varchar2(1), column2 varchar2(1));

set SERVEROUTPUT ON
DECLARE
   column1 VARCHAR(20):='x';
   column2 VARCHAR(20):='y';
   rows_no NUMBER :=0;
   sql_query VARCHAR2(200) :='SELECT COUNT(*)  FROM TAB WHERE Column1=:1 AND Column2=:2';

BEGIN

  EXECUTE IMMEDIATE sql_query INTO rows_no USING column1, column2;
  DBMS_OUTPUT.PUT_LINE('ROWS NO: '|| rows_no);

END;
/

-- ROWS NO: 0

insert into tab (column1, column2) values ('x','y');

DECLARE
   column1 VARCHAR(20):='x';
   column2 VARCHAR(20):='y';
   rows_no NUMBER :=0;
   sql_query VARCHAR2(200) :='SELECT COUNT(*)  FROM TAB WHERE Column1=:1 AND Column2=:2';

BEGIN

  EXECUTE IMMEDIATE sql_query INTO rows_no USING column1, column2;
  DBMS_OUTPUT.PUT_LINE('ROWS NO: '|| rows_no);

END;
/

-- ROWS NO: 1

【讨论】:

  • 感谢您的回答。不幸的是,我已经重新测试了好几次,也关闭了连接并创建了一个新的连接。它不能正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多