2016-03-26 22 views
0

customer ID ve order ID ve diğer bazı verileri içeren bir tablom var.Kayıt bulunamadığı zaman İstisnayı Yükselt

oluşturmak ve customer ID girişini oluşturmak ve tablo içine bakmak istiyorum.

müşteri bir exception yükseltmek ardından yoksa o müşteri daha sonra order bu müşteri için ayrıntıları ve yazdırmak Varlığından eğer "Müşteri bulunamadı."

Bu koda sahibim, ancak düzgün çalışmıyor ya da belki de bu soruna yanlış yaklaşıyor. Bu hat

ile yordamı çalıştırırsanız sırası bu müşteri için varolduğu için

CREATE OR REPLACE PROCEDURE order_details(customer NUMBER) 
    IS 
    CURSOR order_cursor IS 
    SELECT ORDER_ID, ORDER_DATE, TOTAL, CUSTOMER_ID 
     FROM PRODUCT_ORDER 
    WHERE CUSTOMER_ID = customer ; 
    order_row order_cursor%ROWTYPE ; 
    customer_error EXCEPTION ; 

    BEGIN 
     FOR order_row IN order_cursor 
    LOOP 
     IF order_cursor%FOUND THEN 
    dbms_output.put_line ('order id = ' || order_row.ORDER_ID) ; 
    ELSE 
    RAISE customer_error ; 
    END IF; 
    END LOOP; 

    EXCEPTION 
    WHEN customer_error THEN 
    dbms_output.put_line ('no customer') ; 
     END; 

Yani iki sonuç almak. Bu hat

BEGIN 
    order_details(101); 
END; 

ile yordamı çalıştırırsanız o müşteri için düzen yoktur çünkü

ve hiçbir şey (hatta hatası) alamadım.

Table Data

cevap

0

yerine "LOOP İÇİN İmleç" bir "Açık İmleç" kullanmalıdır. Çünkü bu sorgu, birden fazla kayıt döndürdüğünde, LOOP ile END LOOP arasındaki kodu girer.

CREATE OR REPLACE PROCEDURE order_details(customer NUMBER) 
    IS 
    CURSOR order_cursor IS 
    SELECT ORDER_ID, ORDER_DATE, TOTAL, CUSTOMER_ID 
     FROM PRODUCT_ORDER 
    WHERE CUSTOMER_ID = customer ; 
    order_row order_cursor%ROWTYPE ; 
    customer_error EXCEPTION ; 

    BEGIN 
    OPEN order_cursor; 
    LOOP 
    FETCH order_cursor INTO order_row; 
    EXIT WHEN order_cursor%NOTFOUND; 
    dbms_output.put_line ('order id = ' || order_row.ORDER_ID); 
    END LOOP; 

    IF order_cursor%rowcount = 0 THEN 
    RAISE customer_error; 
    END IF; 

    CLOSE order_cursor; 

    EXCEPTION 
    WHEN customer_error THEN 
    dbms_output.put_line ('no customer') ; 

END; 

Selamlar

+0

Zaten çok bu denedim ve müşteri olmadığı zamanlarda bu konuda sorun, iyi çalışıyor, ama bu müşteri birden düzeni varsa müşteri var ve ne zaman, bunu Bu müşteri için yalnızca 1 sipariş çıktı olacak ve başka bir şey göstermeyecek. –

+0

Tablodaki veriler için bir resim yüklüyorum, görebildiğiniz gibi 2 set verim var, örneğin müşteri kimliği = 104, ancak önerdiğin kodu kullanırsam, sadece bir tane veri alırdım, diğerini değil. –

+0

Bu durumda LOOP - END LOOP kullanmak için kodu değiştirdim ve% rowcount ve% notfound öznitelikleri, bu nedenle tüm ORDER_ID değerini veya yoksa "müşteri yok" u gösterecek şekilde değiştirdim. –

İlgili konular