oracle - 选择 INTO,绑定参数不与立即执行一起使用
问题描述
我有以下查询在执行时返回 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 into。我将不胜感激任何帮助或指导。
最好的问候,兰多。
附言
当我进行以下修改时:
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
解决方案
问题很可能在 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
推荐阅读
- shell - 使用带有 expr 的 Find 命令查找四个小时
- java - Elasticsearch Spring Data - 加入子对象
- spring - KTable在Spring Boot应用程序中没有返回数据,但是可以查询
- c# - 如何在 C# 中使用 OpenXML 更新所有字段(交叉引用)?
- unit-testing - 在 VSTS 构建结果中显示 Salesforce 测试结果
- c# - 如何从 C# 中的图片框中获取实时帧?
- javascript - Webpack 4:extract-text-webpack-plugin 错误
- php - 尝试将具有多个 XOR 组件的 PHP hash_hmac 转换为冷融合
- php - updateOrCreate() 给出 Column not found: 1054 Unknown column '0' in 'where 子句'
- c# - 数据库未使用数据集更新