#oracle #dynamic-sql #informatica
#Oracle #dynamic-sql #informatica
Вопрос:
У меня есть сопоставление, которое выполняет динамический sql посредством преобразования SQL. Динамический sql хранится в таблице Oracle, и мне нужно добавить строковый параметр к этому запросу.
В этом примере запроса значения, сравниваемые с COL4 и COL5, выводятся в журнале корректно, но значение, сравниваемое с COL6, выводится в запросе как ‘$$STRING_PARA’ —
'SELECT COL1, COL2, COL3 FROM TABLE
WHERE COL4 = $$NUMERIC_PARA
AND COL5 = ''Y''
AND COL6 = ''||$$STRING_PARA||'' '
$$STRING_PARA корректно выводится в начале журнала. Я пытался опустить каналы и увеличить количество кавычек, но, похоже, ничего не работает.
Кто-нибудь делал что-то подобное?
Комментарии:
1. Может быть, просто
AND COL6 = $$STRING_PARA
?
Ответ №1:
Я предполагаю, что вы хотите выполнить запрос, заменив входные переменные Informatica значениями сопоставления. Это может работать следующим образом
' SELECT COL1, COL2, COL3 FROM TABLE
WHERE COL4 = $$NUMERIC_PARA
AND COL5 = ''Y''
AND COL6 = ''$$STRING_PARA'' '
В PL / SQL
SQL> set serveroutput on size unlimited echo on lines 200
SQL> @test.sql
SQL> declare
2 v_query varchar2(4000) := ' SELECT COL1, COL2, COL3 FROM TABLE
3 WHERE COL4 = $$NUMERIC_PARA
4 AND COL5 = ''Y''
5 AND COL6 = ''$$STRING_PARA'' ' ;
6 begin
7 dbms_output.put_line(v_query);
8 end;
9 /
SELECT COL1, COL2, COL3 FROM TABLE
WHERE COL4 = $$NUMERIC_PARA
AND COL5 = 'Y'
AND COL6 = '$$STRING_PARA'
PL/SQL procedure successfully completed.
Замена среды выполнения и выполнение путем замены входных переменных
SQL> select object_id, object_name from dba_objects where object_name = 'MY_TEST' ;
OBJECT_ID OBJECT_NAME
---------- --------------------------------------------------------------------------------------------------------------------------------
8897475 MY_TEST
SQL> @test.sql 8897475 MY_TEST
SQL> declare
2 v_query varchar2(4000) := ' SELECT count(*) from dba_objects
3 WHERE object_id = amp;1
4 AND object_name = ''amp;2'' ' ;
5 v_counter pls_integer;
6 begin
7 dbms_output.put_line(v_query);
8 execute immediate v_query into v_counter;
9 dbms_output.put_line('Counter is '||v_counter||' ');
10 end;
11 /
old 3: WHERE object_id = amp;1
new 3: WHERE object_id = 8897475
old 4: AND object_name = ''amp;2'' ' ;
new 4: AND object_name = ''MY_TEST'' ' ;
SELECT count(*) from dba_objects
WHERE object_id = 8897475
AND object_name = 'MY_TEST'
Counter is 1
PL/SQL procedure successfully completed.
SQL>
Это должно работать таким же образом, поскольку экранирование для одиночной кавычки должно быть одинаковым.
Ответ №2:
Спасибо за предложения — «$$STRING_PARA» сработал.
В то время я не мог этого видеть, поскольку в сопоставлении была другая проблема, которая не позволяла ему работать правильно.