【问题标题】:PL/SQL UTL_FILE read trouble on anonymous blockPL/SQL UTL_FILE 读取匿名块的问题
【发布时间】:2013-05-22 19:26:53
【问题描述】:
 DECLARE
    data_line   VARCHAR2(200); -- Data line read from input file
    data_file   UTL_FILE.FILE_TYPE; -- Data file handle
    my_dir      VARCHAR2(250); -- Directory containing the data file
    my_filename VARCHAR2(50);


    BEGIN
      my_dir := 'c:\temp';
      my_filename := 'Lab4AData.dat';
      my_file := UTL_FILE.FOPEN(my_dir, my_filename, 'r'); 


    LOOP;
          UTL_FILE.GET_LINE(data_file, data_line);

      EXCEPTION
        WHEN no_data_found THEN
          DBMS_OUTPUT.PUT_LINE('Finished');
          exit;
          END LOOP;
      END;


    /

问题是我什至无法启动这个匿名代码块。首先,我只是试图打开我的数据文件并读取它,然后从那里构建。但我什至无法打开文件。

SQL Developer 错误报告开始于

从命令的第 5 行开始出错: 宣布

然后重复代码块并添加:

ORA-06550:第 12 行,第 8 列: PLS-00103:遇到符号“;”当期待以下之一时: (开始 case 声明退出 goto if loop mod null pragma 使用 时提高返回选择更新

【问题讨论】:

标签: oracle plsql oracle-sqldeveloper plsqldeveloper utl-file


【解决方案1】:

尝试以下方法:

DECLARE
  data_line   VARCHAR2(200); -- Data line read from input file
  data_file   UTL_FILE.FILE_TYPE; -- Data file handle
  my_dir      VARCHAR2(250); -- Directory containing the data file
  my_filename VARCHAR2(50);
BEGIN
  my_dir := 'c:\temp';
  my_filename := 'Lab4AData.dat';
  data_file := UTL_FILE.FOPEN(my_dir, my_filename, 'r'); 

  LOOP
    UTL_FILE.GET_LINE(data_file, data_line);

    -- add code to do something with data_line here
  END LOOP;
EXCEPTION
  WHEN no_data_found THEN
    DBMS_OUTPUT.PUT_LINE('Finished');
    UTL_FILE.FCLOSE(data_file);
END;

@ShannonSeverance 关于使用带有 UTL_FILE.FOPEN 的目录对象的 cmets 是合适的,除非您的 DBA 没有接受它们的使用并坚持使用“久经考验的”INIT.ORA 参数 UTL_FILE_DIR。不要问我是怎么知道的... :-)

分享和享受。

【讨论】:

  • 谢谢,但我仍然得到:错误从命令的第 1 行开始:- 然后回显所有代码并添加这些错误:错误报告:ORA-06550:第 3 行,第 15 列:PLS-00201 :必须声明标识符“UTL_FILE” ORA-06550:第 3 行,第 15 列:PL/SQL:忽略项目 ORA-06550:第 9 行,第 3 列:PLS-00320:此表达式类型的声明不完整或格式错误ORA-06550:第 9 行,第 3 列:PL/SQL:语句被忽略 ORA-06550:第 12 行,第 23 列:PLS-00320:此表达式的类型声明不完整或格式错误
  • @Dug,检查您登录的用户在UTL_FILE 上是否具有EXECUTE 权限。
  • @Dug - 按照@JeffreyKemp 的建议去做,试试SELECT * FROM ALL_TAB_PRIVS WHERE TABLE_NAME='UTL_FILE'。我希望您会发现 PUBLIC 已被授予 EXECUTE 对 UTL_FILE 的访问权限,但也许您的 DBA 觉得有必要解决这个问题。如果PUBLIC 和您的用户 ID 都没有对 UTL_FILE 的 EXECUTE 权限,我会说这将是您的站点管理员需要查看的内容。
  • 谢谢鲍勃和杰弗里。我在家用电脑上运行 11g。我是唯一的 DBA。我运行了您推荐 Bob 的选择语句。它返回列但没有数据。看起来没有人有权限。我在 Oracle 论坛上有一个单独的问题,关于为什么我在尝试以 sysdba 身份登录时收到“权限不足”错误消息。我想当我可以以 sysdba 身份登录时,我应该能够设置权限并实际继续这个项目......
  • 我以用户身份登录,而不是 Windows 7 上的管理员。导致问题的原因是我在 Windows 上缺乏权限。我与家人共享这台电脑,所以当时以这种方式设置权限似乎是个好主意。但它让我今天。一旦我登录到我的 Windows 管理员帐户,一切都解决了。我能够授予权限。
猜你喜欢
  • 2014-09-30
  • 2017-09-02
  • 1970-01-01
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
  • 1970-01-01
相关资源
最近更新 更多