【发布时间】:2016-01-10 02:55:11
【问题描述】:
我正在尝试使用TOAD 在 Oracle SQL 中创建一个存储过程,但它什么也没做。尝试创建它时没有错误,没有消息,没有任何内容。它似乎已经通过了,但事实并非如此。
查询如下所示:
CREATE OR REPLACE PROCEDURE PottyUseRange (formatty varchar2, start varchar2, end varchar2)
AS
BEGIN
SELECT TO_CHAR(TIME_RANGE, formatty) as CURRENT_DATE,
SUM(CASE WHEN PORTA_POTTY = 'LM' THEN 1 ELSE 0 END) as LM_SEARCH,
SUM(CASE WHEN PORTA_POTTY = 'AO' THEN 1 ELSE 0 END) as AO_SEARCH,
SUM(CASE WHEN PORTA_POTTY = 'RO' THEN 1 ELSE 0 END) as RO_SEARCH,
SUM(CASE WHEN PORTA_POTTY = 'FL' THEN 1 ELSE 0 END) as FL_SEARCH,
SUM(CASE WHEN PORTA_POTTY IN ('LM', 'AO', 'RO', 'FL') THEN 1 ELSE 0 END) as TOTAL
FROM CORE.DATE_TEST
WHERE to_char(TIME_RANGE, formatty) >= to_char(start, formatty)
AND to_char(TIME_RANGE, formatty) <= to_char(end, formatty)
GROUP BY TO_CHAR(TIME_RANGE, formatty)
ORDER BY TO_CHAR(TIME_RANGE, formatty) ASC;
EXCEPTION WHEN OTHERS THEN
raise_application_error(-20001,'Proc failed - '||SQLCODE||' -ERROR- '||SQLERRM);
END;
当我尝试调用它时(我知道这是一个空查询,但它会让我知道它是否存在):
BEGIN
POTTYUSERANGE();
END;
我收到此错误:PLS-00201: identifier 'POTTYUSERANGE' must be declared
当我使用CALL POTTYUSERANGE(); 调用它时,我收到此错误:ORA-06576: not a valid function or procedure name
如何正确地为此查询创建存储过程?
更新
我需要将其插入BULK COLLECTION 并将其返回给用户。它必须受到限制,以免造成过多的内存消耗。这些是相当大的结果集,它们看起来像这样:
+--------------+----+----+----+----+-------+
| CURRENT_DATE | LM | AO | RO | FL | TOTAL |
+--------------+----+----+----+----+-------+
| 1/2/2012 | 01 | 02 | 03 | 04 | 10 |
+--------------+----+----+----+----+-------+
| 1/4/2013 | 02 | 03 | 04 | 05 | 14 |
+--------------+----+----+----+----+-------+
我需要视图吗?存储过程?我需要什么?
【问题讨论】:
-
Oracle 存储过程不只是运行 SQL。你想对结果做什么?你真的想要一个视图或用户定义的函数吗?
-
在
SQL*Plus中,编译程序后,这样做SHOW ERRORS -
另外,在 Toad 中,您是如何尝试编译代码的?我在某些 Toad 版本中遇到问题,使用 F9 / Execute 语句无法运行
create or replace ...代码,但 F5 / Execute as script 工作正常。如果有疑问,请突出显示该过程并将其作为脚本运行。 -
I need to insert this into a BULK COLLECTION.... 我强烈建议您返回一个引用光标。这将返回一个指向游标的指针,并允许调用代码在需要时将数据拉过,就像调用代码直接运行 SQL 一样。 IMO,比将所有内容收集到一个集合中然后将其一大堆传递要好得多!