Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

masukkan ke... pilih ... dengan subquery atau tanpa urutan kolom

Tidak, Anda tidak dapat menggunakan subquery untuk membuat daftar kolom sebagai bagian dari pernyataan SQL.

Anda dapat membuat pernyataan lengkap dari kamus data:

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

lalu salin dan tempel itu, atau gunakan SQL dinamis dari blok anonim:

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

Dengan beberapa tabel dummy:

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

menjalankan blok itu memberikan:

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

Anda juga dapat mengubah blok anonim itu menjadi prosedur yang menggunakan dua nama tabel jika ini adalah sesuatu yang kemungkinan besar ingin Anda lakukan (Anda mengatakan itu harus dapat digunakan kembali, tetapi itu bisa berarti untuk tabel yang sama, dan bisa saja blok dalam skrip).

Anda juga bisa melangkah lebih jauh dan hanya menyertakan kolom yang muncul di kedua tabel, atau memverifikasi tipe data yang sama persis; meskipun itu sedikit lebih banyak pekerjaan dan mungkin tidak diperlukan.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Skrip Liquibase mengembalikan ORA-01843:bukan bulan yang valid

  2. Cara Menampilkan Semua Keistimewaan Database Oracle untuk Pengguna

  3. Oracle getConnection lambat

  4. Oracle:temukan angka terbesar dalam satu string

  5. Bagaimana cara membuat urutan Oracle yang dimulai dengan nilai maksimal dari sebuah tabel?