2015-11-12 117 views
2

我在oracle中有sp。我的SP如下所示如何在sqlplus中執行PL/SQL Oracle?

create or replace 

PROCEDURE GETMONITORING 
(
v_namabarang in varchar2 default null, 
v_JenisLayanan in varchar2 default null, 
cv_1 IN OUT SYS_REFCURSOR 
) 
AS 
    v_where VARCHAR2(200); 
    v_Select VARCHAR2(200); 
    v_from VARCHAR2(200); 
    v_final VARCHAR2(200); 
    v_result VARCHAR2(200); 
BEGIN 
    v_Select:='select * '; 
    v_from :='from permohonan '; 
    v_where :='where sysdate=sysdate '; 

IF nvl(length(v_namabarang),0) <> 0 then 
     v_Where := v_Where || ' AND namabarang like ''' || v_namabarang|| '%'' '; 
    end if; 

IF nvl(length(v_jenislayanan),0) <> 0 then 
     v_Where := v_Where || ' AND jenislayanan like ''' || v_jenislayanan || '%'' '; 
    end if; 

    v_final :=v_select|| v_from|| v_where; 

dbms_output.put_line(v_result); 

END; 

我試圖通過

SQL> var r refcursor; 

SQL> exec getmonitoring('AC','1',:r); 

SQL>print :r; 

在sqlplus以Exec和結果是 「ORA-24338」:語句句柄不執行

那麼,如何Exec的我SP在sqlplus中?由於

回答

3

錯誤的事實是顯而易見的,你永遠不OPENCURSOR,但作爲製作OUT 參數SYS_REFCURSOR參考。

ORA-24338:語句句柄不執行

原因:獲取或描述執行語句句柄之前進行了嘗試。

操作:執行 語句,然後獲取或描述數據。

您需要使用OPEN遊標FOR ...聲明:

v_final :=v_select|| v_from|| v_where; 

-- open the cursor 
OPEN cv_1 FOR v_final; 

在一個側面說明,在編譯時PL/SQL的SQL * Plus,如果你看到的錯誤,您應該始終使用SHOW ERRORS查看完整的錯誤堆棧。

例如,

SQL> create or replace procedure p 
    2 as 
    3 begin 
    4 null 
    5 end; 
    6/

Warning: Procedure created with compilation errors. 

SQL> show errors 
Errors for PROCEDURE P: 

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
5/1  PLS-00103: Encountered the symbol "END" when expecting one of the 
     following: 
     ; 
     The symbol ";" was substituted for "END" to continue. 

所以,現在你知道確切的行號錯誤信息這將幫助你調試和修正錯誤。

+0

我輸入了「OPEN cv_1 FOR v_final;」並刪除「 dbms_output.put_line(v_result);」 。但是,當我執行我的SP仍然錯誤ORA-0094。謝謝 –

+0

按照我所示,請參閱最新的答案。使用'SHOW ERRORS'並編輯你的問題來顯示你實際做了什麼。 –

+0

解決了。我錯誤地輸入了「OPEN cv_1 FOR v_final;」。謝謝 –