我看过asktom,那个jeffsmith,并且在这个网站上,但我仍然不清楚。在我使用过的其他工具中,使用b / c会很困惑。
我有一个脚本从我的数据库(Oracle)中的数据创建一个小表,我想在脚本的末尾包含语法,将我刚刚创建的表作为csv文件导出到我的计算机。我宁愿在脚本的末尾有这个,而不是存储过程或类似的东西,b / c我必须经常更改我保存csv文件的位置,我只是喜欢这样做。
类似的东西:
SELECT /*csv*/ *
FROM table_name
EXPORT/OUTPUT/SAVE TO filepath.csv
我可以用R,SPSS,STATA,SAS做一两行。这样的东西就是我要找的东西。我想我可能需要指定格式,引号,标题或分隔符,但我不确定在SELECT语句中给出了csv修饰符。我觉得这是第2天的东西,但由于某种原因,我找不到一个简单的答案。
提前谢谢。
答案 0 :(得分:0)
创建如下所示的包
CREATE OR REPLACE PACKAGE APPS.csv AS
PROCEDURE generate (p_dir IN VARCHAR2,
p_file IN VARCHAR2,
p_query IN VARCHAR2);
PROCEDURE generate_rc (p_dir IN VARCHAR2,
p_file IN VARCHAR2,
p_refcursor IN OUT SYS_REFCURSOR);
PROCEDURE set_separator (p_sep IN VARCHAR2);
END csv;
/
CREATE OR REPLACE PACKAGE BODY APPS.csv AS
g_sep VARCHAR2(5) := ',';
-- Prototype for hidden procedure.
PROCEDURE generate_all (p_dir IN VARCHAR2,
p_file IN VARCHAR2,
p_query IN VARCHAR2,
p_refcursor IN OUT SYS_REFCURSOR);
-- Stub to generate a CSV from a query.
PROCEDURE generate (p_dir IN VARCHAR2,
p_file IN VARCHAR2,
p_query IN VARCHAR2) AS
l_cursor SYS_REFCURSOR;
BEGIN
generate_all (p_dir => p_dir,
p_file => p_file,
p_query => p_query,
p_refcursor => l_cursor);
END generate;
-- Stub to generate a CVS from a REF CURSOR.
PROCEDURE generate_rc (p_dir IN VARCHAR2,
p_file IN VARCHAR2,
p_refcursor IN OUT SYS_REFCURSOR) AS
BEGIN
generate_all (p_dir => p_dir,
p_file => p_file,
p_query => NULL,
p_refcursor => p_refcursor);
END generate_rc;
-- Do the actual work.
PROCEDURE generate_all (p_dir IN VARCHAR2,
p_file IN VARCHAR2,
p_query IN VARCHAR2,
p_refcursor IN OUT SYS_REFCURSOR) AS
l_cursor PLS_INTEGER;
l_rows PLS_INTEGER;
l_col_cnt PLS_INTEGER;
l_desc_tab DBMS_SQL.desc_tab;
l_buffer VARCHAR2(32767);
l_file UTL_FILE.file_type;
BEGIN
IF p_query IS NOT NULL THEN
l_cursor := DBMS_SQL.open_cursor;
DBMS_SQL.parse(l_cursor, p_query, DBMS_SQL.native);
ELSIF p_refcursor%ISOPEN THEN
l_cursor := DBMS_SQL.to_cursor_number(p_refcursor);
ELSE
RAISE_APPLICATION_ERROR(-20000, 'You must specify a query or a REF CURSOR.');
END IF;
DBMS_SQL.describe_columns (l_cursor, l_col_cnt, l_desc_tab);
FOR i IN 1 .. l_col_cnt LOOP
DBMS_SQL.define_column(l_cursor, i, l_buffer, 32767 );
END LOOP;
IF p_query IS NOT NULL THEN
l_rows := DBMS_SQL.execute(l_cursor);
END IF;
l_file := UTL_FILE.fopen(p_dir, p_file, 'w', 32767);
-- Output the column names.
FOR i IN 1 .. l_col_cnt LOOP
IF i > 1 THEN
UTL_FILE.put(l_file, g_sep);
END IF;
UTL_FILE.put(l_file, l_desc_tab(i).col_name);
END LOOP;
UTL_FILE.new_line(l_file);
-- Output the data.
LOOP
EXIT WHEN DBMS_SQL.fetch_rows(l_cursor) = 0;
FOR i IN 1 .. l_col_cnt LOOP
IF i > 1 THEN
UTL_FILE.put(l_file, g_sep);
END IF;
DBMS_SQL.COLUMN_VALUE(l_cursor, i, l_buffer);
UTL_FILE.put(l_file, l_buffer);
END LOOP;
UTL_FILE.new_line(l_file);
END LOOP;
UTL_FILE.fclose(l_file);
DBMS_SQL.close_cursor(l_cursor);
EXCEPTION
WHEN OTHERS THEN
IF UTL_FILE.is_open(l_file) THEN
UTL_FILE.fclose(l_file);
END IF;
IF DBMS_SQL.is_open(l_cursor) THEN
DBMS_SQL.close_cursor(l_cursor);
END IF;
DBMS_OUTPUT.put_line('ERROR: ' || DBMS_UTILITY.format_error_backtrace);
RAISE;
END generate_all;
-- Alter separator from default.
PROCEDURE set_separator (p_sep IN VARCHAR2) AS
BEGIN
g_sep := p_sep;
END set_separator;
END csv;
/
在数据库中创建一个像这样的目录
CREATE OR REPLACE DIRECTORY EXTRACT_DIR AS 'c:\oracle\extract';
GRANT READ, WRITE ON DIRECTORY EXTRACT_DIR TO SCOTT;
GRANT EXECUTE ON UTL_FILE TO SCOTT;
EXEC csv.generate('EXTRACT_DIR', 'emp.csv', p_query => 'SELECT * FROM emp');
希望这有助于将表数据提取到所需位置的csv
答案 1 :(得分:0)
这就像我回答自己的问题一样接近。
SET FEEDBACK OFF
SELECT /*csv*/
var1, var2, var3...varX
FROM
tablename;
在Oracle中以脚本(F5)运行,它将以csv格式生成脚本输出,而不会在输出中生成任何注释或文档。从那里,单击小磁盘图标,另存为“所有文件”并将.csv扩展名添加到文件名结尾。
...我很惊讶没有2-3行语法片段在locationY中输出查询或脚本的结果作为formatX。但我想没有。
感谢发表评论的人。