Oracle
 sql >> Datenbank >  >> RDS >> Oracle

einfügen in... auswählen ... mit Unterabfrage oder ohne Spaltenreihenfolge

Nein, Sie können keine Unterabfrage verwenden, um die Spaltenliste als Teil einer SQL-Anweisung zu generieren.

Sie können die vollständige Anweisung aus dem Datenwörterbuch generieren:

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

und dann entweder kopieren und einfügen oder dynamisches SQL aus einem anonymen Block verwenden:

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

Mit ein paar Dummy-Tabellen:

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

Das Ausführen dieses Blocks ergibt:

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

Sie könnten diesen anonymen Block auch in eine Prozedur umwandeln, die zwei Tabellennamen verwendet, wenn Sie dies wahrscheinlich oft tun möchten (Sie sagten, es müsse wiederverwendbar sein, aber das könnte für dieselben Tabellen bedeuten und könnte es einfach sein ein Block in einem Skript).

Sie könnten auch weiter gehen und nur Spalten einbeziehen, die in beiden Tabellen erscheinen, oder überprüfen, ob die Datentypen genau übereinstimmen; obwohl das ein bisschen mehr Arbeit ist und möglicherweise nicht notwendig ist.