Hi all,

I'm running into a 'PLS-00418: array bind type must match PL/SQL table row 
type' error, but only when passing UTF8 data.

The details are as follows.  I have a PL/SQL packaged function that looks like 
this:
FUNCTION MSTInsUpdCIT(
  PI_CGP_ID                   IN  VARCHAR2
,PI_CBL_ID                   IN  VARCHAR2
,PI_VCL_ID                   IN  VARCHAR2
,PI_CIL_LOCATOR              IN  VARCHAR2
,PI_VCL_ID_TAB                   IN      vcl_id_tab_type
,PI_CIL_LOCATOR_TAB              IN      cil_locator_tab_type
,PI_CIT_HITLISTLINE          IN  VARCHAR2
,PI_CIT_ALPHA_DATE           IN  VARCHAR2
,PI_CIT_START_DATE           IN  VARCHAR2
,PI_CIT_END_DATE             IN  VARCHAR2
,PI_CIT_SORT_DATE            IN  VARCHAR2
  ,PI_CIT_NUMERIC_DATE         IN  VARCHAR2
,PI_VIBC_ID_TAB              IN  VARCHAR2
,PI_CIBD_CODE_TAB            IN  CLOB
,PI_CIT_ABS_WORD_CNT         IN  NUMBER
,PI_CIT_TXT_WORD_CNT         IN  NUMBER
,PI_CIT_TYPE                 IN  VARCHAR2
,PI_CIT_UNDATED_FLAG         IN  VARCHAR2
,PI_CIT_DELETE_FLAG          IN  VARCHAR2
,PI_ROUTER_PRIORITY          IN  NUMBER
,PI_CIT_COVER                IN  VARCHAR2
,PO_VCS_ID                    OUT NUMBER
,PO_DELETE_FLAG              OUT  varchar2
,PO_HOLD_STATUS              OUT  varchar2
,PO_CIT_EXISTS               OUT NUMBER
,po_cit_id                   OUT VARCHAR2
,PO_MESSAGE_GROUP_ID         OUT VARCHAR2) RETURN NUMBER;

The 'cil_locator_tab_type' is defined as:
TYPE cil_locator_TAB_TYPE is table of cnt_item_locators.cil_locator%type index 
by binary_integer;

And cnt_item_locators.cil_locator is VARCHAR2(255 CHAR).

Database characterset is AL32UTF8.

In Perl, I'm defining an array reference as:
my $cil_locator_tab = ['2004322656 Vädskulturmuseet i Göorg',
                       '9789187484124 (Vädskulturmuseet i Göorg)',
                       '2004322656 Vädskulturmuseet i Göorg'];

which has UTF8 characters in it.

Next, I'm setting the multibyte flag via:
Encode::_utf8_on(@{$cil_locator_tab}[0]);
Encode::_utf8_on(@{$cil_locator_tab}[1]);
Encode::_utf8_on(@{$cil_locator_tab}[2]);

Finally, I define a param_hash as:
my $paramHash = {cbl_id           => '23481',
                 vcl_id           => '15',
                 cil_locator      => '2004322656  Vädskulturmuseet i Göorg',
                 vcl_id_tab       => $vcl_id_tab,
                 cil_locator_tab  => $cil_locator_tab,
                 hitlistline      => 'Viñ cielo, luna y arena. El espacio 
Calchaquín el folclore argentino moderno~~~2003~Book Chapter',
                 alphadate        => '2003',
                 startdate        => '20030101',
                 sortdate         => '20030101',
                 numdate          => '20030101',
                 vibc_id_tab      => '1',
                 cibd_code_tab    => 'MLA',
                 cit_abs_word_cnt => '0',
                 cit_txt_word_cnt => '0',
                 cit_undated_flag => 'N',
                 cit_delete_flag  => 'N',
                 router_priority  => '5',
                 cover_flag       => 'N',
                };
And the binding of the datatype is here:
    $sth->bind_param(':PI_CIL_LOCATOR_TAB', $paramHash->{cil_locator_tab},
        {ora_type => ORA_VARCHAR2_TABLE, ora_maxarray_numentries => $maxrows});

Now, I call my PL/SQL, passing the paramHash, and I'm getting the PLS-00418 
error described above.

So, I guess I need to understand how to map my bind variable to match my PL/SQL 
table type.

This seems to work for non-UTF8 data, so, I'm not sure if this is a coding 
error in my code, or some DBD/DBI bug?

Can anyone offer any insights?

Thanks,

-Mark


Reply via email to