带有游标“匿名块已完成”的 PL/SQL 过程

Posted

技术标签:

【中文标题】带有游标“匿名块已完成”的 PL/SQL 过程【英文标题】:PL/SQL Procedure with cursor "anonymous block completed" 【发布时间】:2014-11-01 03:52:09 【问题描述】:

在过去的几个小时里,我一直试图让这个程序正常工作:

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;

它几乎应该遍历 testimonials 表并输出参数中包含关键字实例的每一行。 它编译没有错误,但是当我像这样执行时:

EXECUTE Search_Testimonials('someword');

我收到此错误:“匿名块已完成”。 有谁知道发生了什么?我是 PL/SQL 的新手,互联网上的资源用完了,或者只是不明白我在读什么。

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

【问题讨论】:

【参考方案1】:

你在这里混合了隐喻。您要么需要在此处使用所有动态 SQL 语法,要么根本不使用。

但是,您实际上并不需要动态 SQL,只需将 l_cursor_1 类型作为输出参数即可。

试试这样的:

<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。

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

另外,出于性能原因,默认情况下我不会使用 %Keyword% 构造。使用 Keyword% 作为默认值并传递“% some keyword”来做同样的事情。如果您在列上有索引,它将永远不会与 %Keyword% 构造一起使用 ....

希望对你有帮助

尼克

【讨论】:

一个很好的答案。您能否在其中添加“匿名块已完成”的含义以及导致它的原因? 运行时出现此错误:Error(2,65): PLS-00201: identifier 'L_CURSOR_1' must be declared, 目前正试图在某处找到修复程序。 在了解了更多关于游标的信息后,我已经修复了那里的错误。我几乎必须在 IS 语句之后声明游标,它看起来像“cursor ByCompare is select * from Testimonial where T_Content like '%' || Keyword || '%';”谢谢尼克。 如果您将此过程放入包中,只需将 l_CURSOR_1 的声明添加到包中(在创建过程之前)。我的坏人应该记得它...type l_cursor_1 is REF CURSOR; 也忘记了使用 SYS_REFCURSOR 代替 l_CURSOR_1。简化。

以上是关于带有游标“匿名块已完成”的 PL/SQL 过程的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 匿名块已完成”但未显示结果

带有游标的 PL/SQL 错误,ERROR ORA-06550

PL/SQL 中的第一个程序

带有游标的 pl/sql 可变数组

PL/SQL - 声明带有由其他游标填充的表的游标时出错

pl / sql如何使用带有游标的for循环进行更新操作