1
votes

Sélectionnez les noms de colonne dans la variable de substitution

Idéalement, je voudrais définir dynamiquement une variable (de substitution) dans Oracle SQL. Ce qui suit ne fonctionne évidemment pas puisque la variable de substitution est juste remplacée littéralement dans l'instruction "insérer dans ...".

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

Y a-t-il un moyen de faire quelque chose de similaire? peut-être en PL / SQL?

EDIT: Je travaille dans SQL Developer, pas dans SQL * PLUS.


1 commentaires

Une variable de substitution ne peut contenir qu'un simple texte ou une valeur numérique. Vous pouvez utiliser listagg pour générer une liste séparée par des virgules. Cela ferait-il l'affaire?


3 Réponses :


0
votes

Je suppose que exec est ce dont vous avez besoin. Par exemple:

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>


2 commentaires

La variable est censée inclure une liste de valeurs, si je ne me trompe pas, "select x into y" ne permet qu'une seule valeur. Ai-je tort?


Vous avez raison. C'est ce que propose SQL * Plus - ce que je pensais que vous utilisiez, voir le code que vous avez publié. Si ce n'est pas ce que vous voulez, vous devrez passer en PL / SQL et utiliser du SQL dynamique ( exécution immédiate ).



1
votes

Pour cela, vous aurez besoin de EXECUTE IMMEDIATE . Reportez-vous à https://docs.oracle.com/ cd / B28359_01 / appdev.111 / b28370 / dynamic.htm # LNPLS01115 pour une utilisation plus détaillée, mais dans votre cas, ce sera

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


2 commentaires

J'y suis presque: déclarer un varchar2 (32767); begin a: = 'sélectionnez nom_colonne dans USER_TAB_COLS où nom_table = B;'; EXECUTE IMMEDIATE 'insérer dans A (: x) sélectionner: x à partir de B;' EN UTILISANT a, a; finir; Mais j'obtiens l'erreur "mot clé SELECT manquant"


Cela ne fonctionnera pas. Les variables de liaison concernent les valeurs de données, pas les sections structurelles du code.



1
votes

Je ne suis pas tout à fait sûr de ce que vous essayez de faire, mais si vous voulez une liste de colonnes séparées par des virgules dans une variable de substitution SQL * Plus, voici comment:

insert into table_a (department_id,department_name,manager_id,location_id) ...

La sortie est :

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


2 commentaires

Cela semble fonctionner mais à l'invite, cependant, j'obtiens une msgbox demandant de fournir des valeurs pour & columnlist; peut-être que quelque chose comme un double "&" est nécessaire pour rendre la valeur persistante?


Êtes-vous sûr de l'exécuter en tant que script (F5) et non en tant que "Instruction d'exécution" normale (Ctrl-Entrée)? (J'ai ajouté la balise SQL Developer à votre question. Je ne la connais pas particulièrement moi-même.)