TOraArray problem with Delphi 32-bit VCL
Posted: Mon 27 Feb 2017 13:23
Hi Team,
We have a problem with TOraArray containing TOraObjects. This is a 32-bit VCL problem only. In 64-bit VCL project the example code below works perfectly.
Oracle SQL code:
Delphi code:
Note: If the Oracle object types above are declared as NOT FINAL then the error is not occurs in 32-bit VCL!
Best regards,
Balázs Miereisz
WINFORM Kft.
We have a problem with TOraArray containing TOraObjects. This is a 32-bit VCL problem only. In 64-bit VCL project the example code below works perfectly.
Oracle SQL code:
Code: Select all
CREATE OR REPLACE TYPE TP_TEST AS OBJECT (
SZAM NUMBER(9),
SZOVEG VARCHAR2(40),
DATUM DATE,
BDOUBLE BINARY_DOUBLE
) FINAL;
/
CREATE TABLE T_TEST OF TP_TEST;
INSERT INTO T_TEST (SZAM, SZOVEG, DATUM, BDOUBLE) VALUES (1, 'One', SYSDATE + 1, 1);
INSERT INTO T_TEST (SZAM, SZOVEG, DATUM, BDOUBLE) VALUES (2, 'Two', SYSDATE + 2, 2);
INSERT INTO T_TEST (SZAM, SZOVEG, DATUM, BDOUBLE) VALUES (3, 'Three', SYSDATE + 3, 3);
COMMIT;
CREATE OR REPLACE TYPE TP_TEST_EXT AS OBJECT (
EXTSTATUS NUMBER(9),
EXTRESULT VARCHAR2(2000),
REC TP_TEST,
CONSTRUCTOR FUNCTION TP_TEST_EXT RETURN SELF AS RESULT
) FINAL;
/
CREATE OR REPLACE TYPE BODY TP_TEST_EXT
AS
CONSTRUCTOR FUNCTION TP_TEST_EXT RETURN SELF AS RESULT
AS
BEGIN
EXTSTATUS := 0;
EXTRESULT := '';
RETURN;
END;
END;
/
CREATE OR REPLACE TYPE TP_TEST_EXT_TBL AS TABLE OF TP_TEST_EXT;
/
CREATE OR REPLACE PROCEDURE P_GET_TEST_EXT_TBL (
oLISTA OUT TP_TEST_EXT_TBL
) AS
BEGIN
oLISTA := TP_TEST_EXT_TBL();
FOR r IN (SELECT t.OBJECT_VALUE ov FROM T_TEST t)
LOOP
oLISTA.EXTEND;
oLISTA(oLISTA.LAST) := TP_TEST_EXT();
oLISTA(oLISTA.LAST).REC := r.OV;
END LOOP;
END P_GET_TEST_EXT_TBL;
/
Code: Select all
procedure TForm1.Button1Click(Sender: TObject);
var
OSP: TOraStoredProc;
R: TOraArray;
begin
OraSession.Connect;
OSP := TOraStoredProc.Create(nil);
R := TOraArray.Create(TOraType.Create(OraSession.OCISvcCtx, 'TP_TEST_EXT_TBL'));
try
OSP.Session := OraSession;
OSP.AutoCommit := True;
OSP.StoredProcName := 'P_GET_TEST_EXT_TBL';
OSP.ParamCheck := True;
OSP.Prepare;
OSP.ParamByName('oLISTA').DataType := ftObject;
OSP.ParamByName('oLISTA').ParamType := ptOutput;
OSP.ParamByName('oLISTA').AsObject := R;
OSP.Execute;
// OCI-22060 error in 32-bit VCL project (works perfectly on 64-bit)
ShowMessage(IntToStr(R.ItemAsObject[0].AttrAsObject['REC'].AttrAsInteger['SZAM']));
finally
OSP.Free;
R.Free;
end;
end;
Best regards,
Balázs Miereisz
WINFORM Kft.