带有游标“匿名块已完成”的 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 过程的主要内容,如果未能解决你的问题,请参考以下文章