我写一个程序在Oracle表中创建与数据的CSV文件。 我用"spool filename;"
但一个错误来了。 我可以使用spool
在PL / SQL?
Answer 1:
我认为有实现这个Oracle 10g上/11克更好的方法,但这应该工作在Oracle 9i上或更高的罚款:
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;
/
Answer 2:
阀芯是SQLPLUS命令。 它不能在PL / SQL使用。
看来你一直在尝试各种不同的方式来获得甲骨文做你的格式和文件保存。 为什么不把你的程序正在调用PROC为你做这项工作?
Answer 3:
如果你只需要在CVS文件中的数据,你可以这样做:
创建这样的查询SQL文件:
set feedback off verify off heading off pagesize 0
select field1 || ',' || field2 ... from table;
quit;
/
然后,从这样一个终端呼叫的sqlplus:
sqlplus -S user/password @file.sql> cvsfile.cvs
Answer 4:
不,阀芯是SQL Plus命令,所以你就必须做到这一点在SQL加:
spool myfile.txt
exec myproc
spool off
你可能还需要在启动过程中如之前设置某些值
set pagesize 0 linesize 1000 trimspool on
......以获得正确的格式。
Answer 5:
这里有几个你可能会发现有用的链接:
PL / SQL教程和SQL * Plus用户指南(11克)
Answer 6:
创建一个ASCII文件: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:459020243348和http://asktom.oracle.com/pls/asktom/在fp = 100:11:0 :::: P11_QUESTION_ID:68212348056和http://www.oracle-developer.net/display.php?id=425 。
文章来源: Can you help me write a procedure in Oracle to spool data from a table to a CSV file?