2014-11-10 6 views
1

Когда я просто написать запрос, в котором он имеет код, какИспользование строки в Oracle хранимой процедуры

Select * from .. 
where ... 
AND gfcid in (select regexp_substr('1005771621,1001035181'||',','\d+',1,level) 
     from dual 
     connect by level <= (select max(length('1005771621,1001035181')-length(replace('1005771621,1001035181',',')))+1 
          from dual)) 

Он работает.

Но я хочу сделать динамический запрос в хранимой процедуре оракула. Мне это понравилось:

GDFCID_STRING := ' select regexp_substr(' 
      || '1005771621,1001035181' 
      || ',' 
      || ',' 
      || '\d+' 
      || ',1,level) from dual connect by level <= (select max(length(' 
      || '1005771621,1001035181' 
      || ')-length(replace(' 
      || '1005771621,1001035181' 
      || ',' 
      || ',' 
      || ')))+1 from dual)'; 

Select * from .. 
where ... 
AND gfcid in (GDFCID_STRING) 

Но теперь это работает.

+0

Я думаю, что хранимая процедура - это то, что вам нужно, с входными переменными. – ErrorNotFoundException

+0

Почему вы хотите получить динамический запрос? –

+0

Итак, вы хотите разбить строку 'GDFCID_STRING' на список числовых значений, а затем использовать ее как параметр' in'', который нужно сравнить с 'gfcid', правильно? – Rachcha

ответ

1

В общем, вы можете использовать

execute immediate v_your_sql_code;

для выполнения динамического SQL в PL/SQL, но из вашего вопроса, я на самом деле не знает, что вы хотите сделать.

Edit:

y_your_sql_code := 'Select yourColumn from .. where ...AND gfcid in ('||GDFCID_STRING||')'; 

execute immediate v_your_sql_code into v_result; 

Вы должны определить v_result в правильном типе данных, вы можете использовать более переменную один результат, если вам нужно больше результата столбцы, вам нужно есть сложный тип, если может извлекать более одной строки.

+0

Я хочу добавить динамическую строку в запрос Как выберите x из y где id в (динамический sql) –

+0

Как я могу сделать это в разделе IN? –

+0

Вам нужно передать все ваше заявление как строку в команду 'execute немедленный'. И вы определяете переменные для результата. Я отредактирую выше. – evilive

2

Насколько я понимаю вашу проблему, вам нужен метод, чтобы принять строку с разделителями-запятыми в качестве ввода, разбить ее на набор целых чисел и затем сравнить число (чтение: целое число) со значениями в этой коллекции ,

Oracle предлагает в основном три типа collections - varrays, nested tables и associative arrays. Я бы объяснил, как преобразовать строку с разделителями-запятыми во вложенную таблицу и использовать ее для запроса или сравнения.

Во-первых, вам необходимо определить тип объекта в схеме. Вы можете писать запросы, используя этот тип, только если вы определяете его на уровне схемы.

CREATE OR REPLACE TYPE entity_id AS OBJECT (id_val NUMBER(28)); 
/

CREATE OR REPLACE TYPE entity_id_set IS TABLE OF entity_id; 
/

Далее, определим функцию следующим образом:

FUNCTION comma_to_nt_integer (p_comma_delimited_str IN VARCHAR) 
    RETURN entity_id_set IS 
    v_table  entity_id_set; 
BEGIN 
    WITH temp AS (SELECT TRIM(BOTH ',' FROM p_comma_delimited_str) AS str FROM DUAL) 
     SELECT ENTITY_ID(TRIM (REGEXP_SUBSTR (t.str, 
            '[^,]+', 
            1, 
            LEVEL))) 
        str 
      BULK COLLECT INTO v_table 
      FROM temp t 
    CONNECT BY INSTR (str, 
         ',', 
         1, 
         LEVEL - 1) > 0; 

    RETURN v_table; 
END comma_to_nt_integer; 

Вы сделали с DDL, необходимых для выполнения этой задачи. Теперь вы можете просто написать запрос:

SELECT * 
    FROM .. 
WHERE ... 
     AND gfcid in (table(comma_to_nt_integer(GDFCID_STRING))); 
+0

Здесь в -> И gfcid в (таблица (comma_to_nt_integer (GDFCID_STRING))) в разделе sql может быть другим. Если пользователь пропускает пустой gfcId, мне нужно поместить соединение с другой таблицей, поэтому в разделе IN есть динамический запрос .. :(. Большое спасибо за ваш ответ. Я попытался-> И gfcid в (EXECUTE IMMEDIATE GDFCID_STRING2) -> но это тоже работает. –

+1

@AnilGavate запрос может быть либо полностью динамическим, либо полностью статическим, но не тем и другим. –

+0

Я хочу создать динамический запрос –

Смежные вопросы