Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Nutzung von Oracle-(Objekt-)Typen in Stored-Procedures (https://www.delphipraxis.net/18080-nutzung-von-oracle-objekt-typen-stored-procedures.html)

malueck 14. Mär 2004 09:09


Nutzung von Oracle-(Objekt-)Typen in Stored-Procedures
 
Hallo,

hat jemand einen Lösungsvorschlag (falls es überhaupt einen gibt...), wie man in Delphi eine Stored-Procedure startet, die eine Oracle-Procedur mit einem Type beinhaltet?

Die PL/SQL-Routine hat eine Referenz
- auf eine Tabelle (%rowtype)
- auf verschiedene Typedefinitionen

folgendes Beispiel:

:
type t_adr_info is table of adr_info%rowtype index by binary_integer;
type t_bank_info is table of bank_info%rowtype index by binary_integer;
type t_komm_info is table of komm_info%rowtype index by binary_integer;
:
procedure p_insert( a_adresse in adressen%rowtype
, a_adr_info in t_adr_info
, a_bank_info in t_bank_info
, a_komm_info in t_komm_info)
is
:

Wie kann man jetzt aus Delphi auf die IN-Parameter über eine Stored-Procedure zu greifen bzw. diese Parameter aus einem Delphi-Programm setzen ???

Gruss
Matthias

Robert_G 14. Mär 2004 17:08

Re: Nutzung von Oracle-(Objekt-)Typen in Stored-Procedures
 
Liste der Anhänge anzeigen (Anzahl: 2)
Herzlich Willkommen in der Delphi-PRAXIS :hello:

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 ( :wink: ) 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;

malueck 14. Mär 2004 18:35

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

vielen Dank ... bin bei meiner sonntäglichen Suche bereits auf die besagten Komponenten gestolpert :-D

merci nochmal

Robert_G 19. Mär 2004 00:59

Re: Nutzung von Oracle-(Objekt-)Typen in Stored-Procedures
 
Mich würde interessieren, ob es auch geklappt hat. :wink:

malueck 19. Mär 2004 18:27

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

mit der Komponenten-Sammlung klappt jetzt ein Zugriff auf Oracle-Typen und Index-By-Tabellen, so wie ich mir das vorstelle! Die Investition in die Komponenten wird sich lohnen :!:

Viele Grüße
Matthias


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz