Einzelnen Beitrag anzeigen

Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#2

Re: PL/SQL: Kompilierungsfehler bei FORALL mit Insert

  Alt 29. Apr 2008, 20:27
Warum fängst du die Exception ab?
So weißt du doch gar nicht was schief lief.
Außerdem, da du jetzt DOA nutzt, würde ich dir Packages empfehlen.
DOA kann die automatisch so verpacken, dass du sie direkt in Delphi nutzen kannst, als wären sie Delphiklassen.
Aus Performancegründen, würde ich empfehlen, die Sequencewerte vorher in einem Rutsch zu holen, damit sämtliche Werte statisch sind oder aus gebundenen Bulk-listen kommen.
Delphi-Quellcode:
type TIDList is table of DBT_DATEN.ID%type;
type TDateList is table of DBT_DATEN.Zeit%type;
type TMessWertList is table of DBT_DATEN.MessWert%type;

procedure SetData(aData in TValueList) is
  
  allIDs TIDList := TIDList();
  allDates TDateList := TDateList();
  allValues TMessWertList := TMessWertList();
begin
  allIDs.Extend(aData.Count);
  allDates.Extend(aData.Count);
  allValues.Extend(aData.Count);

  for i in aData.First .. aData.Last loop
    SELECT Seq_Daten.NextVal
    INTO allIDs(i)
    FROM dual;

    allDates(i) := aData(i).ODATETIME;
    allValues(i) := aData(i).OVALUE;
  end loop;

  forall i in allIDs.First .. allIDs.Last
    INSERT INTO dbt_Daten(ID, ID_MESSORT, ZEIT, MESSWERT)
    VALUES (allIDS(i), MeasurementPointID, allDates(i) , allValues(i));
end;
btw, Enterprise manager stinkt! Schaue dir PL/SQL Developer an, oder die Oracle IDEs von CoreLab.

btw2: Oracle erlaubt es einen Array als Datenquelle zu nutzen.
Deine originale SProc könnte also so aussehen:

SQL-Code:
INSERT INTO DBT_DATEN(ID, ID_MESSORT, ZEIT, MESSWERT)
  SELECT SEQ_DATEN.NEXTVAL, MeasurementPointID, ODATETIME , OVALUE
  FROM table(aData);
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat