PL SQL заменить несколько значений в последовательности - PullRequest
0 голосов
/ 17 января 2019

У меня есть 2 столбца в таблице с именами Query и Values.

Запрос:

insert into 
tbl_details(CName,Line,Type,Command,Rule,Client_ID,Site_ID,SName) 
values (l_Name,:l_Line,:l_Type,:l_Command,:l_Rule,:l_Client_ID,:l_Site_ID,l_Name)

Значения: #1(2):20 #2(1):H #3(2):IF #4(27):FA - RETAIN OLD MASTER DATA #5(0): #6(0):

CName и SName используют одно и то же значение Manu.

Я хочу заменить связанные переменные значениями в следующих столбцах, чтобы получить исполняемый запрос.

Что я хочу: Я хочу написать процедуру, которая получает значения из обоих столбцов таблицы, чтобы сделать запрос и выполнить этот запрос.

insert into address_MP (CName,Line,Type,Command,Rule,Client_ID,Site_ID,SName) 
values ('Manu','20','H','IF','FA - RETAIN OLD MASTER DATA','','Manu')

1 Ответ

0 голосов
/ 17 января 2019

Вот одна из опций, которая преобразует оба условия запроса VALUES, а также сами значения в строки - каждое в своем собственном цикле курсора, связывая переменную связывания и ее значение через номер строки. CHR(39) - одинарная кавычка.

Поскольку таблица, скорее всего, не содержит ни одной строки (идентифицируется ли она по некоторому идентификатору? Вы никогда не сообщали нам), вам придется настроить ее, иначе она не будет работать должным образом.

Таблица испытаний:

SQL> select * from test;

QUERY
--------------------------------------------------------------------------------
C_VALUES
--------------------------------------------------------------------------------
insert into
tbl_details(CName,Line,Type,Command,Rule,Client_ID,Site_ID,SName)
values (l_Name,:l_Line,:l_Type,:l_Command,:l_Rule,:l_Client_ID,:l_Site_ID,l_Name
)
#1(2):20 #2(1):H #3(2):IF #4(27):FA - RETAIN OLD MASTER DATA #5(0):  #6(0):


SQL> set serveroutput on

Код и результат:

SQL> DECLARE
  2     l_query   test.query%TYPE;
  3     l_name    VARCHAR2 (30) := 'Manu';
  4  BEGIN
  5     SELECT query INTO l_query FROM test;
  6
  7     -- bind variables in QUERY
  8     FOR cur_l
  9        IN (SELECT ROW_NUMBER () OVER (ORDER BY lvl) rn, res l_val
 10              FROM (    SELECT LEVEL lvl,
 11                               REGEXP_SUBSTR (res,
 12                                              '[^,]+',
 13                                              1,
 14                                              LEVEL)
 15                                  res
 16                          FROM (SELECT SUBSTR (query, INSTR (query, 'values')) res
 17                                  FROM test)
 18                    CONNECT BY LEVEL <= REGEXP_COUNT (res, ':') + 1)
 19             WHERE SUBSTR (res, 1, 1) = ':')
 20     LOOP
 21        -- values in VALUES
 22        FOR cur_v
 23           IN (SELECT rn, TRIM (SUBSTR (res, INSTR (res, ':') + 1)) c_val
 24                 FROM (    SELECT LEVEL rn,
 25                                  REGEXP_SUBSTR (t.c_values,
 26                                                 '[^#]+',
 27                                                 1,
 28                                                 LEVEL)
 29                                     res
 30                             FROM test t
 31                       CONNECT BY LEVEL <= REGEXP_COUNT (t.c_values, '#'))
 32                WHERE rn = cur_l.rn)
 33        LOOP
 34           l_query :=
 35              REPLACE (l_query,
 36                       cur_l.l_val,
 37                       CHR (39) || cur_v.c_val || CHR (39));
 38        END LOOP;
 39     END LOOP;
 40
 41     -- Put Manu into l_Name
 42     l_query := REPLACE (l_query, 'l_Name', CHR (39) || l_name || CHR (39));
 43
 44     DBMS_OUTPUT.put_line (l_query);
 45  END;
 46  /
insert into
tbl_details(CName,Line,Type,Command,Rule,Client_ID,Site_ID,SName)

values ('Manu','20','H','IF','FA - RETAIN OLD MASTER DATA','','','Manu')

PL/SQL procedure successfully completed.

SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...