2013-06-15 1 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 

편집 : 내가 커서 이름을 고정했지만 오류가 당신은 s 놓친 같은

+0

'FOR Click IN Click' ??? 우선 커서의 이름은 필드와 같습니다. PL/SQL 인터프리터는 물론 혼란 스럽습니다. –

+0

클릭에서'click' – Brian

+0

OP는 SHOW ERROR를 사용하고 자신의 구문 오류를 수정해야합니다. – APC

답변

1

을 사용하려고 할 때 나타나는 오류입니다. 절차는입니다. 컴파일 할 때 오류가 발생하지 않습니다. 아마도 show errors을 사용하여 프로 시저를 컴파일 할 때 얻은 오류를 찾아서 그 문제를 해결하려고 시도해야합니다.

귀하의 문제는 for click in click이어야합니다. for click in clicks이어야합니다 ... 여분의 s이 아니므로 커서를 반복하고 있습니다.

또한 커서에 FROM click as c을 입력 했으므로 오라클에서는 유효하지 않습니다. 이것은이어야합니다 FROM click c

그리고 두 개의 시작 ... 첫 번째 것을 제거하십시오.

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

입니다.

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

어쨌든 변수 및 커서의 이름을 데이터베이스 필드와 너무 가깝게 지정하지 마십시오. 예를 들어 접두사를 추가하면 쉽게 구별 할 수 있습니다.

관련 문제