Butuh saran di sini. Saya memiliki dua tabel: 1) Pemilik mobil; 2) Mobil. Dengan kursor loop saya perlu menghitung berapa banyak mobil yang dimiliki setiap orang. Saya tidak mengerti bagaimana Anda menulis kode pilih ketika dua tabel terlibat.

CREATE TABLE car_owner(
pnr VARCHAR2(13) PRIMARY KEY,
fname VARCHAR2(20);

CREATE TABLE car(
regnr VARCHAR2(6) PRIMARY KEY,
pnr REFERENCES car_owner(pnr);

INSERT INTO car_owner VALUES('19490321','anna');
INSERT INTO car_owner VALUES('19540201','tomas');
INSERT INTO car_owner VALUES('19650823','roger');

INSERT INTO car VALUES('ase456','19490321');
INSERT INTO car VALUES('ptg889','19490321');
INSERT INTO car VALUES('bon666','19650823');

declare 
cursor c_cars is select pnr, fnamn, count(amount_of_cars(pnr))
                from car_owner, car;
v_pnr car_owner.pnr%type;
v_fnamn car_owner.fnamn%type;
begin
if not c_cars %isopen then
open c_cars;
end if;
loop
fetch c_cars
into v_pnr, v_fnamn;
exit when c_cars %notfound;
dbms_output.put_line(v_pnr || ', ' || v_fnamn || ', ' || 
                    ', owns: ' || amount_of_cars || ' cars');
end loop;
close c_cars;
end; 

Jadi jawabannya akan terlihat seperti ini:

  • 19490321, anna, memiliki: 2 mobil
  • 19540201, tomas, memiliki: 1 mobil
  • 19650823, roger, memiliki: 0 mobil
0
Baibs 12 Mei 2021, 13:12

1 menjawab

Jawaban Terbaik

Bergabunglah dengan tabel-tabel itu. Saat Anda menggabungkan sesuatu, semua kolom yang tidak digabungkan harus menjadi bagian dari klausa group by.

Juga, pertimbangkan untuk menggunakan kursor FOR loop karena cara ini lebih sederhana (Oracle melakukan semua pekerjaan kotor untuk Anda - Anda tidak perlu mendeklarasikan variabel, buka kursor, khawatir keluar dari lingkaran, tutup kursor).

SQL> DECLARE
  2     CURSOR c_cars IS
  3          SELECT o.pnr, o.fname, COUNT (*) cnt
  4            FROM car_owner o JOIN car c ON c.pnr = o.pnr
  5        GROUP BY o.pnr, o.fname;
  6  BEGIN
  7     FOR cur_r IN (  SELECT o.pnr, o.fname, COUNT (*) cnt
  8                       FROM car_owner o JOIN car c ON c.pnr = o.pnr
  9                   GROUP BY o.pnr, o.fname)
 10     LOOP
 11        DBMS_OUTPUT.put_line (
 12              cur_r.pnr
 13           || ', '
 14           || cur_r.fname
 15           || ', '
 16           || ', owns: '
 17           || cur_r.cnt
 18           || ' car(s)');
 19     END LOOP;
 20  END;
 21  /
19650823, roger, , owns: 1 car(s)
19490321, anna, , owns: 2 car(s)

PL/SQL procedure successfully completed.

SQL>
1
Littlefoot 12 Mei 2021, 10:25