1

错误在哪里?编译以错误结束,我不知道哪里出错了。

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 

编辑:我已经修复了光标名称,但错误是一样的

4

3 回答 3

4

这是您尝试使用该过程时遇到的错误。不是你编译时得到的错误。您需要找到编译过程时遇到的错误,可能使用show errors并尝试解决该问题。

您的问题是for click in click应该是for click in clicks... 而不是 extra s,因此您正在遍历光标。

此外,在您的游标中,您编写了FROM click as c,这在 Oracle 中无效。这应该是FROM click c

还有两个 BEGIN... 删除第一个。

Alex Poole 注意到您还没有声明变量 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;
于 2013-06-15T09:57:34.363 回答
1

你错过了s

FOR Click IN Clicks
LOOP
    payoff_amount:= payoff_amount + Click.cpc;
END LOOP;

无论如何,不​​要将变量和游标命名得离数据库字段太近。例如,添加一些前缀以轻松区分。

于 2013-06-15T09:57:10.863 回答
0

我在用户 sys. 下为我的用户创建了一个过程。开始该程序时,我收到了与您相同的错误。该程序是有效的。在不同的用户下重新编译对象并没有帮助解决问题。我删除了该过程并将其创建为我的用户。问题解决了。

于 2021-02-25T05:36:18.797 回答