2017-05-07 192 views
0

この手順では何が悪いですか。間違いは、PL/SQLの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

代入演算子は:=あります。さらに、@Nitishのおかげでローカル変数宣言に型がありません。有効なコードは次のとおりです。

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

BTW。ドキュメントから: 'EXIT文はループを終了し、ループの最後に制御を移します。 'しかし、あなたのコードではループはありません。 – kpater87

+0

'f_name'や' l_name'の型を持たない宣言のようなエラーもあります。 – Nitish

+0

@Nitishあなたは正しいです。私は私の答えを更新しました。 – kpater87

0

このような明示的なカーソルは、PLSQLで回避する必要があります。

それは次のようになります。あなたがすべてでv_complex、またはF_NAME、またはL_NAMEを宣言する必要はありません。その場合には

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

。また、カーソルはこれらの変数を実際に使用するようには見えません。あなたは何をしようとしているのですか?

この暗黙のカーソルは、明示的なOPENおよびCLOSEステートメントの必要性も回避します。このようにカーソルリークは決して発生しません。

実際の問題としては、初期化が固定されている場合、DBMS_OUTPUTは%NOTFOUNDチェックの後でなければなりません。

関連する問題