2016-05-16 9 views
0

カーソルを使用してプロシージャ内でロジックを作成して、すべてのテーブルのデータベースビューを作成し、スキーマ内のすべてのテーブルに対してHISTORY_DATEという新しいカラムを作成しようとしています。私は以下のロジックを構築するのに役立つ必要があります。ビューを作成してすべてのテーブルで変更する

create or replace PROCEDURE ALTER_TABLES(
    RC OUT INT 
    ,MSG OUT VARCHAR) 
AS 
BEGIN 

DECLARE 

CURSOR TBL_CUR IS 
    SELECT TABLE_NAME FROM USER_TABLES; 
TBL_REC TBL_CUR%ROWTYPE; 
SQL_STMT VARCHAR(2000); 

BEGIN 
    OPEN TBL_CUR; 
    LOOP 
     FETCH TBL_CUR INTO TBL_REC; 
     EXIT WHEN TBL_CUR%NOTFOUND; 

     PRINT_DETAILS(TBL_REC.TABLE_NAME);    


     SQL_STMT:= 'ALTER TABLE ' 
     || TBL_REC.TABLE_NAME 
     || ' ADD HISTORY_DATE DATE' 
     || ' AND' 
     || ' CREATE OR REPLACE VIEW all_tbl AS' 
     || ' SELECT *' 
     || ' FROM USER_TABLES' 
     ; 

     PRINT_DETAILS(SQL_STMT); 
     EXECUTE IMMEDIATE SQL_STMT; 


    END LOOP; 
    CLOSE TBL_CUR; 

    rollback; 

END; 

END; 
+0

これらは個別の記述として行う必要があります。 –

答えて

0

ビューを1回だけ作成したいだけです。 Gordon Linoffが言いましたように、あなたはすぐに2つのことをすることはできません。だから、ループの外でビューの作成を取る;このような何か(未テスト): - これだけUSER_TABLESを使用する - 今すぐ

create or replace PROCEDURE ALTER_TABLES(RC OUT INT 
            ,MSG OUT VARCHAR) 
AS 
BEGIN 

DECLARE 

CURSOR TBL_CUR IS 
SELECT TABLE_NAME FROM USER_TABLES; 
TBL_REC TBL_CUR%ROWTYPE; 
SQL_STMT VARCHAR(2000); 

BEGIN 
      SQL_STMT := 'CREATE OR REPLACE VIEW all_tbl AS' 
       || ' SELECT *' 
       || ' FROM USER_TABLES'; 
      PRINT_DETAILS(SQL_STMT); 
      EXECUTE IMMEDIATE SQL_STMT; 

      OPEN TBL_CUR; 
       LOOP 
       FETCH TBL_CUR INTO TBL_REC; 
       EXIT WHEN TBL_CUR%NOTFOUND; 

       PRINT_DETAILS(TBL_REC.TABLE_NAME);    


       SQL_STMT:= 'ALTER TABLE ' 
       || TBL_REC.TABLE_NAME 
       || ' ADD (HISTORY_DATE DATE)' 
       ; 

        PRINT_DETAILS(SQL_STMT); 
        EXECUTE IMMEDIATE SQL_STMT; 


       END LOOP; 
      CLOSE TBL_CUR; 

--rollback; 

END; 

、私はそれがすべてのようビューall_tblを作成する必要が表示されていないが、ビューUSER_TABLESのコピーですが、私そこに作成が残っているので、USER_TABLESまたは特定の行から特定の列のみが必要な場合は、その列を配置する場所を知っています。

+0

私はすべてのテーブルのビューを作成する必要があります。そのため、私はそれをループに入れます。また、私はこれをダイナミックにしたいと思っていました。ユーザーからどのような入力を求める必要がありますか? –

+0

BTW ....すべての助けをありがとう。私はとても感謝しています! –

+0

だから、user_tablesの各テーブルに対して1つのビューを作成しますか?ユーザーからのどのような入力は、ユーザーが必要とするものに依存しますか? 1つのアイデアは、ビューは、行の数に関係なく、表の10行を戻すことができないことです。ほとんどの場合、テーブル固有のものになり、コード化するのが難しくなります。 –

関連する問題