PL / SQL过程用光标"匿名块完成"

时间:2014-11-01 03:52:09

标签: sql plsql

我一直在努力让这个程序在最后几个小时内运作:

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的新手,我在互联网上资源不足,或者只是不明白我在读什么。

-I'在oracle sql developer中运行这一切。

1 个答案:

答案 0 :(得分:1)

你在这里混合隐喻。您需要在此使用所有动态SQL语法,或者根本不使用任何动态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>

在处理输出之前检查oStatus,如果2您有错误或1没有数据。

您可以通过将错误代码,消息,proc名称插入错误表来扩展异常处理。

出于性能原因,我不会默认使用%Keyword%构造。使用关键字%作为默认值并传递“%some keyword”来执行相同操作。如果列上有索引,它将永远不会与%Keyword%construct ....

一起使用

希望这有帮助

尼克