Page 1 of 1
OraNestedTable and sql data type
Posted: Mon 28 Feb 2011 14:20
by Matteo
Hello,
I'm working with a Delphi 7 project and I need to read data from a sql data type
Code: Select all
TYPE tab_of_data as table of rec_of_data;
TYPE rec_of_data as object (id1 number, id2 number);
I've to submit to a stored procs a nested table containing some records, but I don't know
what's the correct code to fill at run time the TOraNestTable object.
In a previous simpler version (where tab_of_data was a tab of integer) I've used
Code: Select all
pb := TOraNestTable.Create(nil);
pb.CreateObject(OraSession.OCISvcCtx, 'TAB_OF_DATA');
OraSQL.Params.ParamByName('tab_object').AsTable := pb;
OraSQL.ParamByName('tab_object').AsTable.ItemAsInteger[j] := value;
Suggestions?
Posted: Tue 01 Mar 2011 09:10
by AlexP
Hello,
To work with Nested tables you can use the following code:
Code: Select all
CREATE TYPE rec_of_data as object (id1 number, id2 number);
CREATE TYPE tab_of_data as table of rec_of_data;
CREATE TABLE TABLE_OBJ
(
f_id NUMBER,
f_obj tab_of_data
)
NESTED TABLE f_obj STORE AS f_obj_tab;
Code: Select all
var
OraQuery: TOraQuery;
OraNestedTable: TOraNestedTable;
i: integer;
begin
OraQuery:= TOraQuery.Create(nil);
OraNestedTable:= TOraNestedTable.Create(nil);
OraQuery.Session := OraSession1;
OraQuery.SQL.Text:='SELECT * FROM TABLE_OBJ';
OraQuery.KeyFields := 'F_ID';
OraQuery.ObjectView:= true;
OraQuery.Open;
OraNestedTable.DataSetField:=TDataSetField(OraQuery.FieldByName('F_OBJ'));
OraQuery.Append;
OraQuery.FieldByName('F_ID').AsInteger:= 1;
for i:= 1 to 10 do
begin
OraNestedTable.Append;
OraNestedTable.FieldByName('ID1').AsInteger := i;
OraNestedTable.FieldByName('ID2').AsInteger := 1+i;
OraNestedTable.Post
end;
OraQuery.Post;
Posted: Tue 01 Mar 2011 11:03
by Matteo
There is a way to work with TORASQL in place of TOraQuery?
I need that kind of object to exec the stored procedure (and retrieve a dataset from it) and TOraSQL doesn't have Field property.
Posted: Tue 01 Mar 2011 14:31
by AlexP
This is a sample to show working with nested tables as parameters of stored procedures (the types and the table are from the previous sample):
Code: Select all
CREATE OR REPLACE PROCEDURE sp_get_obj(ID IN NUMBER, tab OUT tab_of_data)
AS
BEGIN
SELECT F_OBJ
INTO tab
FROM table_obj
WHERE f_id = ID;
END;
CREATE OR REPLACE PROCEDURE sp_set_obj(ID IN NUMBER, tab IN tab_of_data)
AS
BEGIN
INSERT INTO table_obj VALUES(ID, tab);
END;
Code: Select all
procedure TForm1.get_;
var
OraNestedTable: TOraNestedTable;
i: integer;
begin
OraStoredProc1.ParamByName('TAB').AsTable.CreateObject(OraSession1.OCISvcCtx,'tab_of_data');
OraStoredProc1.ParamByName('ID').AsInteger := 1;
OraStoredProc1.Execute;
OraNestedTable:= TOraNestedTable.Create(nil);
OraNestedTable.Table := OraStoredProc1.ParamByName('TAB').AsTable;
OraNestedTable.Open;
while not OraNestedTable.Eof do
begin
for i:=0 to OraNestedTable.FieldCount -1 do
ShowMessage(OraNestedTable.FieldByName('id1').AsString);
ShowMessage(OraNestedTable.FieldByName('id2').AsString);
OraNestedTable.next;
end;
end;
procedure TForm1.set_;
var
OraNestedTable: TOraNestedTable;
i: integer;
begin
OraNestedTable:= TOraNestedTable.Create(nil);
OraNestedTAble.Table := TOraNestTable.Create(TOraType.create(OraSession1.OCISvcCtx,'tab_of_data'));
OraNestedTable.Open;
for i:= 1 to 10 do
begin
OraNestedTable.Append;
OraNestedTable.FieldByName('ID1').AsInteger := i;
OraNestedTable.FieldByName('ID2').AsInteger := 1+i;
OraNestedTable.Post
end;
OraStoredProc2.ParamByName('ID').AsInteger :=1;
OraStoredProc2.ParamByName('TAB').AsTable:= OraNestedTAble.Table;
OraStoredProc2.Execute;
end;
Posted: Tue 01 Mar 2011 15:44
by Matteo
Works great! Thanks!

Posted: Tue 01 Mar 2011 15:53
by AlexP
Hello,
It is good to see that this problem was solved. If any other questions come up, please contact us.