sql >> Database >  >> RDS >> Oracle

invoegen in... selecteer ... met subquery of zonder kolomvolgorde

Nee, u kunt geen subquery gebruiken om de kolomlijst te genereren als onderdeel van een SQL-instructie.

U kunt de volledige verklaring uit de datadictionary genereren:

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

en kopieer en plak dat dan, of gebruik dynamische SQL uit een anoniem 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;
/

Met een 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

het uitvoeren van dat blok geeft:

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

Je zou dat anonieme blok ook kunnen omzetten in een procedure die twee tabelnamen nodig heeft als dit iets is dat je waarschijnlijk vaak wilt doen (je zei dat het herbruikbaar moest zijn, maar dat zou kunnen betekenen voor dezelfde tabellen, en zou gewoon kunnen zijn een blok in een script).

U kunt ook verder gaan en alleen kolommen opnemen die in beide tabellen voorkomen, of controleren of gegevenstypen exact overeenkomen; hoewel dat wat meer werk is en misschien niet nodig is.




  1. Best practice voor het opslaan van databasewachtwoord

  2. Mysql variabele prestaties verhogen

  3. MySQL-draaitabellen - rijen naar kolommen. Vraag

  4. Kan de providernaam voor de providerfabriek van het type 'Npgsql.NpgsqlFactory' niet bepalen