sql >> Database teknologi >  >> RDS >> Oracle

indsæt i... vælg ... med underforespørgsel eller uden kolonnerækkefølge

Nej, du kan ikke bruge en underforespørgsel til at generere kolonnelisten som en del af en SQL-sætning.

Du kan generere den fulde erklæring fra dataordbogen:

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';

og derefter enten kopier og indsæt det, eller brug dynamisk SQL fra en anonym blok:

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;
/

Med et par dummy-borde:

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

at køre denne blok giver:

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

Du kan også gøre den anonyme blokering til en procedure, der tager to tabelnavne, hvis dette er noget, du sandsynligvis vil gøre ofte (du sagde, at det skulle genbruges, men det kunne betyde for de samme tabeller, og det kunne bare være en blok i et script).

Du kan også gå længere og kun inkludere kolonner, der vises i begge tabeller, eller kontrollere, at datatyperne matcher nøjagtigt; selvom det er lidt mere arbejde og måske ikke er nødvendigt.




  1. MySQL LN() Funktion – Returner den naturlige logaritme af et tal

  2. Installation af Oracle Database 12c-software på Windows

  3. Lave beregninger i MySQL vs PHP

  4. natvagts brugerdefineret kommando tilbagekald