【问题标题】:Oracle - using bind variable in LIKE clause of dynamic cursorOracle - 在动态游标的 LIKE 子句中使用绑定变量
【发布时间】:2017-10-22 03:15:10
【问题描述】:

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

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

游标本身是这样执行的:

OPEN my_cursor FOR query USING my_var1;

我也尝试检查查询并打印出来:

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

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

【问题讨论】:

    标签: oracle dynamic-sql database-cursor bind-variables


    【解决方案1】:

    这是一个微妙的。从静态语句开始,正确处理,然后将其转换为动态 SQL,通常很有用。

    在非动态 SQL 中,我们可能会这样做:

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

    动态等价物是

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

    【讨论】:

    • 谢谢,现在可以使用了。我完全按照你说的做了 - 从静态语句到动态语句,我只是不知道我仍然需要在动态查询中使用 || 运算符。
    【解决方案2】:

    从字符串中取出绑定变量:

    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
    

    【讨论】:

    • 这很可能也可以,但上面的解决方案对我的需求更有用。无论如何谢谢:)
    • 谢谢,使用了这个,出于某种原因,我的非常有限测试使这个解决方案的性能略好于接受的答案。
    猜你喜欢
    • 2011-04-16
    • 2014-03-09
    • 2020-05-09
    • 2018-01-03
    • 2014-03-08
    • 2021-02-21
    • 1970-01-01
    • 2011-12-10
    • 2012-11-17
    相关资源
    最近更新 更多