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.
3 Réponses :
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>
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
).
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;
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.
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) ...
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.)
Une variable de substitution ne peut contenir qu'un simple texte ou une valeur numérique. Vous pouvez utiliser
listagg code >
pour générer une liste séparée par des virgules. Cela ferait-il l'affaire?