【发布时间】: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