Oracle
 sql >> Base de données >  >> RDS >> Oracle

insérer dans... sélectionner... avec sous-requête ou sans ordre des colonnes

Non, vous ne pouvez pas utiliser une sous-requête pour générer la liste des colonnes dans le cadre d'une instruction SQL.

Vous pouvez générer la déclaration complète à partir du dictionnaire de données :

select 'insert into cl ("'
  || listagg(column_name, '","') within group (order by column_id)
  || '") select "'
  || listagg(column_name, '","') within group (order by column_id)
  || '" from clt'
from user_tab_columns where table_name = 'CLT';

puis copiez-collez-le ou utilisez SQL dynamique à partir d'un bloc anonyme :

declare
  stmt varchar2(4000);
begin
  select 'insert into cl ("'
    || listagg(column_name, '","') within group (order by column_id)
    || '") select "'
    || listagg(column_name, '","') within group (order by column_id)
    || '" from clt'
  into stmt
  from user_tab_columns where table_name = 'CLT';

  dbms_output.put_line(stmt); -- to check and debug
  execute immediate stmt;
end;
/

Avec quelques tables factices :

create table clt (col1 number, col2 date, col3 varchar2(10));
create table cl (col3 varchar2(10), col1 number, col2 date);

insert into clt (col1, col2, col3) values (42, date '2018-07-12', 'Test');

insert into cl
select * from clt;

SQL Error: ORA-00932: inconsistent datatypes: expected NUMBER got DATE

exécuter ce bloc donne :

insert into cl ("COL1","COL2","COL3") select "COL1","COL2","COL3" from clt

PL/SQL procedure successfully completed.

select * from cl;

COL3             COL1 COL2      
---------- ---------- ----------
Test               42 2018-07-12

Vous pouvez également transformer ce bloc anonyme en une procédure qui prend deux noms de table si c'est quelque chose que vous êtes susceptible de vouloir faire souvent (vous avez dit qu'il devait être réutilisable, mais cela pourrait signifier pour les mêmes tables, et pourrait simplement être un bloc dans un script).

Vous pouvez également aller plus loin et inclure uniquement les colonnes qui apparaissent dans les deux tables, ou vérifier que les types de données correspondent exactement ; même si c'est un peu plus de travail et peut-être pas nécessaire.