Oracle pl sql按顺序替换多个值

Oracle pl sql按顺序替换多个值,oracle,plsql,Oracle,Plsql,我在一个名为Query和Values的表中有两列 查询: 值:12:20 21:H 32:IF 427:FA-保留旧主数据50:60: CName和SName使用相同的值Manu 我想用下一列中的值替换绑定的变量,以获得可执行查询 我想要的是: 我想编写一个过程,从表的两列中获取值,以进行查询并执行该查询 insert into address_MP (CName,Line,Type,Command,Rule,Client_ID,Site_ID,SName) values ('Manu','2

我在一个名为Query和Values的表中有两列

查询:

值:12:20 21:H 32:IF 427:FA-保留旧主数据50:60:

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')

这里有一个选项,它可以将查询值子句和值本身转换为行,每个行都在自己的游标循环中,通过行号将绑定变量和值配对。CHR39是一个单引号

由于该表很可能不包含一行,它是否由某个ID标识?你从来没有告诉过我们,你必须调整它,否则它就不能正常工作

测试表:

代码&结果:


改变你的设计,这样做看起来很糟糕。什么是t.c_值?我的测试表的别名(在我的示例中)是t,它有两列:查询和c_值,因为值是无效标识符,即保留字,你不能命名列值,除非你将它括在双引号中,这是我拒绝做的。
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')
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>