2013-12-11 45 views
1

我是新來的PL/SQL,我一直在這個問題掙扎WAAY太長,所以我想我會在這裏問:PL/SQL異常不提高

我想達到的目標:

  • 我想用pl/sql 塊插入一個新員工到我的'emp'表中。
  • 我想從鍵盤輸入數據。
  • 然後使用異常檢查數據是否正確。
  • 之後,我希望用戶確認它寫'是'或'否'。

什麼不起作用:

  • 異常沒有被提出,即使我輸入無效數據。

  • 因爲它現在要求用戶在詢問數據的同時確認。我希望它輸入查詢後並檢查 正確性

後問

我的代碼:

DECLARE 
    empno NUMBER; 
    ename Varchar2(30); 
    job  Varchar2(30); 
    mgr  NUMBER; 
    hiredate DATE; 
    sal  NUMBER; 
    comm NUMBER; 
    deptno NUMBER; 
    confirm VARCHAR2(3); 
    negative_number EXCEPTION; 
    invalid_date EXCEPTION; 
BEGIN 
    INSERT INTO emp 
    VALUES (&empno, '&ename', '&job', &mgr, '&hiredate', &sal, &comm, &deptno); 
    IF empno < 0 OR mgr < 0 OR sal < 0 OR comm < 0 OR deptno < 0 THEN 
    RAISE negative_number; 
    ELSIF hiredate > SYSDATE THEN 
    RAISE invalid_date; 
    END IF; 
    IF '&confirm' = 'yes' THEN commit; 
    ELSE rollback; 
    END IF; 
EXCEPTION 
    WHEN negative_number THEN 
    dbms_output.put_line('number cannot be negative'); 
    WHEN invalid_date THEN 
    dbms_output.put_line('cannot be future date'); 
END; 
+0

您swalling在'exception'塊例外。如果你想讓他們被提升到呼叫者,你需要重新提高他們 –

+0

@a_horse_with_no_name swalling是什麼意思?我如何重新提高它們? –

+0

對不起,我的意思是「燕子」。有關引發異常的詳細信息,請參閱手冊:http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/errors.htm#BABFHFBI –

回答

2

只需稍加修改,以你現在的代碼:

DECLARE 
    empno NUMBER := &empno; 
    ename Varchar2(30) := '&ename'; 
    job  Varchar2(30) := '&job'; 
    mgr  NUMBER := &mgr; 
    hiredate DATE := TO_DATE('&hiredate', 'mm/dd/yyyy'); 
    sal  NUMBER := &sal; 
    comm NUMBER := &comm; 
    deptno NUMBER := &deptno; 
    confirm VARCHAR2(3); 
BEGIN 
    INSERT INTO emp 
    VALUES (empno, ename, job, mgr, hiredate, sal, comm, deptno); 
    IF empno < 0 OR mgr < 0 OR sal < 0 OR comm < 0 OR deptno < 0 THEN 
    RAISE_APPLICATION_ERROR ('-20001', 'Number cannot be negative!'); 
    ELSIF hiredate > SYSDATE THEN 
    RAISE_APPLICATION_ERROR ('-20002', 'Cannot be future date!'); 
    END IF; 
    confirm := '&confirm'; 
    IF lower(confirm) IN ('yes', 'y') THEN 
    commit; 
    ELSE 
    rollback; 
    END IF; 
END; 

最後部分 - confirm不可能使用純PL/SQL。代碼的作用是在執行本身開始時獲得值confirm以及其他變量。你應該做的是建立一個前端,在發佈DML之前控制你的程序的流程。

0
DECLARE 

    empno NUMBER := 10; 
    ename Varchar2(30) := 'sinha'; 
    job  Varchar2(30) := 'ITTTT'; 
    mgr  NUMBER := 100; 
    hiredate DATE := TO_DATE('09/09/2014', 'mm/dd/yyyy'); 
    sal  NUMBER := 2000; 
    comm NUMBER := 50; 
    deptno NUMBER := 10; 
    invalid_emp exception; 
    invalid_date exception; 

BEGIN 

    INSERT INTO empl 
    VALUES (empno, ename, job, mgr, hiredate, sal, comm, deptno); 

    IF empno < 0 OR mgr < 0 OR sal < 0 OR comm < 0 OR deptno < 0 THEN 
    RAISE invalid_emp; 
    ELSIF hiredate > SYSDATE THEN 
    RAISE invalid_date; 
    END IF; 

    exception 
    when invalid_emp then 
    dbms_output.put_line('number cannot be negative'); 
    when invalid_date then 
    dbms_output.put_line('cannot be future date'); 
END; 

這是你如何使用用戶定義的例外,因爲你想

+0

你正在吃所有的例外。 – Rachcha

+0

對不起,但是如果你已經爲此定義了異常,那麼即使你確認爲'Y',它也會被異常緩存並且不會被提交,所以我沒有使用確認。 –

+0

在你的'exception'塊中,提升'invalid_emp'和'invalid_date'後你所做的只是顯示一條錯誤信息。你不停止程序繼續使用INSERT。在異常塊中使用'RAISE;'。 – Rachcha