Stored procedures SQL命令未正确结束?如何在oracle中使用游标?

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

我试图保存到计算机上的文件,但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 := 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;
/