我想要创建一个从员工那里获取行的过程,记录的薪水比输入的要多。然后把输出输出到文本文件中。我不明白我做错了什么。请帮帮我。提前谢谢。
我有员工表,如下所示。Desc表中的员工;名为Null?类型
EMPLOYEE_ID非空数(6)
FIRST_NAME VARCHAR2(20)
LAST_NAME NULL VARCHAR2(25)
电子邮件非空VARCHAR2(25)
PHONE_NUMBER VARCHAR2(20)
HIRE_DATE非空日期
JOB_ID NULL VARCHAR2(10)
薪金编号(8,2)
COMMISSION_PCT数(2,2)
MANAGER_ID数(6)
DEPARTMENT_ID数(4)
当我想按脚本运行的时候。
CREATE OR REPLACE PROCEDURE P_TEST3 ( P_SAL NUMBER) IS
TYPE EMP_TEMP IS TABLE OF employees%ROWTYPE;
V_EMP_ROW EMP_TEMP ;
V1 utl_file.file_type;
E1 utl_file.file_type;
BEGIN
V1 := utl_file.fopen('ABC','VALID.txt','W');
E1 := utl_file.fopen('ABC','ERROR.txt','W');
SELECT * BULK COLLECT INTO V_EMP_ROW FROM Employees WHERE salary > p_sal ;
FOR i IN V_EMP_ROW.FIRST .. V_EMP_ROW.LAST
LOOP
UTL_FILE.PUT_LINE (V1, V_EMP_ROW(I).EMPLOYEE_ID ||',' || V_EMP_ROW(I).FIRST_NAME ||','|| V_EMP_ROW(I).SALARY );
END LOOP;
dbms_output.put_line ('Total row inserted '||sql%rowcount || '. Please see valid.txt file ' );
EXCEPTION
WHEN OTHERS THEN
raise_application_error( -20002,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
utl_file.put_line (E1,SQLCODE || '---' || SQLERRM);
DBMS_OUTPUT.PUT_LINE ('PLEASE SEE Error.txt FILE');
utl_file.fclose(v1);
utl_file.fclose(E1);
END P_TEST3;/
编译器给出了下面的错误。警告ORA-24344:成功编译错误21/42 PLS-00302:组件'EMPLOYEE_ID‘必须声明为21/9 PL/SQL:忽略语句(1: 0):警告:已编译但编译错误
发布于 2013-02-22 19:47:38
给出错误的行是21,这似乎是:
UTL_FILE.PUT_LINE (V1, V_EMP_ROW(I).EMPLOYEE_ID ||',' || V_EMP_ROW(I).FIRST_NAME ||','|| V_EMP_ROW(I).SALARY );我建议问题是,要么在BULK语句中不返回任何行,要么它们不是您所期望的格式。
试着加入这样的东西:
dbms_output.put_line('Record is: '|| V_EMPROW(i));作为循环的第一行。
或者,可以在循环之前对大容量选择结果进行记录计数:
dbms_output.put_line('Record count is: '|| V_EMPROW.COUNT);https://stackoverflow.com/questions/14064435
复制相似问题