Einzelnen Beitrag anzeigen

Robert_G
(Gast)

n/a Beiträge
 
#2

Re: Nutzung von Oracle-(Objekt-)Typen in Stored-Procedures

  Alt 14. Mär 2004, 18:08
Herzlich Willkommen in der Delphi-PRAXIS

Mit den Standard DB-Kompos wirst du da IMHO nicht viel Glück haben

Wenn du Direct Oracle Access benutzt, ist es aber relativ einfach PL/SQL-Tables zu übergeben und nach dem Ausführen wieder auszulesen.

Auch wenn du es noch ( ) nicht hast, du kannst dir unter dem Link auch eine komplette 30 Tage Testversion ziehen.

Wenn du die angehängte exe ausführst, musst du zuerst unter "Rebuild DB Objects" auf Rebuild klicken.
Das erzeugt ein kleines Package im scott-Schema und die benötigten SQL-Typen (ebenfalls im scott-schema).

SQL-Code:
...
CREATE OR REPLACE TYPE SCOTT.emp_rec_type AS OBJECT
(
    empno NUMBER(4),
    ename VARCHAR2(10),
    job VARCHAR2(9),
    mgr NUMBER(4),
    hiredate DATE,
    sal NUMBER(7, 2),
    comm NUMBER(7, 2),
    deptno NUMBER(2)
)
/
CREATE OR REPLACE Type scott.emp_tab_type As Table of scott.emp_rec_type;
/
CREATE OR REPLACE PACKAGE SCOTT.test_array_bind IS

  PROCEDURE insert_emp(i_emp_rec IN scott.emp_rec_type,
                       emp_tab IN OUT scott.emp_tab_type);
END;
/
CREATE OR REPLACE PACKAGE BODY scott.test_array_bind IS
  PROCEDURE insert_emp(i_emp_rec IN scott.emp_rec_type,
                       emp_tab IN OUT scott.emp_tab_type) IS
  
    CURSOR c1 IS
      SELECT SCOTT.emp_rec_type(empno
                               ,ename
                               ,job
                               ,mgr
                               ,hiredate
                               ,sal
                               ,comm
                               ,deptno)
      
      FROM scott.emp;
  BEGIN
    INSERT INTO scott.emp
    VALUES
      (i_emp_rec.empno
      ,i_emp_rec.ename
      ,i_emp_rec.job
      ,i_emp_rec.mgr
      ,i_emp_rec.hiredate
      ,i_emp_rec.sal
      ,i_emp_rec.comm
      ,i_emp_rec.deptno
       
       );
    Open c1;
  
    Fetch c1 Bulk Collect
      INTO emp_tab;
    Close c1;
  EXCEPTION
    WHEN OTHERS THEN
      If c1%IsOpen THEN
        Close c1;
      END If;
      RAISE;
  END;
END;
/
Die Prozedur macht nichts weiter als einen Eintrag in die emp-Tabelle einzufügen und danach die ganze Tabelle per Bulk Collect in die PL/SQL-Table zu schreiben.

In meinem Beispiel-projekt wird eine Kapselung dieser Prozedur benutzt, um dir zu zeigen, dass es möglich ist Oracle PL/SQL Objekte aufzurufen ohne die Delphi-syntax zu verlassen.

Delphi-Quellcode:
Var
  emp_rec, emp_tab: TORacleObject;
  i, j: Integer;
  SetCtrl: TControl;
Begin
  // Create Objects
  emp_rec := TOracleObject.Create(Oraclesession1, 'scott.emp_rec_type', '');
  emp_tab := TOracleObject.Create(Oraclesession1, 'scott.emp_tab_type', '');

  // Find all Components named like Attributes in emp_rec_type and assign values to emp_rec
  For i := 0 To pred(emp_rec.AttrCount) Do
    If FindComponent(emp_rec.Attrs[i].Name) <> Nil Then
    Begin
      SetCtrl := TControl(FindComponent(emp_rec.Attrs[i].Name));
      With emp_rec Do
        If SetCtrl Is TEdit Then
          With SetCtrl As TEdit Do
            SetAttr(emp_rec.Attrs[i].Name, Text)
        Else If SetCtrl Is TDateTimePicker Then
          With SetCtrl As TDateTimePicker Do
            SetAttr(emp_rec.Attrs[i].Name, Date);

    End;
  // execute package procedure
  Test_Array_Bind.Insert_Emp(emp_rec, emp_tab);
  // write content of emp_tab into log memo
  Memo1.Lines.Add('---------------------------------------');
  For i := 0 To pred(emp_tab.ElementCount) Do
    With emp_tab.ObjElements[i] Do
    Begin
      Memo1.Lines.Add('Record ' + IntToStr(succ(i)));
      For j := 0 To pred(AttrCount) Do
        Memo1.Lines.Add(' ' + Attrs[j].Name + ': "' + Attrs[j].asString + '"');
    End;
End;
Angehängte Dateien
Dateityp: zip doa_objrel_source_864.zip (9,4 KB, 10x aufgerufen)
Dateityp: zip doa_objrel_binary_165.zip (633,6 KB, 14x aufgerufen)
  Mit Zitat antworten Zitat