Stored procedures SQL命令未正确结束?如何在oracle中使用游标?
我试图保存到计算机上的文件,但select语句出现此错误 代码如下:Stored procedures SQL命令未正确结束?如何在oracle中使用游标?,stored-procedures,oracle11g,flat-file,Stored Procedures,Oracle11g,Flat File,我试图保存到计算机上的文件,但select语句出现此错误 代码如下: CREATE OR REPLACE PROCEDURE export_cust(dir VARCHAR2, file_name VARCHAR2, tblname VARCHAR2) IS CURSOR cur IS SELECT * FROM tblname AS row_value; file UTL_FILE.FILE_TYPE; BEGIN -- Open the file for writing file
CREATE OR REPLACE PROCEDURE export_cust(dir VARCHAR2, file_name VARCHAR2, tblname VARCHAR2)
IS
CURSOR cur IS SELECT * FROM tblname AS row_value;
file UTL_FILE.FILE_TYPE;
BEGIN
-- Open the file for writing
file := UTL_FILE.FOPEN(UPPER(dir), file_name, 'w', 32767);
-- Export rows one by one
FOR rec IN cur LOOP
-- All columns were concatenated into single value in SELECT
UTL_FILE.PUT_LINE(file, rec.row_value);
END LOOP;
UTL_FILE.FCLOSE(file);
END;
/
我希望用户选择一个目录、文件名以及要从中导出的表。另外,如何在oracle 11g中利用逐行处理。我不确定我在这里做得是否正确首先您应该使用目录对象来写入文件。有关更多详细信息,请参阅。将目录名称作为参数传递
CREATE DIRECTORY tmp_dir AS '<your path here>';
你可以用
SELECT col1||','||col2 as row_value FROM tab;
因此,如果对表名进行参数化,则仅当所有表都包含col1
和col2
时,此操作才有效-否则,您需要传递额外的参数来定义如何构建行值
最后要参数化光标中的表名,需要
这将导致以下程序:
CREATE OR REPLACE PROCEDURE export_cust(dir VARCHAR2, file_name VARCHAR2, tblname VARCHAR2)
IS
TYPE TabCurTyp IS REF CURSOR;
cur TabCurTyp;
row_value varchar2(4000);
file UTL_FILE.FILE_TYPE;
BEGIN
file := UTL_FILE.FOPEN(UPPER(dir), file_name, 'w', 32767);
OPEN cur FOR 'SELECT col1||'',''||col2 as row_value FROM '|| tblname;
LOOP
FETCH cur INTO row_value;
EXIT WHEN cur%NOTFOUND;
UTL_FILE.PUT_LINE(file, row_value);
END LOOP;
UTL_FILE.FCLOSE(file);
END;
/
您还可以检查一些现有的CSV导出器脚本。第3行中有一个问题,
tblname AS row\u value代码>。AS
关键字仅在SELECT
子句中受支持,而在WHERE
子句中不受支持。删除AS
,它应该可以工作。我删除了AS,但我正在获取的表不存在,循环索引变量“REC”的使用无效
SELECT col1||','||col2 as row_value FROM tab;
CREATE OR REPLACE PROCEDURE export_cust(dir VARCHAR2, file_name VARCHAR2, tblname VARCHAR2)
IS
TYPE TabCurTyp IS REF CURSOR;
cur TabCurTyp;
row_value varchar2(4000);
file UTL_FILE.FILE_TYPE;
BEGIN
file := UTL_FILE.FOPEN(UPPER(dir), file_name, 'w', 32767);
OPEN cur FOR 'SELECT col1||'',''||col2 as row_value FROM '|| tblname;
LOOP
FETCH cur INTO row_value;
EXIT WHEN cur%NOTFOUND;
UTL_FILE.PUT_LINE(file, row_value);
END LOOP;
UTL_FILE.FCLOSE(file);
END;
/