AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Nutzung von Oracle-(Objekt-)Typen in Stored-Procedures
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von malueck · begonnen am 14. Mär 2004 · letzter Beitrag vom 19. Mär 2004
Antwort Antwort
malueck

Registriert seit: 14. Mär 2004
3 Beiträge
 
Delphi 7 Architect
 
#1

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

  Alt 14. Mär 2004, 10:09
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
  Mit Zitat antworten Zitat
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
malueck

Registriert seit: 14. Mär 2004
3 Beiträge
 
Delphi 7 Architect
 
#3

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

  Alt 14. Mär 2004, 19:35
Hi,

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

merci nochmal
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#4

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

  Alt 19. Mär 2004, 01:59
Mich würde interessieren, ob es auch geklappt hat.
  Mit Zitat antworten Zitat
malueck

Registriert seit: 14. Mär 2004
3 Beiträge
 
Delphi 7 Architect
 
#5

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

  Alt 19. Mär 2004, 19:27
Hallo ,

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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:29 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