1

rowtypeパラメータとしてaに渡されるテーブル名のaを作成することは可能ですか?また、ステートメントStored-Procedureでそれらをアドレス指定する列をどのように知ることができますか?DBMS_OUUTPUT.PUT_LINE()

エンドユーザーは、任意のユーザー名(スキーマ)とテーブル名を指定できます

以下のようなことをしたいのですが、うまくいきません。

 CREATE OR REPLACE PROCEDURE SP_PASS(USER_NAME VARCHAR2,TAB_NAME IN VARCHAR2)
 AS
    TYPE REF_CUR IS REF CURSOR;
    V_ARR REF_CUR;
    V_SQL VARCHAR(200);
    V_ROWTYPE USER_NAME.TAB_NAME%ROWTYPE;
 BEGIN
     V_SQL := 'SELECT * FROM '||USER_NAME||'.'||TAB_NAME;
     OPEN V_ARR FOR V_SQL;
     LOOP
     FETCH V_ARR INTO V_ROWTYPE;
     EXIT WHEN V_ARR%NOT FOUND;
     DBMS_OUTPUT.PUT_LINE(V_ROWTYPE.COL1||','||V_ROWTYPE.COL2||','||V_ROWTYPE.COL3);
     END LOOP;
     CLOSE V_ARR;
END;

可能かどうか教えてください。

ありがとう。

4

1 に答える 1

6

%ROWTYPEコンパイル時にテーブル名がわからない場合、未知のテーブルの変数を作成したり、列名を静的に参照したりすることはできません。

dbms_sql パッケージを使用して、完全に動的な SQL ステートメントを処理できます。SQL ステートメントを準備し、列を記述して列の数とそのデータ型を調べ、適切な変数をバインドして、データを取得する必要があります。投稿した例よりもはるかに面倒なコードの記述方法ですが、極端な柔軟性が得られます。

リンク先のドキュメントには、dbms_sql パッケージの使用例が多数あります。を使用して任意のクエリの結果を CSV ファイルに書き込むTom Kyte のdump_csv 関数UTL_FILEも確認してください。本当にデータを に書き込みたい場合は、呼び出しを にDBMS_OUTPUT置き換えるだけです。しかし、データをバッファに書き込むだけでなく、もっと便利なことをしたいと思っていることは間違いないので、トムの手順はおそらくあなたが実際に達成しようとしていることに近いでしょう。UTL_FILEDBMS_OUTPUTDBMS_OUTPUT

于 2012-08-09T21:23:16.667 に答える