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