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);を実行したいです。

複数のレコードをチェックすることを知っています。カーソルを使用する必要があります。将来、複数の行が返されると仮定すると、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 回含まれています。それがコンパイルエラーの原因だと思います。

inまた、Oracleはインデックスをより適切に使用する可能性があるため、2秒の方が高速になると思います。

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;、「何もしないコードの一部」と入力できます。お気に入り:

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 に答える