2017-05-07 64 views
0

請問,這個程序中有什麼不好。錯誤是8,9行中的PLS-00103PL/SQL程序,光標,PLS-00103錯誤

create or replace PROCEDURE test_one(l_f_name VARCHAR2,l_l_name VARCHAR2) 
IS 
    CURSOR c1(f_name VARCHAR2,l_name VARCHAR2) IS 
    SELECT lastname,firstname 
    FROM CUSTOMER; 

    v_complex c1%ROWTYPE; 
    f_name = l_f_name; 
    l_name = l_l_name; 

BEGIN 
    open c1(f_name,l_name); 
    fetch c1 into v_complex; 

    dbms_output.put_line(v_complex.lastname|| ' ' ||v_complex.firstname); 

    exit when c1%notfound; 
    close c1; 
end; 

回答

0

PL/SQL中的賦值運算符是:=。此外,局部變量聲明中缺少類型(感謝@Nitish)。所以有效的代碼是:

f_name VARCHAR2(50) := l_f_name; 
l_name VARCHAR2(50) := l_l_name; 
+0

順便說一句。從文檔中:'EXIT語句退出一個循環並將控制轉移到循環結束.'但是在你的代碼中沒有循環。 – kpater87

+0

還有其他一些錯誤,比如'f_name'和'l_name'的聲明沒有類型。 – Nitish

+0

@Nitish你是對的。我已經更新了我的答案。 – kpater87

0

這樣的顯式遊標要在PLSQL中避免。

它應該是:

FOR v_complex IN c1(l_f_name, l_l_name) LOOP 
    dbms_output.put_line(v_complex.lastname|| ' ' ||v_complex.firstname); 
END LOOP; 

在這種情況下,你不需要申報v_complex所有,或f_name,或l_name。另外,遊標似乎並未實際使用這些變量。你想做什麼?

這個隱式遊標也避免了顯式OPEN和CLOSE語句的需要,你永遠不會得到這種遊標泄漏。

至於實際的問題,如果初始化是固定的,那麼你的DBMS_OUTPUT應該在%NOTFOUND檢查之後。