2012-02-02 53 views
2

有谁能告诉我为什么不执行?必须声明PL/SQL标识符'string'

set serveroutput on ; 
Declare 
    TYPE type_emp IS RECORD(
     emp_name employees.last_name%TYPE, 
     emp_salary employees.salary%TYPE); 
    rec_emp type_emp; 
    due_for_a_raise CHAR(1); 
begin 
    SELECT last_name, salary into rec_emp 
    from employees 
    where employee_id = 150; 
    if emp_salary > 5000 then 
     due_for_a_raise := 'Y'; 
    else 
     due_for_a_raise := 'N'; 
    end if; 
    dbms_output.putline(last_name); 
    dbms_output.putline(salary); 
    dbms_output.putline(due_for_a_raise); 
end; 

误差低于

Error report: 
ORA-06550: line 11, column 6: 
PLS-00201: identifier 'EMP_SALARY' must be declared 
ORA-06550: line 11, column 3: 
PL/SQL: Statement ignored 
ORA-06550: line 16, column 23: 
PLS-00201: identifier 'LAST_NAME' must be declared 
ORA-06550: line 16, column 3: 
PL/SQL: Statement ignored 
ORA-06550: line 17, column 23: 
PLS-00201: identifier 'SALARY' must be declared 
ORA-06550: line 17, column 3: 
PL/SQL: Statement ignored 
ORA-06550: line 18, column 15: 
PLS-00302: component 'PUTLINE' must be declared 
ORA-06550: line 18, column 3: 
PL/SQL: Statement ignored 

我想我不知道为什么它没有被宣布,因为它们在type_emp被宣布。

回答

5

您需要在引用它们时使用该记录。您拨打dbms_output.put_line时还需要在putline之间加下划线。

SQL> ed 
Wrote file afiedt.buf 

    1 Declare 
    2  TYPE type_emp IS RECORD(
    3   emp_name employees.last_name%TYPE, 
    4   emp_salary employees.salary%TYPE); 
    5  rec_emp type_emp; 
    6  due_for_a_raise CHAR(1); 
    7 begin 
    8  SELECT last_name, salary 
    9  into rec_emp 
10  from employees 
11  where employee_id = 150; 
12  if rec_emp.emp_salary > 5000 then 
13  due_for_a_raise := 'Y'; 
14  else 
15  due_for_a_raise := 'N'; 
16  end if; 
17 dbms_output.put_line(rec_emp.emp_name); 
18 dbms_output.put_line(rec_emp.emp_salary); 
19 dbms_output.put_line(due_for_a_raise); 
20* end; 
SQL>/

PL/SQL procedure successfully completed. 
相关问题