如何将字符串变量传递给动态sql中的where子句
Posted
技术标签:
【中文标题】如何将字符串变量传递给动态sql中的where子句【英文标题】:how to pass a string variable to the where clause in dynamic sql 【发布时间】:2016-09-08 07:42:37 【问题描述】:我必须部署我的 sql 脚本,为此我在一个文件中定义了变量,并在另一个文件中定义了创建脚本。
文件 1:
Define_Variable.sql
DEFINE hr_SCHEMA = hr;
文件 2:
创建文件.sql
@Define_variable.sql
declare
v_str varchar2(3000);
lc_cnt number;
BEGIN
v_str :='select count(1) into l_cnt from dba_tab_cols where owner=''' || &hr_SCHEMA ||''' and TABLE_NAME=''employees''';
execute immediate v_str;
IF l_cnt = 0 then
-----perform some operations
end if;
end ;
/
我收到以下错误。
ORA-06550
和 PLS-00201: identifier 'hr' must be declared
。
这里的值被替换,但如何在引号内写入值。就像我的输出应该执行
select count(1) into l_cnt from dba_tab_cols where owner= 'hr' and TABLE_NAME='employees';
这只是我的大脚本的一个示例,但目标是如何在动态 sql 的 where 查询中替换字符串变量。
【问题讨论】:
【参考方案1】:或者,你可以使用SQL字符串里面的变量,记得加引号where owner= ''&HR_schema''
set serveroutput on
define HR_schema = hr
declare
v_str varchar2(3000);
l_cnt number;
begin
--v_str := 'select count(1) from dba_tab_cols where owner=:owner and TABLE_NAME=''employees''';
v_str := 'select count(1) from dba_tab_cols where owner= ''&HR_schema'' and TABLE_NAME=''employees''';
execute immediate v_str into l_cnt ; --using '&HR_schema';
if l_cnt = 0
then
dbms_output.put_line(l_cnt);
-----perform some operations
end if;
end;
【讨论】:
这里的性能提升可能非常微不足道,因为绑定变量解决方案通过阻止连续执行 SQL 的硬解析来提高性能,而这里的情况并非如此。另一方面,如果您想利用直方图,使用绑定变量会影响性能。例如,在第一次解析中,您可能有一个变量的非极性值,让 CBO 选择使用索引,而成功的执行可能带有流行的值。在这种情况下,与使用次优计划运行 SQL 相比,多次硬解析可能是更好的解决方案 @Rene - 我认为在针对许多不同架构多次运行查询之前,绑定问题不会变得重要。【参考方案2】:最好给用户绑定变量和using子句。
declare
v_str varchar2(3000);
lc_cnt number;
begin
v_str := 'select count(1) from dba_tab_cols where owner=:owner and TABLE_NAME=''employees''';
execute immediate v_str into l_cnt using '&HR_schema';
if l_cnt = 0
then
-----perform some operations
end if;
end;
【讨论】:
以上是关于如何将字符串变量传递给动态sql中的where子句的主要内容,如果未能解决你的问题,请参考以下文章
HANA - 将字符串变量传递到 SQL 脚本中的 WHERE IN() 子句
可以将绑定变量连接到动态 SQL WHERE 子句以添加 AND 语句吗?
变量作为 Oracle PL/SQL 中 where 子句中的列名