我对SQL还是个新手,但我想创建一个将完整表导出为CSV的过程。我当前的SQL代码如下所示(Oracle SQL Developer):
CREATE OR REPLACE PROCEDURE DBPW_TEST (
p_directory VARCHAR2,
p_tabname VARCHAR2,
p_schema VARCHAR2 DEFAULT USER)
IS
tab_refcur SYS_REFCURSOR;
l_header VARCHAR2(4000);
l_zeile VARCHAR2(4000);
l_col_list VARCHAR2(4000);
l_stmt VARCHAR2(4000);
l_file UTL_FILE.FILE_TYPE;
BEGIN
l_file := UTL_FILE.FOPEN(
location => UPPER(p_directory),
filename => p_tabname||'_'||TO_CHAR(sysdate,'yyyy-mm-dd-hh24-mi')||'.csv',
open_mode => 'w',
max_linesize => 32767);
-- Zusammenstellung der Spaltenliste für die Überschriften-Zeile
l_header := col_list(
p_tabname => p_tabname,
p_schema => p_schema,
p_delim => ';');
-- Die Überschriften werden in die Datei geschrieben
UTL_FILE.PUT_LINE(l_file, l_header);
-- Zusammenstellung der Spaltenliste für den Select
l_col_list := col_list(
p_tabname => p_tabname,
p_schema => p_schema ,
p_delim => q'[||';'||]', -- alternativ '||'';''||'
p_trim => 1);
l_stmt := 'SELECT '||l_col_list||' FROM '||p_schema||'.'||p_tabname;
-- Über den Ref Cursor werden die Spalteninhalte jeder Zeile
-- als Strings aneinandergehängt
OPEN tab_refcur FOR l_stmt;
LOOP
-- und in die Variable eingelesen
FETCH tab_refcur INTO l_zeile;
EXIT WHEN tab_refcur%NOTFOUND;
-- mit der Prozedur PUT_LINE wird Zeile für Zeile geschrieben
UTL_FILE.PUT_LINE(l_file, l_zeile);
END LOOP;
CLOSE tab_refcur;
UTL_FILE.FCLOSE(l_file);
EXCEPTION
WHEN OTHERS THEN
-- hier sollte natürlich eine vernünftige Fehleraufzeichnung passieren
DBMS_OUTPUT.PUT_LINE(SQLERRM);
UTL_FILE.FCLOSE(l_file);
RAISE;
END DBPW_TEST;
不幸的是,我收到错误消息PLS-00201:ID 'COL_LIST'。我不清楚如何或是否必须定义这一点。
有人能给予我一个提示/解决方案吗?
许多问候
我曾尝试在网上寻找解决方案并调整剧本,但遗憾的是没有成功
1条答案
按热度按时间qltillow1#
在你的代码中有两个“col_list“:
l_col_list
这是第二个似乎是“未知”的。什么是
col_list
?它是否存在于您的架构中?你有权限访问它吗(如果其他人拥有它)?据我所知,它不是一个内置函数。