Выберите имена столбцов в переменную подстановки - PullRequest
1 голос
/ 07 января 2020

В идеале я хотел бы динамически определить переменную (подстановку) в Oracle SQL. Очевидно, что следующее не работает, поскольку переменная подстановки буквально заменяется в операторе «insert into ...».

define colnames = '(select column_name from USER_TAB_COLS where table_name = B)';
insert into A(&colnames) select &colnames from B;

Есть ли способ сделать что-то подобное? возможно в PL / SQL?

РЕДАКТИРОВАТЬ: Я работаю в SQL Developer, а не в SQL* PLUS.

Ответы [ 3 ]

1 голос
/ 07 января 2020

Вам понадобится EXECUTE IMMEDIATE для этого. Обратитесь к https://docs.oracle.com/cd/B28359_01/appdev.111/b28370/dynamic.htm#LNPLS01115 для более детального использования, но в вашем случае это будет

EXECUTE IMMEDIATE 'insert into a(:cols) select :cols from B' USING colnames, colnames;

1 голос
/ 08 января 2020

Я не совсем уверен, что вы пытаетесь сделать, но если вам нужен список столбцов, разделенных запятыми, в переменной подстановки SQL* Plus, вот как:

col column_list new_value column_list

select listagg(lower(column_name), ',') within group (order by column_id) as column_list
from   user_tab_columns
where  table_name = 'DEPARTMENTS';

COLUMN_LIST
--------------------------------------------------------------------------------
department_id,department_name,manager_id,location_id

prompt insert into table_a (&column_list) ...

Вывод :

insert into table_a (department_id,department_name,manager_id,location_id) ...
0 голосов
/ 07 января 2020

Я думаю, exec - это то, что вам нужно. Например:

SQL> var v_empno number
SQL> exec select max(empno) into :v_empno from emp where deptno = 10;

PL/SQL procedure successfully completed.

SQL> print v_empno

   V_EMPNO
----------
      7934

SQL> select ename, job, sal
  2  from emp
  3  where empno = :v_empno;

ENAME      JOB              SAL
---------- --------- ----------
MILLER     CLERK           1300

SQL>
...