4名员工的显示列具有SA_MAN等工作ID,工资大于10000

时间:2013-06-09 19:22:16

标签: oracle loops for-loop plsql

我想显示:员工ID,员工姓名,工作ID,工资,4名员工的工作ID如SA_MAN,工资> 10000使用循环语句我写了这段代码但是我收到错误

这段代码出了什么问题?

DECLARE
  emp_name employees.last_name%type;
  emp_id employees.employee_id%type;
  sal employees.salary%type;
  jobid employees.job_id%type;

BEGIN
  SELECT employee_id,
    last_name,
    job_id,
    salary
  INTO emp_id,
    emp_name,
    jobid,
    sal
  FROM employees
  WHERE salary>10000
  AND job_id LIKE'%SA\_%N' ESCAPE'\';

FOR i 1..3 dpms_output.put_line(emp_id||' '||emp_name||' '||jobid||' '||sal);
END LOOP;

END;

这是我得到的错误:

Error starting at line 1 in command:
DECLARE
  emp_name employees.last_name%type;
  emp_id employees.employee_id%type;
  sal employees.salary%type;
  jobid employees.job_id%type;

BEGIN
  SELECT employee_id,
    last_name,
    job_id,
    salary
  INTO emp_id,
    emp_name,
    jobid,
    sal
  FROM employees
  WHERE salary>10000
  AND job_id LIKE'%SA\_%N' ESCAPE'\';

FOR i 1..3 dpms_output.put_line(emp_id||' '||emp_name||' '||jobid||' '||sal);
END LOOP;

END;
Error report:
ORA-06550: line 20, column 7:
PLS-00103: Encountered the symbol "1" when expecting one of the following:

   in
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

1 个答案:

答案 0 :(得分:0)

这可以通过以下方式实现:

begin
  for i in ( SELECT employee_id, last_name, job_id, salary
               FROM employees
              WHERE salary > 10000
                AND job_id LIKE '%SA\_%N' ESCAPE '\' ) LOOP

     dbms_output.put_line( i.employee_id || ' '
                         || i.last_name || ' '
                         || i.job_id || ' '
                         || i.salary );

   end loop;
end;

你不需要这样做。你可以选择你想要的东西。更一般地说,请注意你的间距,这会使你的代码更具可读性。


实际错误如下:

  1. 如果您正在执行FOR LOOP,则需要IN和LOOP

    FOR i 1..3应为for i in 1 .. 3 loop

  2. dbms_output拼写正如我所做的那样,而不是dpms_output

  3. 您正在选择多行作为定义为单行的类型。这将引发TOO_MANY_ROWS异常。同样,如果此查询返回0行,则将引发NO_DATA_FOUND异常。


  4. 如果要选择所有内容然后循环显示值,可以使用BULK COLLECT。对于这种情况来说,这太过分了。请注意,我不假设查询将返回的值的数量。

    declare
    
       cursor c_emp is
        select employee_id, last_name, job_id, salary
          from employees
         where salary > 10000
           and job_id like '%SA\_%N' ESCAPE '\';
    
       type t__emp is table of c_emp%rowtype index by binary_integer;
       t_emp t__emp;
    
    begin
    
       open c_emp;
       fetch c_emp bulk collect into t_emp;
       close c_emp;
    
       for i in t_emp.first .. t_emp.last loop
         dbms_output.put_line( i.employee_id || ' '
                             || i.last_name || ' '
                             || i.job_id || ' '
                             || i.salary );
       end loop;
    
    end;
    /
    

    语法突出显示道歉。 Google Prettify在SQL markdown中的转义单引号上存在错误。