【问题标题】:PLS-00306 error on procedure EMP (HR)PLS-00306 程序 EMP (HR) 错误
【发布时间】:2014-11-05 15:50:34
【问题描述】:

我的代码有问题.. 我不知道如何解决它:( .. 我需要使用 UTL_FILE 创建一个文件,输入如下所示:

Departamento: 80 - Sales
=========10========20========30========40========50========60=========
1234567890123456789012345678901234567890123456789012345678901234567890

EMPID         LAST_NAME     FIRST_NAME          SALARY           COMM
145           Russel        John               14000        0,4          


Departamento: 60 - IT

=======================================================================
EMPID         LAST_NAME     FIRST_NAME          SALARY           COMM
103           Hunold        Alexander               9000         NULO

etc...

我使用 hr 模式,我的程序编译没有问题:

CREATE OR REPLACE PROCEDURE EMP (p_ID IN hr.employees.employee_id%TYPE) AS
EPRINT NUMBER;
EPRINTRecord employees%ROWTYPE;
v_FileHandle UTL_FILE.FILE_TYPE;

CURSOR c_emp IS
 SELECT * FROM employees
 WHERE employee_id = p_ID;

BEGIN
 v_FileHandle := UTL_FILE.FOPEN('ASD', 'emp.txt', 'w');
 SELECT * INTO EPRINTRecord
 FROM employees
 WHERE department_id = p_ID;

 UTL_FILE.PUTF(v_FileHandle, 'Departamento: %s\n', EPRINTRecord.department_id);
 UTL_FILE.PUT_Line(v_FileHandle,'=========10========20========30========40========50========60=========');
 UTL_FILE.PUT_Line(v_FileHandle,'1234567890123456789012345678901234567890123456789012345678901234567890');
 UTL_FILE.PUTF(v_FileHandle, 'EMPID: %s\n', EPRINTRecord.employee_id, EPRINTRecord.last_name, EPRINTRecord.first_name, EPRINTRecord.salary, EPRINTRecord.commission_pct);
 UTL_FILE.FCLOSE(v_FileHandle);
 dbms_output.put_line('Escritura Correcta');

-- Manejo excepciones.
EXCEPTION
  WHEN UTL_FILE.INVALID_OPERATION THEN
  UTL_FILE.FCLOSE(v_FileHandle);
  RAISE_APPLICATION_ERROR(-20051, 'Error: Operacion no valida');
 WHEN UTL_FILE.INVALID_FILEHANDLE THEN
  UTL_FILE.FCLOSE(v_FileHandle);
  RAISE_APPLICATION_ERROR(-20052, 'Archivo no valido');
 WHEN UTL_FILE.READ_ERROR THEN
  UTL_FILE.FCLOSE(v_FileHandle);
  RAISE_APPLICATION_ERROR(-20053, 'Error de Lectura');
 WHEN UTL_FILE.INVALID_PATH THEN
  UTL_FILE.FCLOSE(v_FileHandle);
  RAISE_APPLICATION_ERROR(-20054, 'Directorio invalido');
 WHEN UTL_FILE.INVALID_MODE THEN
  UTL_FILE.FCLOSE(v_FileHandle);
  RAISE_APPLICATION_ERROR(-20055, 'Error: Modo invalido');
 WHEN UTL_FILE.INTERNAL_ERROR THEN
  UTL_FILE.FCLOSE(v_FileHandle);
  RAISE_APPLICATION_ERROR(-20056, 'Error interno DB');
 WHEN VALUE_ERROR THEN
  UTL_FILE.FCLOSE(v_FileHandle);
  RAISE_APPLICATION_ERROR(-20057, 'Error: Valor no valido');
 WHEN OTHERS THEN
  UTL_FILE.FCLOSE(v_FileHandle);
  RAISE;
END;
/

但是当我执行时..

 exec emp;

SQL*PLUS 说:

“ORA-06550:第 1 行,第 7 列:

PLS-00306:调用“EMP”时参数的数量或类型错误 ……”

如果我执行 emp(1);该文件已创建但仍为空。 请帮我!在此先感谢,对我的英语感到抱歉。 (不知道好不好)。

【问题讨论】:

    标签: oracle plsql cursor procedure


    【解决方案1】:

    看起来您应该使用已定义的光标而不是 SELECT...INTO...。尝试将您的过程重写为:

    CREATE OR REPLACE PROCEDURE EMP (p_ID IN hr.employees.employee_id%TYPE) AS
      EPRINT NUMBER;
      v_FileHandle UTL_FILE.FILE_TYPE;
    
      CURSOR c_emp IS
        SELECT * FROM employees
        WHERE employee_id = p_ID;
    
    BEGIN
      v_FileHandle := UTL_FILE.FOPEN('ASD', 'emp.txt', 'w');
    
      FOR ePrintRecord IN c_emp
      LOOP
        UTL_FILE.PUTF(v_FileHandle, 'Departamento: %s\n', EPRINTRecord.department_id);
        UTL_FILE.PUT_Line(v_FileHandle,
                          '=========10========20========30========40========50========60=========');
        UTL_FILE.PUT_Line(v_FileHandle,
                          '1234567890123456789012345678901234567890123456789012345678901234567890');
        UTL_FILE.PUTF(v_FileHandle, 'EMPID: %s\n', EPRINTRecord.employee_id);
      END LOOP;
    
      UTL_FILE.FCLOSE(v_FileHandle);
      dbms_output.put_line('Escritura Correcta');
    
    -- Manejo excepciones.
    EXCEPTION
      WHEN UTL_FILE.INVALID_OPERATION THEN
      UTL_FILE.FCLOSE(v_FileHandle);
      RAISE_APPLICATION_ERROR(-20051, 'Error: Operacion no valida');
     WHEN UTL_FILE.INVALID_FILEHANDLE THEN
      UTL_FILE.FCLOSE(v_FileHandle);
      RAISE_APPLICATION_ERROR(-20052, 'Archivo no valido');
     WHEN UTL_FILE.READ_ERROR THEN
      UTL_FILE.FCLOSE(v_FileHandle);
      RAISE_APPLICATION_ERROR(-20053, 'Error de Lectura');
     WHEN UTL_FILE.INVALID_PATH THEN
      UTL_FILE.FCLOSE(v_FileHandle);
      RAISE_APPLICATION_ERROR(-20054, 'Directorio invalido');
     WHEN UTL_FILE.INVALID_MODE THEN
      UTL_FILE.FCLOSE(v_FileHandle);
      RAISE_APPLICATION_ERROR(-20055, 'Error: Modo invalido');
     WHEN UTL_FILE.INTERNAL_ERROR THEN
      UTL_FILE.FCLOSE(v_FileHandle);
      RAISE_APPLICATION_ERROR(-20056, 'Error interno DB');
     WHEN VALUE_ERROR THEN
      UTL_FILE.FCLOSE(v_FileHandle);
      RAISE_APPLICATION_ERROR(-20057, 'Error: Valor no valido');
     WHEN OTHERS THEN
      UTL_FILE.FCLOSE(v_FileHandle);
      RAISE;
    END;
    /
    

    祝你好运。

    【讨论】:

    • 感谢您的回复,但我仍然有问题,文件已创建并且它是空的。我不知道为什么,文件中没有写任何东西。有什么建议么?提前致谢。 :)
    • 我唯一的猜测是 EMPLOYEES 表中没有您输入的 ID 的数据。尝试从游标中删除 WHERE 子句以查看是否会更改输出。祝你好运。
    猜你喜欢
    • 2013-04-01
    • 1970-01-01
    • 2011-08-10
    • 2012-08-25
    • 2015-09-09
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多