11

我能够为 Oracle 数据库创建一个存储过程,但现在我不知道如何运行它。我正在使用 SQuirrel SQL,这可以创建过程:

CREATE OR REPLACE PROCEDURE MyProc(label IN varchar2, results OUT sys_refcursor) AS
BEGIN
OPEN results FOR
    SELECT Label, Count, Timestamp 
        FROM table1
            LEFT JOIN table2 ON table1.Name=table2.Name 
    WHERE table1.Label=label
    ORDER BY Timestamp;
END;
/

我希望能够获取并显示结果集。我试过使用call MyProc('param'),但这不起作用(错误数量的参数错误)。我在这个网站和其他网站上进行了广泛的搜索,但没有任何用处。请帮忙!

4

5 回答 5

17

以下用于运行存储过程:

begin
   procedurename;
end;
/

是的,最后的斜线是必要的!

begin...end;声明一个PL/SQL 块(特定于Oracle)。斜线是运行块的命令。

/(削减)

执行存储在 SQL 缓冲区中的最近执行的 SQL 命令或 PL/SQL 块。

[...]

Oracle 数据库在线文档,10g 第 2 版 (10.2) / SQL*Plus® 用户指南和参考

于 2013-06-26T15:07:09.937 回答
4

我在 Squirrel SQL 中工作的唯一语法是PL/SQL 块:

declare
v_label  varchar2:='SOMELABEL';
TYPE ref_cursor IS REF CURSOR;
v_cur_results ref_cursor;
begin
MyProc (v_label, v_cur_results)
end;
/
于 2011-08-04T09:48:16.097 回答
1

就像这篇文章解释的那样,使用“调用”而不是“执行”应该可以解决问题。

于 2012-05-25T09:44:22.390 回答
0
var v_result sys_refcursor

exec MyProc ('test label',:v_result)
于 2011-03-29T17:27:24.157 回答
0

我已经为此苦苦挣扎了很长时间,但设法使它像这样工作:

{call DBMS_SESSION.SET_CONTEXT  ( namespace => 'clientcontext', attribute => 'foo', value     => 'bar' )}
于 2017-04-20T08:13:10.437 回答