2013-05-07 6 views
1

У меня есть строки SQL, которые мои пользователи пишут. Они похожи:Oracle SQL: Найти {теги} в строке sql

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

На стороне сервера Oracle, когда такое SQL должна быть выполнена, я хочу, чтобы заменить {} теги первым. Замены для {tags} будут действительными строками SQL, которые я удерживаю в таблице. Предварительно созданные суб-sqls. Таким образом, обработанная строка будет действительной SQL.

Есть ли какая-то причудливая встроенная функция Oracle, чтобы это произошло?

Спасибо за подсказку!

+0

Как вы бежите на предоставленный пользователем SQL - в качестве динамического SQL с помощью PL/SQL? И «причудливо», вы имеете в виду что-то вроде ['replace'] (http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions153.htm)? –

+0

Я хочу запустить функцию SQL ina - так что это будет PL/SQL. –

+0

Да, по фантазии я имею в виду, например, вспомогательную функцию oracle, которая вернет все найденные {теги} или что-то еще. Затем я мог бы пройти через них, чтобы получить замену и заменить на строку. –

ответ

0

Я написал небольшую функцию для всех, кто интересуется:

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; 
/
0

Я просто держать его просто:

v_sql := REPLACE(v_sql, '{UsersWhere}', '...whatever you need...'); 
Смежные вопросы