我一直在努力让这个程序在最后几个小时内运作:
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中运行这一切。
答案 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 ....
一起使用希望这有帮助
尼克