2013-07-04 66 views
-2

SQL> DESC hostel;DBMS Pl/SQL - 會輸出什麼...請解釋一下?

Name          Null?    Type 
    ------------------------------------ --------   ------------------- 
    HOSTELID        NOT NULL   VARCHAR2(4) 
    ROOMSAVAILABLE            NUMBER(3) 
    HOSTELTYPE            VARCHAR2(1) 
    HOSTELFEE            NUMBER(6) 

SQL> SELECT * FROM hostel;

HOST ROOMSAVAILABLE  H  HOSTELFEE 
------- ---------------------- ----  --------------------- 
H1    2   M   2000 
H2    3   F   3000 

以上示出的表宿舍和值在它。 以下pl/sql程序的輸出是什麼? 請詳細解釋。

CREATE OR REPLACE PROCEDURE sp_validatehostelid 
(p_hostelid IN hostel.hostelid%TYPE, 
p_hostelfee OUT hostel.hostelfee%TYPE 
) 
IS 
v_count NUMBER; 
v_hostelfee hostel.hostelfee%TYPE; 
BEGIN 
SELECT COUNT(*) INTO v_count FROM hostel WHERE hostelid=p_hostelid; 
IF v_count=0 THEN 
RAISE_APPLICATION_ERROR(-20000,'Invalid Hostel id'); 
ELSE 
SELECT hostelfee INTO v_hostelfee FROM hostel WHERE hostelid=p_hostelid; 
DBMS_OUTPUT.PUT_LINE('Hostel Fee:'||v_hostelfee); 
END IF; 
EXCEPTION 
WHEN NO_DATA_FOUND THEN 
DBMS_OUTPUT.PUT_LINE('No data found'); 
WHEN OTHERS THEN 
DBMS_OUTPUT.PUT_LINE('Other Errors in Procedure'); 
END sp_validatehostelid; 
Procedure created. 

DECLARE 
g_hostelfee hostel.hostelfee%TYPE; 
BEGIN 
sp_validatehostelid('H5',g_hostelfee); 
EXCEPTION 
WHEN OTHERS THEN 
DBMS_OUTPUT.PUT_LINE('Other Errors in Block'); 
END; 
+2

請運行它,看看自己! – NINCOMPOOP

回答

-1
CREATE OR REPLACE PROCEDURE sp_validatehostelid 
(
    p_hostelid IN hostel.hostelid%TYPE, 
    p_hostelfee OUT hostel.hostelfee%TYPE 
) 
IS 
    v_count NUMBER; 
    v_hostelfee hostel.hostelfee%TYPE; 
BEGIN 
    /* Count rows in 'hostel' table for given ID */ 
    SELECT COUNT(*) INTO v_count FROM hostel WHERE hostelid=p_hostelid; 
    /* If there is noting in the table */ 
    IF v_count=0 THEN 
     /* raise exception */ 
     RAISE_APPLICATION_ERROR(-20000,'Invalid Hostel id'); 
    ELSE 
     /* select fee from the 'hostel' table */ 
     SELECT hostelfee INTO v_hostelfee FROM hostel WHERE hostelid=p_hostelid; 
     /* print the fee */ 
     DBMS_OUTPUT.PUT_LINE('Hostel Fee:'||v_hostelfee); 
    END IF; 
EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
     DBMS_OUTPUT.PUT_LINE('No data found'); 
    WHEN OTHERS THEN 
     DBMS_OUTPUT.PUT_LINE('Other Errors in Procedure'); 
END sp_validatehostelid; 


DECLARE 
    g_hostelfee hostel.hostelfee%TYPE; 
BEGIN 
    sp_validatehostelid('H5',g_hostelfee); 

    /* 
    **Here something should be done with 'g_hostelfee' variable 
    */ 
EXCEPTION 
    WHEN OTHERS THEN 
     DBMS_OUTPUT.PUT_LINE('Other Errors in Block'); 
END; 

如果沒有與hostelid =「H5」的行收集給出ID費,打印出來並傳遞出來。

注意:它只對每個ID一行有效。如果有多個。將引發TO_MANY_VALUES異常。

+0

輸出是什麼?因爲沒有hostelid ='H5'的行。 –

+0

不會有任何。會出現一個例外情況:-20000,'無效的旅館ID' –

+0

會有輸出。將引發異常,並且該過程的異常處理程序將顯示缺省的WHEN OTHERS消息。 – APC

2

「會有怎樣的輸出?因爲沒有行有hostelid = ‘H5’」

假設你在SERVEROUTPUT客戶端上運行這使輸出將

Other Errors in Procedure 
PL/SQL procedure successfully completed. 

SQL> 

爲什麼?

  1. 第一個SELECT語句是一個數,不能用力投擲NO_DATA_FOUND異常。
  2. 下一行產生用戶定義的異常-20000。
  3. 這將控制傳遞給異常處理程序塊。 -20000不是NO_DATA_FOUND,所以WHEN OTHERS子句被執行,它顯示上面的消息。
  4. 異常處理程序本身不會引發異常,這是非常糟糕的做法。所以流程返回到調用塊。
  5. 由於沒有發現異常,調用塊認爲被調用的過程已成功執行,因此處理過程完全終止。這就是爲什麼不重新提出例外的做法。

請注意,如果你運行此不啓用SERVEROUTPUT第一輸出將是:

PL/SQL procedure successfully completed. 

SQL>