0

我想显示:员工 id、员工姓名、工作 id、薪水,对于 4 名员工有像 SA_MAN 这样的工作 id 并且使用循环语句的薪水 >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:
4

1 回答 1

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 异常。


如果您想选择所有内容,然后遍历值,您可以使用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 降价中的转义单引号上有一个错误。

于 2013-06-09T19:55:45.147 回答