Oracle 在绑定参数不使用execute immediate的情况下选择INTO
我有以下查询,执行时返回1: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
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