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.