Sorry, but I'm not sure I understand the suggestion.  NCLOB is (as far as I can 
see), not in the picture...

Datatype of table is VARCHAR2(255 CHAR)....

The PL/SQL table type is table of table_name.column_name%type indexed by 
binary_integer

IN TYPE is named type defined as the table type mentioned above...

I don't see how/where NCLOB fits into the picture?

-Mark

-----Original Message-----
From: John Scoles [mailto:sco...@pythian.com] 
Sent: Thursday, February 17, 2011 4:10 PM
To: dbi-users@perl.org
Subject: Re: Problem with UTF8 and array binding....

  On 17/02/2011 3:05 PM, Bobak, Mark wrote:

Perhaps you have to declare you in type as a NCLOB??

Cheers
John
> 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