2016-05-11 2 views
0

Unten versuche ich meine Sammlung zu gruppieren und macht einige Aufrufe an andere Funktionen/gespeicherte Prozeduren mit den Daten. Aus irgendeinem Grund kann ich nicht herausfinden, warum der Fehler PLS-00382 Ausdruck des falschen Typs ist. Ich habe den Anruf nicht eingeschlossen, aber ich bekomme das gleiche Problem, wenn ich versuche, Recipayment zu Oupayment zuzuweisen. Jede Hilfe wäre willkommen.PLS-00382 mit Oracle Objects und For-Schleife

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; 

Antwort

1

Ich denke, Ihr Fehler ist die Annahme, dass eine Zeile in Recippayment in Ihrer SELECT * FROM TABLE(Listofpayments) Schleife zurückgegeben wird, ist ein Over_Under_Payment Objekt.

Der tatsächliche Typ von Recippayment ist ein record variable of the row type returned by the cursor, mit anderen Worten ein Datensatz, der die gleichen Feldnamen wie Ihr Over_Under_Payment Typ hat.

Eine Möglichkeit, das Verfahren zur Arbeit zu bekommen, ist Ihre Objekte in der inneren Schleife zu rekonstruieren:

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; 

Auf diese Weise ist die Art der Recippayment ein Record-Typ mit einem Feld vom Typ Over_Under_Payment, die ich habe ausgewählt, um Payment zu benennen. Im Schleifenkörper holen wir das Objekt aus dem Datensatz.

Im Übrigen können Sie CAST(Listofpayments AS Over_Under_Payment_List) durch nur Over_Under_Payment_List ersetzen, da Listofpayments bereits vom Typ Over_Under_Payment_List ist.

+0

Vielen Dank für Ihre Hilfe. Ich konnte dazu nichts finden. Das eine lästige Ding ist, dass Sie jedes Attribut/Eigentum auflisten müssen, das Sie haben und nicht einfach sagen * sagen können. Sie wissen sowieso um dies, da ich 25 Eigenschaften für diesen Typ habe und ich werde wahrscheinlich diese Schleife viel verwenden? – Dante

+0

@Dante: Tut mir leid, ich weiß nichts um diese Sache. Oracle-Sammlungen können frustrierend sein, denn ich bin mir sicher, dass Sie das gerade herausfinden! –