Oracle 在绑定参数不使用execute immediate的情况下选择INTO

Oracle 在绑定参数不使用execute immediate的情况下选择INTO,oracle,plsql,dynamic-sql,bind-variables,Oracle,Plsql,Dynamic Sql,Bind Variables,我有以下查询,执行时返回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

我有以下查询,执行时返回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。我认为我遵守了PL/SQL中查询select的绑定参数的规则。我将感谢任何帮助或指导

致以最良好的祝愿, 兰多

附言

当我进行以下修改时:

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文件中读取数据并将其插入数据库表(表名称)。上述结果是防止插入dublicates记录所必需的。提交在过程结束时发出

这意味着,如果从过程中添加了一条记录,它将保持未提交状态,直到过程完成

我怀疑这是一个问题,未提交的插入无法从其他连接访问,但在当前连接中,它们应该可以访问。以下是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

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


如果不使用绑定变量并使用与普通查询相同的常量查询(输出为1),PL/SQL块的输出是什么?您的PL/SQL块似乎正确。无法复制此问题。(你确定你已经提交了数据吗?)如果我运行查询,数据是可用的。在带有绑定参数的plsql中运行的同一查询返回0数据。提交在过程结束时发出。该条件是防止插入重复记录所必需的。谢谢您的回答。不幸的是,我已经重新测试了好几次,也关闭了连接并创建了一个新的连接。它不能正常工作。
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