Oracle 使用pl/sql从文本文件读取文件

Oracle 使用pl/sql从文本文件读取文件,oracle,plsql,oracle11g,plsqldeveloper,Oracle,Plsql,Oracle11g,Plsqldeveloper,我想读取文本文件,将其存储在变量中,然后以pl/sql输出变量。我正在使用以下代码,但出现错误:忽略语句 create or replace PROCEDURE blah AS DECLARE f UTL_FILE.FILE_TYPE; s VARCHAR2(200); BEGIN f := UTL_FILE.FOPEN('C:\Users\s420105\Music','blahh.txt','R'); UTL_FILE.GET_LINE(f,s); UTL_FILE.FCLOSE(f); d

我想读取文本文件,将其存储在变量中,然后以pl/sql输出变量。我正在使用以下代码,但出现错误:忽略语句

create or replace PROCEDURE blah
AS
DECLARE
f UTL_FILE.FILE_TYPE;
s VARCHAR2(200);
BEGIN
f := UTL_FILE.FOPEN('C:\Users\s420105\Music','blahh.txt','R');
UTL_FILE.GET_LINE(f,s);
UTL_FILE.FCLOSE(f);
dbms_output.put_line(s);
END;
我不确定是否有UTL权限,但我想如果是由于UTL权限,它会抛出不同的错误。有几个问题:

  • 您不需要
    DECLARE
    语句。创建[或替换]过程[schema.]的名称为。。。开始。。。结束
  • 的location参数是目录对象的句柄,而不是包含目录路径的字符串
此代码应适用于:

CREATE DIRECTORY DIR__MUSIC AS 'C:/Users/s420105/Music';
/

CREATE PROCEDURE blah
AS
  f UTL_FILE.FILE_TYPE;
  s VARCHAR2(200);
BEGIN
  f := UTL_FILE.FOPEN( 'DIR__MUSIC', 'blahh.txt', 'R', 200 );
  UTL_FILE.GET_LINE( f, s );
  UTL_FILE.FCLOSE( f );
  DBMS_OUTPUT.PUT_LINE( s );
END;
/
SHOW ERRORS;
/
读取整个文件的一种简单方法是:

CREATE DIRECTORY DIR__MUSIC AS 'C:/Users/s420105/Music';
/

CREATE PROCEDURE blah
AS
  f CLOB;
BEGIN
  f := DBMS_XSLPROCESSOR.READ2CLOB( 'DIR__MUSIC', 'blahh.txt' );
  DBMS_OUTPUT.PUT_LINE( f );
END;
/
SHOW ERRORS;
/
几个问题:

  • 您不需要
    DECLARE
    语句。创建[或替换]过程[schema.]的名称为。。。开始。。。结束
  • 的location参数是目录对象的句柄,而不是包含目录路径的字符串
此代码应适用于:

CREATE DIRECTORY DIR__MUSIC AS 'C:/Users/s420105/Music';
/

CREATE PROCEDURE blah
AS
  f UTL_FILE.FILE_TYPE;
  s VARCHAR2(200);
BEGIN
  f := UTL_FILE.FOPEN( 'DIR__MUSIC', 'blahh.txt', 'R', 200 );
  UTL_FILE.GET_LINE( f, s );
  UTL_FILE.FCLOSE( f );
  DBMS_OUTPUT.PUT_LINE( s );
END;
/
SHOW ERRORS;
/
读取整个文件的一种简单方法是:

CREATE DIRECTORY DIR__MUSIC AS 'C:/Users/s420105/Music';
/

CREATE PROCEDURE blah
AS
  f CLOB;
BEGIN
  f := DBMS_XSLPROCESSOR.READ2CLOB( 'DIR__MUSIC', 'blahh.txt' );
  DBMS_OUTPUT.PUT_LINE( f );
END;
/
SHOW ERRORS;
/

谢谢你的解释。当我尝试执行您的代码时,您的代码编译没有错误,但我得到了运行时错误无效的文件操作,并且对于以前的代码有错误:数字或值错误字符到数字转换错误。包含
ORA-
number的完整错误消息是什么?此外,用户(正在编译/运行该过程的用户)是否已获得该目录的读取权限?尝试
将目录dir\uu music上的READ授予用户名(来自具有适当权限的用户)。它是本地目录,不认为存在任何权限问题。错误详细信息是:ORA-29283:无效文件操作ORA-06512:在“SYS.UTL_file”第536行ORA-29283:无效文件操作ORA-06512:在“XDB.DBMS_XSLPROCESSOR”第265行ORA-06512:在“d743721.BLAH”第5行ORA-06512:在第2行这不是SQL的问题,而是权限问题。您需要检查(a)目录是否存在(b)您是否有权从目录中读取(c)文件是否存在(d)您是否有权读取文件(尝试通过操作系统打开),以及(e)oracle用户是否有权打开文件(运行
GRANT
命令)。我建议您在网上搜索
ORA-29283
,并查看人们建议的修复权限的方法。谢谢您的解释。当我尝试执行您的代码时,您的代码编译没有错误,但我得到了运行时错误无效的文件操作,并且对于以前的代码有错误:数字或值错误字符到数字转换错误。包含
ORA-
number的完整错误消息是什么?此外,用户(正在编译/运行该过程的用户)是否已获得该目录的读取权限?尝试
将目录dir\uu music上的READ授予用户名(来自具有适当权限的用户)。它是本地目录,不认为存在任何权限问题。错误详细信息是:ORA-29283:无效文件操作ORA-06512:在“SYS.UTL_file”第536行ORA-29283:无效文件操作ORA-06512:在“XDB.DBMS_XSLPROCESSOR”第265行ORA-06512:在“d743721.BLAH”第5行ORA-06512:在第2行这不是SQL的问题,而是权限问题。您需要检查(a)目录是否存在(b)您是否有权从目录中读取(c)文件是否存在(d)您是否有权读取文件(尝试通过操作系统打开),以及(e)oracle用户是否有权打开文件(运行
GRANT
命令)。我建议在网上搜索
ORA-29283
,查看人们建议的修复权限的方法。