Oracle

在 UTL_FILE 中動態設置列

  • April 11, 2018

我一直被這個問題困擾,所以我現在正在尋求幫助。

我正在嘗試從使用 PL/SQL 的查詢中獲取 .cvs 文件。我正在使用游標和 UTL_FILE 來實現這一點。問題是我必須將所有列名傳遞給 UTL_FILE.PUT_LINE(),並且有一些列是動態設置的,所以我不知道如何將這些列傳遞給 UTL_FILE。

我試圖用這些列建構一個字元串,但它不起作用。例子:

   FOR pointer IN (SELECT column1, column2, **piece_of_query_with_dynamic_columns**, column3 FROM table1)

   LOOP
     UTL_FILE.PUT_LINE(v_file, pointer.column1|| ',' ||pointer.column2|| ',' ||**string_with_dynamic_columns**|| ',' ||pointer.column3);
   END LOOP; 
UTL_FILE.FCLOSE(v_file);

查詢執行良好,除了那些動態列,我可以得到 .cvs 文件。

有什麼建議麼?

我希望我能很好地解釋自己

它會是這樣的:

DECLARE
   cur SYS_FERCURSOR;
   curid NUMBER;
   desctab DBMS_SQL.DESC_TAB;
   colcnt NUMBER; -- total number of columns
   res NUMBER;

   namevar VARCHAR2(4000);
   numvar NUMBER;
   datevar DATE;
   ... more IF NEEDED
BEGIN

   OPEN cur FOR 'SELECT column1, column2, **piece_of_query_with_dynamic_columns**, column3 FROM table1';               
   curid := DBMS_SQL.TO_CURSOR_NUMBER (cur);

   DBMS_SQL.DESCRIBE_COLUMNS(curid, colcnt, desctab);
   FOR i IN 1..colcnt LOOP -- loop over all columns
       IF desctab(i).col_type = 1 THEN
           DBMS_SQL.DEFINE_COLUMN(curid, i, namevar);
       ELSIF desctab(i).col_type = 2 THEN
           DBMS_SQL.DEFINE_COLUMN(curid, i, numvar);
       ELSIF desctab(i).col_type = 12 THEN
           DBMS_SQL.DEFINE_COLUMN(curid, i, datevar);
       ELSIF desctab(i).col_type = ... THEN            
           .......
       END IF;         
   END LOOP;
   -- Fetch Rows
   WHILE DBMS_SQL.FETCH_ROWS(curid) > 0 LOOP
       FOR i IN 1 .. colcnt LOOP
          IF (desctab(i).col_type = 1) THEN
             DBMS_SQL.COLUMN_VALUE(curid, i, namevar);
             UTL_FILE.PUT(v_file, namevar|| ',');
          ELSIF (desctab(i).col_type = 2) THEN
             DBMS_SQL.COLUMN_VALUE(curid, i, numvar);
             UTL_FILE.PUT(v_file, numvar|| ',');
          ELSIF (desctab(i).col_type = 12) THEN
             DBMS_SQL.COLUMN_VALUE(curid, i, datevar);
             UTL_FILE.PUT(v_file, datevar|| ',');
          ELSIF ....
             ...
          END IF;          
      END LOOP;
      UTL_FILE.NEW_LINE;
   END LOOP;    
   DBMS_SQL.CLOSE_CURSOR(curid);

END;

為了修剪最後一個逗號,您可以使用

IF i < colcnt THEN
   UTL_FILE.PUT(v_file, namevar|| ',');
ELSE
   UTL_FILE.PUT(v_file, namevar);
END IF;

引用自:https://dba.stackexchange.com/questions/203554