Oracle -在动态游标的LIKE子句中使用绑定变量

jexiocij  于 2023-11-17  发布在  Oracle
关注(0)|答案(3)|浏览(156)

我正在使用动态游标获取数据。正在执行的查询类似于:

query := 'SELECT column1, column2 
          FROM my_table 
          WHERE column1 LIKE ''%:bv1%''';

字符串
而游标本身是这样执行的:

OPEN my_cursor FOR query USING my_var1;


我也试着检查查询并打印它:

... WHERE column1 LIKE '%:bv1%' ...


所以撇号被转义了,但是游标不获取数据。在LIKE子句中使用绑定变量是可能的吗?如果是,我做错了什么?

y0u0uwnf

y0u0uwnf1#

这是一个微妙的问题,通常从静态语句开始,正确处理,然后将其转换为动态SQL是有用的。
在非动态SQL中,我们可以这样做:

SELECT column1, column2 
 FROM my_table 
 WHERE column1 LIKE '%' || local_var || '%';

字符串
动态等效值为

query := 'SELECT column1, column2 
          FROM my_table 
          WHERE column1 LIKE ''%''||:bv1||''%'' ';

qnakjoqk

qnakjoqk2#

从字符串中取出bind变量:

VARIABLE mycursor REFCURSOR;
VARIABLE bv1 VARCHAR2;

BEGIN
  :bv1 := 'X'; -- set the bind variable
END;
/

DECLARE
  query VARCHAR2(200) := 'SELECT * FROM DUAL WHERE DUMMY LIKE :value';
BEGIN
  OPEN :mycursor FOR query USING '%' || :bv1 || '%';
END;
/

PRINT mycursor;

字符串

输出

MYCURSOR
--------
DUMMY
-----
X

h79rfbju

h79rfbju3#

对于任何碰巧经过的人,你也可以把%的值放在bind-string本身中:

DECLARE
   cursor_ SYS_REFCURSOR;
   qry_ VARCHAR2(2000) := q'[
with cat_names as (
select 'Bobby' names from dual union
select 'Tracy' names from dual union
select 'Jack' names from dual union
select 'Barnet' names from dual union
select 'Sally' names from dual union
select 'Bruce' names from dual
)
select c.names
from   cat_names c
where  c.names LIKE :var]';

   var_  VARCHAR2(20) := 'B%';
   name_ VARCHAR2(50);

BEGIN
   OPEN cursor_ FOR qry_ USING var_;
   LOOP
      FETCH cursor_ INTO name_;
      EXIT WHEN cursor_%NOTFOUND;
      Dbms_Output.Put_Line (name_);
   END LOOP;
   CLOSE cursor_;
END;

字符串
输出为:

Barnet
Bobby
Bruce


这个解决方案比公认的答案更动态,因为它让你的用户/客户端应用程序选择是否使用%匹配,而不是每个搜索都必须在整个字符串上进行。根据你的数据集和表结构,这 * 可能 * 会极大地影响您的性能,因为搜索字符串上的前面%(例如在接受的答案中强制使用%:bv1%)通常意味着优化器不能使用索引。

**免责声明:**仅在Oracle 19中测试!

相关问题