2014-11-01 14 views
0

我一直試圖讓這個過程的最後幾個小時的工作:PL/SQL程序與光標「匿名塊已完成」

CREATE OR REPLACE PROCEDURE Search_Testimonials(keyword VARCHAR2) 
AS 
l_cursor_1 SYS_REFCURSOR; 
Temp_Content VARCHAR(255); 
BEGIN 
    OPEN l_cursor_1 FOR 
     SELECT T_Content 
     INTO Temp_Content 
     FROM Testimonial 
     WHERE T_Content LIKE '%' || Keyword || '%'; 
     dbms_output.put_line(Temp_Content); 
    DBMS_SQL.RETURN_RESULT(l_cursor_1); 
END; 

這幾乎是應該通過推薦表並輸出每運行在參數中有一個關鍵字實例的行。 它編譯沒有任何錯誤,但是當我執行,像這樣:

EXECUTE Search_Testimonials('someword'); 

我得到這個錯誤:「匿名塊已完成」。 有誰知道發生了什麼事?我是PL/SQL新手,在互聯網上耗盡資源,或者只是不明白我在讀什麼。

- 我在oracle sql developer中運行了這一切。

回答

1

你在這裏混合隱喻。您可能需要使用所有動態SQL語法,或者根本不使用。

但是,您並不需要動態SQL,只需將l_cursor_1類型設置爲out參數即可。

嘗試是這樣的:

<code> 
CREATE OR REPLACE PROCEDURE Search_Testimonials(keyword VARCHAR2 IN, 
               oResults IN OUT l_cursor_1, 
               oStatus  OUT VARCHAR) 
IS 
type l_cursor_1 is REF CURSOR; 
-- Temp_Content VARCHAR(255); 
err_code      varchar2(30); 
err_msg      varchar2(200); 
BEGIN 
    oStatus := "1"; 
    OPEN oResults FOR 
     SELECT T_Content 
     FROM Testimonial 
     WHERE T_Content LIKE '%' || Keyword || '%'; 
     oStatus := "0"; 
EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
     NULL; 
    WHEN OTHERS THEN 
     oStatus := "2"; 
     err_code := SQLCODE; 
     err_msg := SUBSTR (SQLERRM, 1, 200); 
     DBMS_OUTPUT.PUT_LINE('ERROR: '|| err_code || ' : ' || err_msg); 
--  RAISE; 
END Search_Testimonials; 
</code> 

處理輸出,如果它是你有一個錯誤2或者1任何數據之前,先檢查oStatus。

您可以通過將錯誤代碼,消息,proc名稱插入到錯誤表中來擴展異常處理。

也出於性能原因,我不會使用%Keyword%構造默認情況下。使用關鍵字%作爲默認值並傳遞「%some關鍵字」來做同樣的事情。如果您有關於它決不會與%的關鍵字%結構中使用的列索引....

希望這有助於

尼克

+0

一個很好的答案。你可以添加什麼「匿名塊完成」的意思是什麼造成它? – wallyk 2014-11-01 05:07:35

+0

運行時出現此錯誤:錯誤(2,65):PLS-00201:標識符'L_CURSOR_1'必須聲明,當前正嘗試在某處找到修復程序。 – jktexas1 2014-11-01 22:05:09

+0

我在學習了一些關於遊標後已經修復了錯誤。我非常需要在IS語句後面聲明遊標,它看起來像「cursor ByCompare is select * from Testimonial where T_Content like'%'|| Keyword ||'%';」謝謝Nick。 – jktexas1 2014-11-01 22:51:50