Oracle
在 UTL_FILE 中動態設置列
我一直被這個問題困擾,所以我現在正在尋求幫助。
我正在嘗試從使用 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;