错误在哪里?编译以错误结束,我不知道我哪里出错了。
create or replace
PROCEDURE make_payoff(user_id_argument number)
is
begin
payoff_amount:= 0;
CURSOR Clicks IS
SELECT c.cpc FROM click as c JOIN widget w ON w.id = c.widget_id JOIN website web ON web.id = w.website_id WHERE web.user_id = user_id_argument AND c.payoff_id IS NULL;
BEGIN
FOR Click IN Clicks
LOOP
payoff_amount:= payoff_amount + Click.cpc;
END LOOP;
INSERT INTO payoff (user_id, amount) VALUES (user_id_argument, payoff_amount);
COMMIT;
end;
我得到了:
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00905: object S10306.MAKE_PAYOFF is invalid
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
编辑: 我修复了Cursor名称,但错误是相同的
答案 0 :(得分:2)
这是您尝试使用该过程时遇到的错误。不是你编译时得到的错误。您需要找到编译过程时得到的错误,可能使用show errors
并尝试解决该问题。
您的问题是for click in click
应为for click in clicks
...而不是额外的s
,因此您正在循环光标。
此外,在游标中,您编写了FROM click as c
,这在Oracle中无效。这应该是FROM click c
两个BEGIN ......删除第一个。
Alex Poole has noted你还没有声明变量payoff_amount的类型。您应该将其声明为数字:
payoff_amount number := 0;
然而,没有必要这样做,不需要循环,根本不需要使用过程。这可以通过单个SQL语句实现:
insert into payoff (user_id, amount)
select 'user_id_argument', sum(c.cpc)
from click c
join widget w
on w.id = c.widget_id
join website web
on web.id = w.website_id
where web.user_id = user_id_argument
and c.payoff_id IS NULL;
答案 1 :(得分:1)
您错过了s
。
FOR Click IN Clicks
LOOP
payoff_amount:= payoff_amount + Click.cpc;
END LOOP;
无论如何,不要将变量和游标命名为如此接近数据库字段。例如,添加一些前缀以便轻松区分。
答案 2 :(得分:0)
我在用户 sys 下为我的用户创建了一个过程。开始程序时,我收到了与您相同的错误。该程序是有效的。在不同用户下重新编译对象并没有帮助解决问题。我删除了该过程并将其创建为我的用户。问题解决了。