0

https://dba.stackexchange.com/questions/3587/oracle-automate-export-unload-of-dataで良い質問を見つけました。そのような構造を使用することは有効ですか?

FOR r IN (SELECT * FROM table) LOOP
   UTL_FILE.PUT_LINE(lfFilelog, r.row);
END LOOP;

私はこのようなものを使おうとしています:

CREATE OR REPLACE PROCEDURE p_name(DESTFOLDER in varchar2, FILENAME in varchar2)
IS
    V_FILEHANDLE UTL_FILE.FILE_TYPE;
    CURSOR dataset IS 
        SELECT 
            field1, 
            field2, 
            fieldN 
        FROM 
            table1, 
            table2, 
            (SELECT field3 from table3);
        -- WHERE CLAUSE ... and so on..
BEGIN
    V_FILEHANDLE := UTL_FILE.FOPEN(DESTFOLDER, FILENAME, 'w');
    FOR R IN dataset LOOP
        UTL_FILE.PUT_LINE(V_FILEHANDLE, R.ROW);
    END LOOP;
END;
/

コンポーネントpls-00302を定義する必要があることを示すエラーが発生します。ROW私が理解できない限り、このフィールドはクエリにすでに存在しているはずです。私は正しいですか?

カーソルから単純に行を書き込むことはできますか?

4

1 に答える 1

1

言及された答えは完全ではありません。実装の詳細が欠けている例(疑似コード)として与えられたと思います。

そのまま:

  • あなたのSELECT句は無効です。何も選択していません。何を選択しますか?
  • カーソルである構文XX.rowxx存在しません
  • さらに、このUTL_FILE.get_line手続きはVARCHAR22 番目の引数としてa を受け入れます。rowtype
  • テーブルに名前を付けることはできませんtable(名前を付けることはできますが"table")。

mytable(col1, col2, ... , colN)あなたが書くことができるテーブルを考えると:

CREATE OR REPLACE PROCEDURE p_name()
IS
    V_FILEHANDLE UTL_FILE.FILE_TYPE;
    CURSOR dataset IS SELECT col1, col2, /*...*/ coln FROM mytable;
BEGIN
    /*utl_file.fopen maybe?*/
    FOR R IN dataset LOOP
        UTL_FILE.PUT_LINE(V_FILEHANDLE, R.col1 ||';'|| r.col2 /*...*/ || r.coln);
    END LOOP;
END;
于 2013-02-12T13:17:20.957 に答える