0
CREATE OR REPLACE procedure verify_employee IS
Emp_name trkemployee.name#%TYPE,
Emp_ID trkemployee.E#%TYPE,

CURSOR c1;
IS
select e.e#, e.name from trkemployee e where e# IN (select e# from trkdriver intersect select e# from trkmechanic);
IN 
(select e# from trkdriver intersect select e# from trkmechanic);
BEGIN
OPEN c1();

LOOP

END LOOP;
close c1;
END;
/

以上是我的 PL/SQL 代码。我想要实现的是列出所有同时担任司机和机械师的员工。

我在终端单独执行sql语句,输出如下..

SQL> select e.e#, e.name from trkemployee e where e# IN (select e# from trkdriver intersect select e# from trkmechanic);

        E# NAME
---------- --------------------------------------------------
        14 Andrew R. Smith

但我想在 PL/SQL 中执行并执行 DMBS_OUTPUT.PUT(result);

我知道要检查多条记录,我需要使用游标。假设将来会有超过 1 行返回,我应该如何更改我的 pl/sql 以及当我加载程序时,终端说编译错误。

下面是我的3张桌子..

SQL> desc trkdriver;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------

 E#                                        NOT NULL NUMBER(12)
 L#                                        NOT NULL NUMBER(8)
 STATUS                                    NOT NULL VARCHAR2(10)

SQL> desc trkmechanic;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------

 E#                                        NOT NULL NUMBER(12)
 L#                                        NOT NULL NUMBER(8)
 STATUS                                    NOT NULL VARCHAR2(10)
 EXPERIENCE                                NOT NULL VARCHAR2(10)


SQL> desc trkemployee;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------

 E#                                        NOT NULL NUMBER(12)
 NAME                                      NOT NULL VARCHAR2(50)
 DOB                                                DATE
 ADDRESS                                   NOT NULL VARCHAR2(300)
 HIREDATE                                  NOT NULL DATE
4

1 回答 1

2

IN (select ....您的代码中有两次完整的部分。我认为这就是编译错误的原因。

我也认为 2 ins 会更快,因为 Oracle 可能会更好地使用索引:

select 
  e.e#, 
  e.name 
from 
  trkemployee e 
where 
  e# IN (select e# from trkdriver)
  and e# in (select e# from trkmechanic);

提示:如果使用这样的游标,您需要添加大量异常处理以防止游标在出现错误时保持打开状态。循环使for遍历游标更容易和更安全:

for r in C loop
  DBMS_OUTPUT.PUT_LINE(r.e#);
end loop;

此外,我可以想象这e#是一个可能在 PL/SQL 中引起问题的字段名称。我不确定,但是如果您遇到编译错误,可能就是这种情况。我宁愿选择一个更常见的名字,比如“EmployeeNr”。

[编辑]

您的代码有几个错误。首先,有一个不应该存在的;之后。cursor C1此外,循环中没有代码,这在 PL/SQL 中是不允许的。如果您需要对其进行测试,但您还没有编写代码,您可以键入null;for '一段什么都不做的代码。喜欢:

loop
  null;
end loop;

你的整个代码可能看起来像这样。这个实际上可以编译,应该让你用你可能需要的其他东西来完成它。

CREATE OR REPLACE PROCEDURE verify_employee IS

  CURSOR C1 IS
    SELECT
      E.E#,
      E.name
    FROM
      trkemployee E
    WHERE
      E# IN (SELECT E# FROM trkdriver)
      AND E# IN (SELECT E# FROM trkmechanic);

BEGIN
  -- R becomes an alias for each row. You can access the fields
  -- of the rows inside the loop
  FOR R IN C1 LOOP
    -- Output each Emplyee number.
    DBMS_OUTPUT.PUT_LINE(R.E# || ', ' || r.name);
  END LOOP;
END;
于 2012-11-25T20:35:03.437 回答