sql >> データベース >  >> RDS >> Oracle

テーブルからCSVファイルにデータをスプールするプロシージャをOracleで作成するのを手伝ってもらえますか?

    Oracle 10g / 11gでこれを実装するためのより良い方法があると思いますが、これはOracle9i以降では正常に機能するはずです。

    CREATE OR REPLACE PROCEDURE prc_file_mult_column_generate(
    p_file_dir         VARCHAR2, -- mandatory (Oracle directory name)
    p_file_name     VARCHAR2, -- mandatory
    p_sql_query        VARCHAR2, -- Multiple column SQL SELECT statement that needs to be executed and processed
    p_delimiter     CHAR      -- column delimiter
    )
    AS
    
    l_cursor_handle  INTEGER;
    l_dummy              NUMBER;
    l_col_cnt          INTEGER;
    l_rec_tab            DBMS_SQL.DESC_TAB;
    l_current_col      NUMBER(16);
    l_current_line   VARCHAR2(2047);
    l_column_value   VARCHAR2(300);
    
    l_file_handle      UTL_FILE.FILE_TYPE;
    l_print_text       VARCHAR2(100);
    l_record_count   NUMBER(16) := 0;
    
    BEGIN
    
       /* Open file for append*/
       l_file_handle := UTL_FILE.FOPEN(p_file_dir, p_file_name, 'a', 2047); --Append Mode, 2047 chars per line max, possibly increasable
    
       l_cursor_handle := DBMS_SQL.OPEN_CURSOR;
       DBMS_SQL.PARSE(l_cursor_handle, p_sql_query, DBMS_SQL.native);
       l_dummy := DBMS_SQL.EXECUTE(l_cursor_handle);
    
       /* Output column names and define them for latter retrieval of data */
       DBMS_SQL.DESCRIBE_COLUMNS(l_cursor_handle, l_col_cnt, l_rec_tab); -- get column names
    
       /* Append to file column headers */
       l_current_col := l_rec_tab.FIRST;
       IF (l_current_col IS NOT NULL) THEN
          LOOP
             DBMS_SQL.DEFINE_COLUMN(l_cursor_handle, l_current_col, l_column_value, 300);
             l_print_text := l_rec_tab(l_current_col).col_name || p_delimiter;
             UTL_FILE.PUT (l_file_handle, l_print_text);
             l_current_col := l_rec_tab.NEXT(l_current_col);
             EXIT WHEN (l_current_col IS NULL);
          END LOOP;
       END IF;
       UTL_FILE.PUT_LINE (l_file_handle,' ');
    
       /* Append data for each row */
       LOOP
          EXIT WHEN DBMS_SQL.FETCH_ROWS(l_cursor_handle) = 0; -- no more rows to be fetched
    
          l_current_line := '';
          /* Append data for each column */
          FOR l_current_col IN 1..l_col_cnt LOOP
             DBMS_SQL.COLUMN_VALUE (l_cursor_handle, l_current_col, l_column_value);
             l_print_text := l_column_value || p_delimiter;
    
             l_current_line := l_current_line || l_column_value || p_delimiter;
          END LOOP;
          l_record_count := l_record_count + 1;
          UTL_FILE.PUT_LINE (l_file_handle, l_current_line);
       END LOOP;
    
       UTL_FILE.FCLOSE (l_file_handle);
       DBMS_SQL.CLOSE_CURSOR(l_cursor_handle);
    
    EXCEPTION
       WHEN OTHERS THEN
    
       -- Release resources
       IF DBMS_SQL.IS_OPEN(l_cursor_handle) THEN
          DBMS_SQL.CLOSE_CURSOR(l_cursor_handle);
       END IF;
    
       IF UTL_FILE.IS_OPEN (l_file_handle) THEN
          UTL_FILE.FCLOSE (l_file_handle);
       END IF;
    
       --RAISE ;
       DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.format_error_stack);
    
    END;
    /
    


    1. MySQLテーブルをCSVファイルにエクスポートする

    2. Oracleデータベースへの一括挿入:どちらが良いですか:FORカーソルループまたは単純な選択?

    3. いつテーブル値関数を使用しますか?

    4. PostgreSQLが実行されたクエリを確認する方法