0

DriverとMechanicの2つのテーブルがあり、両方のテーブルに同じ列のEmployee#があります。

PL / SQLを使用して両方の表をチェックし、employee#を比較してDriver表の従業員がMechanic表に表示されないようにするにはどうすればよいですか。そして、それが起こった場合、「従業員#はドライバーとメカニックの両方になることはできません!」というメッセージが表示されます。

私は、以下を使用して両方のテーブルを単純に比較できることを知っています。

SELECT Employee#
FROM Driver
INTERSECT
SELECT Employee#
FROM Mechanic

ただし、PL/SQLを使用するための要件です。

カーソルを使ってみましたが、列全体にカーソルを合わせることができないようです。これが私のコードです:

declare
cursor c1 is select employee# from driver;
cursor c2 is select employee# from mechanic;
driverenum number(30);
mechanicenum number(30);
begin
open c1;
fetch c1 into driverenum;
close c1;
open c2;
fetch c2 into mechanicenum;
close c2;
if driverenum in (mechanicenum) then
dbms_output.put_line(driverenum);
end if;
end;
/                                                                      
4

1 に答える 1

0

PL/SQLを使用することが唯一の要件である場合

DECLARE
  TYPE emp_nt IS TABLE OF driver.employee#%type;

  l_drivers   emp_nt;
  l_mechanics emp_nt;
  l_both      emp_nt;
BEGIN
  SELECT employee#
    BULK COLLECT INTO l_drivers
    FROM driver;

  SELECT employee#
    BULK COLLECT INTO l_mechanics
    FROM mechanic;

  l_both := l_drivers MULTISET INTERSECT l_mechanics;

  FOR i IN 1 .. l_both.count
  LOOP
    dbms_output.put_line( 'Employee ' || l_both(i) || 
                            ' is employed as both a driver and a mechanic' );
  END LOOP;
END;

いずれかのテーブルに多数の行がある場合、このアプローチは PGA でかなりのスペースを占有する可能性があります。しかし、通常は SQL ソリューションとほぼ同じくらい効率的です。

于 2012-11-15T04:24:14.173 に答える