2013-06-15 2 views
0

Где ошибка? Компиляция заканчивается ошибками, и я понятия не имею, где я ошибаюсь.Ошибка в процедуре Oracle, объект недействителен

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 

EDIT: Я исправил имя курсора, но ошибка та же

+0

'FOR Click IN Click' ??? Прежде всего, ваш курсор имеет то же имя, что и ваше поле. Даже я в замешательстве, не говоря уже о интерпретаторе PL/SQL. –

+0

'click' в' clicks' – Brian

+0

OP должен использовать SHOW ERROR, а затем исправить свои собственные синтаксические ошибки. – APC

ответ

1

Это ошибка, которую вы получаете при попытке использовать . Не ошибка, которую вы получаете, когда вы компилируете. Вам нужно найти ошибку, которую вы получите при компиляции процедуры, возможно, используя show errors и попытайтесь решить эту проблему.

Ваша проблема в том, что for click in click должен быть for click in clicks ... Не дополнительные s, так что вы перебираете курсор.

Кроме того, в вашем курсоре вы указали FROM click as c, что недействительно в Oracle. Это должно быть FROM click c

И два BEGINs ... удалить первый.

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; 
+0

исправлено, но ошибка совпадает. Мне нужна процедура, это просто часть моего кода. – user967225

+0

Независимо от того, нужна ли вам процедура, вам не нужен курсор или цикл или переменная @ user967225. Конечно, ошибка такая же, вы смотрите на неправильную ошибку, см. Первое предложение моего ответа. – Ben

+0

Также у вас есть два оператора BEGIN @ user967225. – Ben

1

Вы пропустили s.

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

В любом случае, не называйте переменные и курсоры так близко к полям базы данных. Добавьте некоторый префикс, например, чтобы легко различить.

Смежные вопросы