2016-04-18 12 views
1

私はOracleで次の手順を持っている:PL/SQLプロシージャから 'describe table_name'コマンドを実行するにはどうすればよいですか?

create procedure clone_tables 
(current_table_name varchar2, cloned_table_name varchar2); 

私はテーブルのクローンを作成する必要がありますが、私はそれが名前だだけ受け取ります。 この場合、私はそれが構造だと思うので、describe table_nameコマンドで十分でしょう。 execute immediateまたはdbms_sql.execute()は、SQL文だけを使用します。

私はこれを行うことができる別の方法はありますか?

答えて

0

DESCRIBE(...)に言及しているので、SQL * PlusまたはToadやSQL DeveloperなどのSQL * Plusコマンドを理解するグラフィカル・プログラムを使用している必要があります。残念ながら、DESCRIBEはSQL * Plusコマンドであり、SQLまたはPL/SQLコマンドではないため、SQLまたはPL/SQLでDESCRIBEコマンドを実行することはできません。

SQL DeveloperまたはToadを使用している場合は、テーブルを呼び出す機能があり、SQLを提供します(PL/SQLではなく、必要ありません。単純で非常に高速なSQLが必要です)制約とコメントを含めてテーブルを再作成します。以下では、SQL Developerでこの機能を使用した結果を、実際のSQLテーブルで再現します。これは、データではなくテーブル構造を作成するだけです。

INSERT INTO (new_table) (SELECT * FROM old_table) 

などのデータをコピーする必要があります。Alexsejのソリューションを上回る利点は、データ型が正確にコピーされることです。 Aleksejのソリューションでは、列は必ずしも完全に同じではありません - [たとえば、古い表ではVARCHAR2(300)列があります。 ] Alex Pooleがコメントで指摘したように、私がここで言ったように(in大括弧)は不正です.Aleksejのソリューションを使用してテーブルをクローンすると、カラムの幅などが保持されます。(彼の方法では、NOT NULLやUNIQUEのような制約はコピーされません)

推奨する方法では、トリガーは再作成されませんが、制約とインデックスが再作成されます。

CREATE TABLE "INTRO"."COURSES" 
    ( "CODE" VARCHAR2(6 BYTE) NOT NULL ENABLE, 
    "DESCRIPTION" VARCHAR2(30 BYTE) NOT NULL ENABLE, 
    "CATEGORY" CHAR(3 BYTE) NOT NULL ENABLE, 
    "DURATION" NUMBER(2,0) NOT NULL ENABLE, 
    CONSTRAINT "COURSES_PK" PRIMARY KEY ("CODE") 
    USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
    STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
    TABLESPACE "SYSTEM" ENABLE, 
    CONSTRAINT "COURSES_CAT_CHK" CHECK (CATEGORY in ('GEN','BLD','DSG')) ENABLE 
    ) SEGMENT CREATION IMMEDIATE 
    PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING 
    STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
    TABLESPACE "SYSTEM" ; 

    COMMENT ON COLUMN "INTRO"."COURSES"."CODE" IS 'Unique course code'; 
    COMMENT ON COLUMN "INTRO"."COURSES"."DESCRIPTION" IS 'Course description (title)'; 
    COMMENT ON COLUMN "INTRO"."COURSES"."CATEGORY" IS 'Course category (GEN, BLD or DSG)'; 
    COMMENT ON COLUMN "INTRO"."COURSES"."DURATION" IS 'Course duration (in days)'; 

幸運:ここ

は、SQL Developerはあなたの部分の努力で、あなたのために何ができるかの一例です!

+0

ちなみに、単純なSQL \ * Plusを使用していて、グラフィカルインターフェイスではない場合、もう少し作業をしても同じことができます。どちらか一方に助言してください。 – mathguy

+0

CTASに関する最初のコメントは間違っています。データ型は正確にコピーされます。また、これはPL/SQLのようなものなので、クライアント機能の使用は範囲外である可能性があります。 (もちろん質問には言及していませんが)。 –

+0

ああ、わかりました。私は私の答えでそれを言及するでしょう。これがPL/SQLエクササイズであることについては、もちろん正しいかもしれません。私は「私はそれをやることができる別の方法はありますか」と解釈しました。彼/彼女は必ずしもPL/SQLではない、あらゆる手段を探していることを意味します。実際、フォーラムの参加者がそのようなツール(どのようなツールも)を使用する方法を学ぶならば、私は非常に満足しています。誰もが簡単にテストテーブルを作成して挿入することができます。だからもし私の(そして他の人たちの)答えがOP以外の人たちにこれをするよう奨励したら...私は幸せになるでしょう!おかげで、mathguy-ro – mathguy

2

あなたがテーブルのクローンを構築する必要がある場合は、あなたが使用することができます。

create or replace procedure clone_tables (current_table_name varchar2, 
              cloned_table_name varchar2 
             ) as 
begin 
    execute immediate 
     'create table ' || cloned_table_name || 
     ' as select * from ' || current_table_name 
     ' where 1 = 0 ' ; /* to avoid copying records */ 
end; 
/

これは、すべての列をスキャンを必要とせず、開始1のまったく同じ列を持つテーブルを構築します。この方法では、開始テーブルのレコードをコピーしません。レコードをコピーする場合は、WHEREの条件を削除するだけです。 Alex Pooleによって正しく述べられているように、これはクローンテーブルを作成するだけですが、クローンテーブルに存在するトリガ、インデックス、外部キーなどは作成しません。

関連する問題