2016-05-11 11 views
0

以下では、コレクションをグループ化しようとしていますが、データを使用して他のファンクション/ストアド・プロシージャをコールしています。何らかの理由で私はエラーがなぜ言われているのか分かりません。PLS-00382式が間違ったタイプです。私はコールを含まなかったが、割り当てようとすると同じ問題が発生するRecipaymentOupaymentどんな助けもありがとう。Oracle ObjectsおよびForループを使用するPLS-00382

CREATE OR REPLACE TYPE Over_Under_Payment AS OBJECT 
(
    Demoid   NUMBER, 
    Paymentamount  NUMBER, 
    Month  DATE 
) 

CREATE OR REPLACE TYPE OVER_UNDER_PAYMENT_LIST as table of OVER_UNDER_PAYMENT 


PROCEDURE Pass_Payments(Listofpayments IN Over_Under_Payment_List) IS 

    Oupayment Over_Under_Payment; 

BEGIN 
    FOR Recipient IN (SELECT Demoid 
         FROM TABLE(CAST(Listofpayments AS Over_Under_Payment_List)) 
         GROUP BY Demoid) LOOP 
     FOR Recippayment IN (SELECT * 
          FROM TABLE(CAST(Listofpayments AS Over_Under_Payment_List)) 
          WHERE Demoid = Recipient.Demoid) LOOP 
      Oupayment := Recippayment; 
     END LOOP; 
    END LOOP; 
END; 

答えて

1

私はあなたの間違いがあなたのSELECT * FROM TABLE(Listofpayments)ループでRecippaymentに返された行がOver_Under_Paymentオブジェクトであるという仮定であると思います。

Recippaymentの実際のタイプはrecord variable of the row type returned by the cursorです。換言すれば、Over_Under_Paymentタイプと同じフィールド名を持つレコードです。仕事に手順を取得する

一つの方法は、内側のループでは、あなたのオブジェクトを再構築することです。

FOR Recippayment IN (SELECT Over_Under_Payment(Demoid, Paymentamount, Month) AS Payment 
         FROM TABLE(CAST(Listofpayments AS Over_Under_Payment_List)) 
         WHERE Demoid = Recipient.Demoid) LOOP 
     Oupayment := Recippayment.Payment; 
    END LOOP; 

この方法で、Recippaymentの種類は、私がきたタイプOver_Under_Paymentの一つのフィールドを持つレコード型でありますPaymentという名前が選ばれました。ループ本体では、オブジェクトをレコードからフェッチします。

なおCAST(Listofpayments AS Over_Under_Payment_List)Over_Under_Payment_Listと置き換えることができます。ListofpaymentsはすでにOver_Under_Payment_Listです。

+0

ご協力いただきありがとうございます。これで何も見つかりませんでした。 1つの厄介なことは、あなたが持っているすべての属性/プロパティをリストアップしなければならないということです。あなたはこのタイプの25のプロパティを持っているので、この周りにはとにかく知っています。 – Dante

+0

@Dante:申し訳ありませんが、私はこれを回避する方法はわかりません。 Oracleのコレクションは、あなたが今すぐ見つけていると確信しているので、対処するのにイライラすることができます! –

関連する問題