TOraclePackage does not work with plsql-strings


SQL:
CREATE OR REPLACE PROCEDURE test_plsql_string(p_text OUT VARCHAR2)
IS
BEGIN
    p_text := lpad(' ', 32000, '1234567890absdefgh'||chr(10));
END;

Code:
var Pkg : TOraclePackage;
    a : array of variant;
begin
  Pkg := TOraclePackage.Create(OraSes);
  Pkg.Session := OraSes;
  Pkg.ParameterMode := pmNamed;
  a := vararrayof(['p_text', parString]);
  pkg.CallProcedure('test_plsql_string', a);
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "SYS.TEST_PLSQL_STRING", line 4
ORA-06512: at line 2
======================================================

Propose to add a new parameter:

Code:
1.
var // Parameter types must be otXXXX constant cast to varParType in initialization
...
  parPlSqlString: Variant;

2.
initialization
begin
  parPlSqlString   := VarAsType(otPLSQLString, varParType);

3.
procedure TOraclePackage.SetParameters(const Parameters: array of Variant);
...
    case VarType(v) and VarTypeMask of
      varParType: begin // Bytes are used to set output parameter types
                    Parameter.DataType := v;
                    if not (Parameter.DataType in [otInteger, otString, otplSqlString, otFloat, otDate, otBoolean]) then
...

Then the following code to work out correctly:
Code:
a := vararrayof(['p_text', parPlSqlString]);
  pkg.CallProcedure('test_plsql_string', a);
  ShowMessage(pkg.GetParameter('p_text'));
 
The TOraclePackage component does indeed declare SQL strings for string parameters. I have added your suggestion to the list of enhancement requests.
 
Back
Top