Sql 在替换变量中选择列名

Sql 在替换变量中选择列名,sql,oracle,oracle-sqldeveloper,Sql,Oracle,Oracle Sqldeveloper,理想情况下,我希望在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 Develop

理想情况下,我希望在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。

我想您需要的是
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>

为此,您需要立即执行
executeimmediate
。提到 更详细的用法,但在您的情况下


executeimmediate'insert into a(:cols)select:cols from B'使用colnames,colnames

我不太确定您想做什么,但如果您想在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) ...

我就快到了:声明一个varchar2(32767);开始a:=“从用户选项卡中选择列名称,其中表名称=B;”;执行立即“插入A(:x)从B中选择:x;”使用a,a;结束;但我得到的错误“缺少选择关键字”将无法工作。绑定变量用于数据值,而不是代码的结构部分。如果我没有弄错的话,该变量应该包括一个值列表,“选择x到y”只允许一个值。我错了吗?你是对的。这就是SQL*Plus提供的——我认为您使用的,看到您发布的代码。如果这不是您想要的,则必须切换到PL/SQL并使用动态SQL(
executeimmediate
)。替换变量只能包含简单的文本或数字值。不过,您可以使用生成逗号分隔的列表。这行吗?似乎行得通,但在提示下,我收到一个msgbox请求为&columnlist;提供值;可能需要使用双“&”之类的符号来保持值的持久性?是否确实要将其作为脚本(F5)而不是正常的“运行语句”(Ctrl-Enter)运行?(我已经在你的问题中添加了SQL开发者标签。我自己对它不是特别熟悉。)