簡體   English   中英

如何將舊列復制到新的現有表中?

[英]How do i copy old columns to my new existing table?

我有一個現有的沒有表的新表。 我想復制舊表中的所有10列。 我怎么做? 我不想刪除該表,因此可以執行: create table newTable as select * from oldTable

我不想放桌子,所以我可以執行:
創建表newTable作為select * from oldTable。

假設您的新表至少有1列, BobC告訴您不能有沒有任何列的表,則可以更改表。

Alter new_table add (col1 varchar2(10)) , col2 ...);

請注意,您需要在此處手動提及與舊表相同的所有列。

如果您不想手動執行此操作,則可能需要一個PLSQL塊才能執行此操作。

CREATE OR REPLACE PROCEDURE creat_tbl_frm_tbl (tablname VARCHAR2)
AS
   db_user    VARCHAR2 (100) := USER;

   TYPE t_rec IS RECORD
   (
      COLUMN_NAME   VARCHAR2 (30 BYTE),
      DATA_TYPE     VARCHAR2 (106 BYTE),
      DATA_LENGTH   NUMBER
   );

   TYPE t_record IS TABLE OF t_rec;

   -- initialization of record
   v_record   t_record := t_record ();
   v_cntr     NUMBER := 0;
   v_status   NUMBER;
   sql_stmt   VARCHAR2 (2000);
BEGIN
   ---dropping Already Existing temporary table

   BEGIN
      SELECT 1
        INTO v_status
        FROM all_objects
       WHERE UPPER (object_name) = UPPER (tablname) AND owner = db_user;

      --dbms_output.put_line( v_status );

      IF v_status = 1
      THEN
         sql_stmt := 'drop table  ' || tablname || '_new';

         EXECUTE IMMEDIATE sql_stmt;
      END IF;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         DBMS_OUTPUT.put_line ('Table not found--' || tablname);
      WHEN OTHERS
      THEN
         DBMS_OUTPUT.put_line (
            'Error while dropping table-' || SQLCODE || SQLERRM);
   END;


   ---------------------------------------------------------------------------
   ---- retrieving the columns of the table
   BEGIN
        SELECT column_name, data_type, data_length
          BULK COLLECT INTO v_record
          FROM all_tab_columns
         WHERE table_name = UPPER (tablname)
      ORDER BY column_id;
   EXCEPTION
      WHEN OTHERS
      THEN
         DBMS_OUTPUT.put_line (
            'Error while retrieving the column details-' || SQLCODE || SQLERRM);
   END;


   FOR i IN 1 .. v_record.COUNT
   LOOP
      v_cntr := v_cntr + 1;

      IF v_cntr = 1
      THEN
         IF    v_record (i).data_type = 'DATE'
            OR UPPER (v_record (i).data_type) = 'TIMESTAMP(6)'
         THEN
            sql_stmt :=
                  'create table '
               || ' '
               || tablname
               || '_new'
               || '('
               || v_record (i).column_name
               || ' '
               || v_record (i).data_type
               || ')';
         ELSE
            sql_stmt :=
                  'create table '
               || ' '
               || tablname
               || '_new'
               || '('
               || v_record (i).column_name
               || ' '
               || v_record (i).data_type
               || '('
               || v_record (i).data_length
               || '))';
         END IF;

         --dbms_output.put_line(sql_stmt);
         EXECUTE IMMEDIATE sql_stmt;
      ELSE
         IF    v_record (i).data_type = 'DATE'
            OR UPPER (v_record (i).data_type) = 'TIMESTAMP(6)'
         THEN
            sql_stmt :=
                  'alter table'
               || ' '
               || tablname
               || '_new'
               || ' '
               || 'add ('
               || v_record (i).column_name
               || ' '
               || v_record (i).data_type
               || ')';
         ELSE
            sql_stmt :=
                  'alter table'
               || ' '
               || tablname
               || '_new'
               || ' '
               || 'add ('
               || v_record (i).column_name
               || ' '
               || v_record (i).data_type
               || '('
               || v_record (i).data_length
               || '))';
         END IF;

         --dbms_output.put_line(sql_stmt);
         EXECUTE IMMEDIATE sql_stmt;
      END IF;
   END LOOP;

   DBMS_OUTPUT.put_line ('Process Completed Successfully..!!');
END;                    

輸出:

SQL>  exec creat_tbl_frm_tbl('table2')
Process Completed Successfully..!!

PL/SQL procedure successfully completed.

SQL> select * from table2;

no rows selected

-- This is created with same columns as of passed table table2
SQL> select * from table2_new;     
no rows selected
SELECT col1,col2,col3 --...
INTO newTable
FROM oldTable

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM