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;