2017-02-06 11 views
0

私はDMLパッケージをコーディングしています。パッケージ内で、コミッション値を更新する簡単なプロシージャを作成したいと思います。私はパッケージ本体を実行するときに構文エラーを受け取りませんが、プロシージャを呼び出すと予期しないエラーが発生します。ありがとう。呼び出しプロシージャが予期しないエラー

PROCEDURE update_commission_pct(
    p_empid  employees.employee_id%TYPE, 
    p_new_comm employees.commission_pct%TYPE 
    ) 
    IS 
    rec_confirm employees%ROWTYPE; 
    v_valid_empid BOOLEAN; 
    BEGIN 
    -- Simple boolean function to check employee existence 
    v_valid_empid := dml_employees_pkg.check_employee_id(p_empid); 

    IF 
     v_valid_empid = TRUE 
     AND LENGTH(p_new_comm) <=5 THEN 
     UPDATE employees 
     SET  commission_pct = p_new_comm 
     WHERE  employee_id = p_empid 
     RETURNING employee_id, commission_pct 
     INTO  rec_confirm.employee_id, rec_confirm.commission_pct; 

     DBMS_OUTPUT.PUT_LINE('Comission updated successfully.'); 
     DBMS_OUTPUT.PUT_LINE('Employee ID number ' || 
          rec_confirm.employee_id || ' new comm is' || 
          rec_confirm.commission_pct); 
    ELSE 
     RAISE_APPLICATION_ERROR(-20042, 'Employee ID ' || 
           p_empid || ' Employee doesn't exist.'); 
    END IF; 
    END update_commission_pct; 
簡単PL/SQLブロック内

コール手順:

SET SERVEROUTPUT ON 
BEGIN 
    dml_employees_pkg.update_commission_pct(550, 10); 
END; 

Oracleエラー:

Informe de error - 
ORA-01438: value larger than specified precision allowed for this column 
ORA-06512: at "HR.DML_EMPLOYEES_PKG", line 118 
ORA-06512: at line 2 
01438. 00000 - "value larger than specified precision allowed for this column" 
*Cause: When inserting or updating records, a numeric value was entered 
      that exceeded the precision defined for the column. 
*Action: Enter a value that complies with the numeric column's precision, 
      or use the MODIFY option with the ALTER TABLE command to expand 
      the precision. 

答えて

1

employeesテーブル(in the default HR schema)でcommission_pct列がnumber(2, 2)として定義されます。

精度と位取りの意味is explained inthe documentationしかし、本質的にここでは、列は0.00〜0.99の値しか受け入れることができないことを意味します。エラーが示すように、許容精度を超えている10を挿入しようとしています。

10%を保存する場合は、プロシージャコールで2番目の引数として0.1を渡すことができます。または10を渡すことに固執するが、その後の更新文の一部として100で割る:

SET  commission_pct = p_new_comm/100 

あなたは、その長さをチェックする以外の何らかの方法で渡された値を検証することもできます。 LENGTH(p_new_comm) <=5のチェックが失敗した時点で、発生した例外はそれを明確にしません。実際に有効な従業員IDのみを参照します。長さのチェックは実際にはとにかく感知しません。

+0

ご理解いただけます。私はcommission_pct列をチェックし、この列の最大値は約99.99だと思います。あなたの助けをありがとうございました。私はあなたの答えに投票します。 – Rattlesnake

関連する問題