![]() |
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 |
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 ![]() 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:
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.
...
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; / 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; |
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 |
Re: Nutzung von Oracle-(Objekt-)Typen in Stored-Procedures
Mich würde interessieren, ob es auch geklappt hat. :wink:
|
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 11:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz