Oracle过程中出错,对象无效

Oracle过程中出错,对象无效,oracle,stored-procedures,plsql,Oracle,Stored Procedures,Plsql,臭虫在哪里?编译以错误结束,我不知道哪里出错了 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 WHER

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

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 
编辑: 我已修复光标名称,但错误与您错过的s相同

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

您错过了s


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

这是您尝试使用该过程时遇到的错误。而不是编译时出现的错误。您需要找到编译过程时遇到的错误,可能是使用ShowErrors并尝试解决该问题

你的问题是点击应该是点击。。。不是额外的s,因此您在光标中循环

此外,在光标中,您已将单击写入c,这在Oracle中无效。这应该是从点击c

第二个开始。。。移除第一个

您还没有声明可变支付金额的类型。您应将其声明为数字:

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;

这是您尝试使用该过程时出现的错误。而不是编译时出现的错误。您需要找到编译过程时遇到的错误,可能是使用ShowErrors并尝试解决该问题

你的问题是点击应该是点击。。。不是额外的s,因此您在光标中循环

此外,在光标中,您已将单击写入c,这在Oracle中无效。这应该是从点击c

第二个开始。。。移除第一个

您还没有声明可变支付金额的类型。您应将其声明为数字:

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;

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

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

有关“单击”的信息,请单击???首先,光标与字段具有相同的名称。就连我自己也感到困惑,更不用说PL/SQL解释器了。OP需要使用SHOW ERROR,然后修复自己的语法错误。要单击,单击???首先,光标与字段具有相同的名称。即使我也很困惑,更不用说PL/SQL解释器了。OP需要使用SHOW ERROR,然后修复自己的语法错误。修复了,但错误是一样的。我需要一个过程,它只是我代码的一部分。无论你是否需要一个过程,你都不需要游标、循环或变量@user967225。当然错误是一样的,你看到的是错误的错误,请看我答案的第一句话。你还有两个BEGIN语句@user967225。我这样使用它:执行make_payoff1;这不是编译它@user967225时得到的错误。你移除第一个开始了吗?编译时,键入showererrors以查看实际错误。已修复,但错误相同。我需要一个过程,它只是我代码的一部分。无论你是否需要一个过程,你都不需要游标、循环或变量@user967225。当然错误是一样的,你看到的是错误的错误,请看我答案的第一句话。你还有两个BEGIN语句@user967225。我这样使用它:执行make_payoff1;这不是编译它@user967225时得到的错误。你移除第一个开始了吗?编译时,键入showererrors以查看实际错误。