![](/img/trans.png)
[英]PLS-00103: Encountered the symbol "BEGIN" when expecting one of the following: " := . ( @ % ;"
[英]How do I fix the error : Encountered the symbol "EXCEPTION" when expecting one of the following: ( begin case declare end exit for goto
當我在未找到數據時嘗試引發異常時出現此錯誤。
第 99/42 行出錯:ORA-06550:第 89 行,第 8 列:PLS-00103:在預期以下情況之一時遇到符號“異常”:
( begin case declare end exit for goto if loop mod null pragma raise return select update while with << continue close current delete fetch lock insert open rollback savepoint set sql execute commit forall merge pipe purge json_exists json_value json_query json_object json_array
BEGIN
DECLARE
p_amt number;
p_user_id number;
p_reference varchar2(100);
p_name varchar2(100);
p_narration varchar2(100);
p_payment_date DATE default sysdate;
p_net_amt NUMBER default null;
p_payment_type_id number;
p_transaction_type_id number;
p_payment_id number;
p_payment_email varchar2(500);
BEGIN
for c in (
SELECT
amount,
reference,
type,
narration,
paid_at,
net_amt,
payment_type_id,
transaction_type_id,
payment_id,
payment_email
INTO
p_amt,
p_reference,
p_name,
p_narration,
p_payment_date,
p_net_amt,
p_payment_type_id,
p_transaction_type_id,
p_payment_id,
p_payment_email
FROM pstk_payload p, JSON_TABLE(
p.webhook_payload,'$'
COLUMNS (
amount varchar2(500) path '$.data.amount',
reference varchar2(500) path '$.data.reference',
type varchar2(500) path '$.data.fees_breakdown.type',
narration varchar2(500) path '$.data.authorization.narration',
paid_at DATE path '$.data.paid_at',
net_amt number path '$.data.fees',
payment_type_id varchar2(500) path '$.data.fees',
transaction_type_id varchar2(500) path '$.data.fees',
payment_id varchar2(500) path '$.data.id',
payment_email varchar2(500) path '$.data.customer.email'
)
)
where status = 'done'
)
LOOP
p_amt := c.amount;
p_reference := c.reference;
p_name := c.type;
p_narration := c.narration;
p_payment_date := c.paid_at;
p_net_amt := c.net_amt;
p_payment_type_id := c.payment_type_id;
p_transaction_type_id := c.transaction_type_id;
p_payment_id := c.payment_id;
p_payment_email := c.payment_email;
select
id
into
p_user_id
from users where email = p_payment_email;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
NULL;
WHEN OTHERS
THEN
RAISE;
dbms_output.put_line(p_user_id);
--update pstk_payload set status = 'done';
PAYMENT_PKG.add_payment(p_amt, p_user_id, p_reference, p_name, p_narration, p_payment_date, p_net_amt, p_payment_type_id, p_transaction_type_id, p_payment_id);
END LOOP;
end;
END;
你有:
BEGIN
DECLARE
<some variables>
BEGIN
FOR c IN (<some query>)
LOOP
<some stuff>
EXCEPTION
WHEN NO_DATA_FOUND
THEN
NULL;
WHEN OTHERS
THEN
RAISE;
<some more stuff>
END LOOP;
END;
END;
在LOOP
內沒有與異常匹配的BEGIN... END
。
任何一個:
在循環中放一個BEGIN... END
:
BEGIN DECLARE <some variables> BEGIN FOR c IN (<some query>) LOOP BEGIN <some stuff> EXCEPTION WHEN NO_DATA_FOUND THEN NULL; WHEN OTHERS THEN RAISE; <some more stuff> END; END LOOP; END; END;
或者將異常處理移到循環之外:
BEGIN DECLARE <some variables> BEGIN FOR c IN (<some query>) LOOP <some stuff> END LOOP; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; WHEN OTHERS THEN RAISE; <some more stuff> END; END;
一旦你解決了這個問題,你會得到更多的錯誤,因為你不能在 cursor 中擁有SELECT.. INTO
。 此外,當您重新引發之前的異常時, <some more stuff>
將永遠不會運行。
就像是:
DECLARE
p_user_id USERS.ID%TYPE;
BEGIN
FOR c IN (
SELECT amount,
reference,
type,
narration,
paid_at,
net_amt,
payment_type_id,
transaction_type_id,
payment_id,
payment_email
FROM pstk_payload p
CROSS JOIN JSON_TABLE(
p.webhook_payload,
'$'
COLUMNS (
amount varchar2(500) path '$.data.amount',
reference varchar2(500) path '$.data.reference',
type varchar2(500) path '$.data.fees_breakdown.type',
narration varchar2(500) path '$.data.authorization.narration',
paid_at DATE path '$.data.paid_at',
net_amt number path '$.data.fees',
payment_type_id varchar2(500) path '$.data.fees',
transaction_type_id varchar2(500) path '$.data.fees',
payment_id varchar2(500) path '$.data.id',
payment_email varchar2(500) path '$.data.customer.email'
)
)
where status = 'done'
)
LOOP
BEGIN
select id
into p_user_id
from users
where email = c.payment_email;
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
WHEN OTHERS THEN
RAISE;
END;
dbms_output.put_line(p_user_id);
--update pstk_payload set status = 'done';
PAYMENT_PKG.add_payment(
c.amount,
p_user_id,
c.reference,
c.type,
c.narration,
c.paid_at,
c.net_amt,
c.payment_type_id,
c.transaction_type_id,
c.payment_id
);
END LOOP;
END;
/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.