2015-06-18 118 views
-2

- 這是我的功能如何解決函數編譯錯誤?

create or replace 
function sal_incr 
(
p_grade number) 
return number 
is 
v_inc number; 
begin 
select raise_percent into v_inc 
from sal_inc 
where grade_id in (select grade_id from emp_task where grade_id = p_grade); 
return v_inc; 
end; 

- Update語句

update emp_task set sal = sal + sal_incr(grade_id); 

- 錯誤堆棧

Error starting at line 15 in command: 
update emp_task set sal = sal + sal_incr(grade_id) 
Error at Command Line:15 Column:32 
Error report: 
SQL Error: ORA-06575: Package or function SAL_INCR is in an invalid state 
06575. 00000 - "Package or function %s is in an invalid state" 
*Cause: A SQL statement references a PL/SQL function that is in an 
      invalid state. Oracle attempted to compile the function, but 
      detected errors. 
*Action: Check the SQL statement and the PL/SQL function for syntax 
      errors or incorrectly assigned, or missing, privileges for a 
      referenced object. 
+0

當您嘗試編譯函數時會得到什麼錯誤? – pablomatico

+0

@Prabha請確保在發佈之前正確地設置好代碼的格式,無格式的代碼會使其非常難以調試並且幾乎無法讀取。我編輯了你的問題,今後請自己做。 –

+1

錯誤很明顯,你的函數有**編譯錯誤**,它處於**無效狀態**。打開SQL * Plus,連接數據庫,編譯函數,執行'SHOW ERRORS',通過編輯你的問題複製並粘貼整個會話。 –

回答

0

我會盡量不要使用函數。使用直接的SQL通常是更好的解決方案。根據您提供的信息,我們有以下表格。 (你的函數不會編譯這些表。)

CREATE TABLE emp_task 
    (emp_id NUMBER PRIMARY KEY 
    ,grade_id NUMBER 
    ,sal NUMBER); 

    CREATE TABLE sal_inc 
    (grade_id NUMBER PRIMARY KEY 
    ,raise_percent NUMBER); 

    INSERT INTO emp_task VALUES (1,10,1000); 
    INSERT INTO emp_task VALUES (2,20,2000); 

    INSERT INTO sal_inc VALUES (10, 0.1); 
    INSERT INTO sal_inc VALUES (20, 0.2); 

我用一個子選擇在這裏(我以前從來沒有這樣做過,但它在11g中工作)。

UPDATE emp_task t1 
    SET sal = sal + sal* 
    (SELECT raise_percent 
    FROM sal_inc t2 
    WHERE t2.grade_id = t1.grade_id); 

    SELECT * 
    FROM emp_task; 

    EMP_ID GRADE_ID  SAL 
---------- ---------- ---------- 
     1   10  1100 
     2   20  2400 

你也可以看看更新視圖

UPDATE (SELECT ... FROM t1 JOIN t2 ON ... 

或者合併聲明。

0
  1. 首先想到你選擇轉換%成金額,然後添加它。
  2. 檢查函數中的select查詢是否每次返回單行。您可以使用max,min或rownum來限制多行。
  3. 檢查數據庫中是否存在基礎表。
  4. 檢查%的數據類型僅爲數字。 功能代碼看起來不錯。
相關問題