【问题标题】:Oracle SQL: Find {tags} in a sql stringOracle SQL:在 sql 字符串中查找 {tags}
【发布时间】:2013-05-01 23:29:01
【问题描述】:

我有我的用户编写的 SQL 字符串。它们看起来像:

SELECT Name, Age from Users WHERE Name LIKE '%a%' AND {UsersWhere}

在 oracle 服务器端,当要执行这样的 SQL 时,我想先替换 {tags}。 {tags} 的替换将是我在表中保存的有效 SQL 子字符串。预制的子 sql。所以处理后的字符串将是有效的 SQL。

是否有一些花哨的内置 Oracle 函数可以实现这一点?

感谢您的提示!

【问题讨论】:

  • 您如何运行用户提供的 SQL - 作为通过 PL/SQL 的动态 SQL?你所说的“花哨”是指replace 之类的东西吗?
  • 我想运行 SQL ina 函数 - 那就是 PL/SQL。
  • 是的,我的意思是例如一个 oracle 辅助函数,它将返回所有找到的 {tags} 或其他东西。然后我可以遍历它们以获取替代品并在字符串上进行替换。

标签: sql string oracle replace tags


【解决方案1】:

我为感兴趣的人写了一个小函数:

CREATE OR REPLACE FUNCTION SA.REPLACE_VARIABLES (p_sql             IN VARCHAR2)
   RETURN VARCHAR2
IS
   vs_return           VARCHAR2 (4000);


   -- Deklarationen  
   vs_sql              VARCHAR2(4000);

   vs_substring        VARCHAR2(4000);
   vs_variable         VARCHAR2(200);

   vs_variable_content VARCHAR2(4000);
BEGIN
   vs_sql := p_sql;

   IF INSTR(p_sql, '{') > 0 THEN

    vs_substring := vs_sql;

    WHILE LENGTH(vs_substring) > 0 LOOP

        IF INSTR(vs_substring, '{') <> 0 
        THEN

            vs_variable := SUBSTR(vs_substring, INSTR(vs_substring, '{'), INSTR(vs_substring, '}') - INSTR(vs_substring, '{') + 1);

            -- Do whatever you want with the variable
            --vs_sql := REPLACE(vs_sql, vs_variable, vs_variable_content); 

            -- Substring verkürzen
            vs_substring := SUBSTR(vs_substring, INSTR(vs_substring, vs_variable) + LENGTH(vs_variable) + 1);

        ELSE

            vs_substring := '';

        END IF;

    END LOOP;

   END IF;

   RETURN vs_sql;

EXCEPTION
   WHEN OTHERS
   THEN
      -- Err -handle

END REPLACE_VARIABLES;
/

【讨论】:

    【解决方案2】:

    我只是保持简单:

    v_sql := REPLACE(v_sql, '{UsersWhere}', '...whatever you need...');
    

    【讨论】:

      猜你喜欢
      • 2016-04-07
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      • 1970-01-01
      • 1970-01-01
      • 2019-11-13
      • 2018-01-02
      • 2023-03-19
      相关资源
      最近更新 更多