簡體   English   中英

如何修復錯誤:在預期以下情況之一時遇到符號“EXCEPTION”:( begin case declare end exit for goto

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM