Einzelnen Beitrag anzeigen

Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#1

PL/SQL: Kompilierungsfehler bei FORALL mit Insert

  Alt 29. Apr 2008, 20:06
Ich bin nach wie vor dabei mich in PL/SQL einzuarbeiten. (Oracle 9i)

Ich habe derzeit ein Package mit folgender Procedure
SQL-Code:
procedure setData(aData in ValueList, count_errors out Integer) is
i Number;
begin
  -- count_errors:=0;
  if MeasurementPointID<>0 then
    for i in aData.First .. aData.Last loop
      Insert Into DBT_DATEN(ID, ID_MESSORT, ZEIT, MESSWERT)
             values (SEQ_DATEN.NEXTVAL, MeasurementPointID, aData(i).ODATETIME , aData(i).OVALUE);
    end loop;
  end if;
end;
SEQ_Daten ist eine Sequenz. MeasurementPointID ist ein Integer aus dem Package-Body. Und aData ist ein "Table of ValueElement" wobei ValueElement ein Objekt ist mit den beiden Feldern, die in der Procedure zu sehen sind.
Der oben gezeigt Code funktioniert auch.

Nun würde ich gerne aus der For-Schleife eine FORALL-Schleife basteln:
SQL-Code:
procedure setData(aData in ValueList, count_errors out Integer) is
i Number;
begin
  -- count_errors:=0;
  if MeasurementPointID<>0 then
    forall i in aData.First .. aData.Last loop
      Insert Into DBT_DATEN(ID, ID_MESSORT, ZEIT, MESSWERT)
             values (SEQ_DATEN.NEXTVAL, MeasurementPointID, aData(i).ODATETIME , aData(i).OVALUE);
  end if;
end;
Das will aber nicht. Egal wo ich Doppelpunkte hinsetze. Ich habe auch schon die Sequenz und die anderen Werte durch Konstanten ersetzt. In SQLPlus bekomme ich nur, dass es nicht kompilierbar ist und im Enterprise Manager sagt er gar nichts und kompiliert halt nicht (wie bei allen Fehlern).

Ich danke jedem für einen Tipp.


Edit:
Da denkt man den kompletten Nachmittag drüber nach und kurz nachdem man es in die DP eingetragen hat, fällt einem die Lösung auf die Tastatur.
Also ich darf (zumindest in Version 9i) nicht Objekte (Bsp.: aData(i).oDateTime) verwenden sondern muss direkt auf Listen verweisen:
SQL-Code:
procedure setData(aDates in DateList, aValues in ValueList, count_errors out Integer) is
i Number;
begin
  count_errors:=0;
  if (MeasurementPointID<>0)and(ADates.count=aValues.Count) then
     FORALL i in aValues.first .. aValues.last SAVE EXCEPTIONS
       Insert Into DBT_DATEN(ID, ID_MESSORT, ZEIT, MESSWERT)
           values
               (SEQ_DATEN.NEXTVAL,
                MeasurementPointID, aDates(i), aValues(i));
  end if;

EXCEPTION
     WHEN OTHERS THEN
       count_errors := SQL%BULK_EXCEPTIONS.COUNT;
end;
DateList und ValueList sind jetzt aufgesplittet (Table of Date und Table of Float) und kein "Table of Object" mehr.
Falls noch jemand Kommentare hat, dann immer her damit, ansonsten hat sich der Punkt erstmal für mich erledigt
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat