Hello.

I create Oracle-DB with JA16EUC CHARSET,
and select with UTF8 CHARSET.

When converting from JA16EUC to UTF8,
increases the number of bytes of a character sequence.

It occurs ORA-24345 Error.

This patch solve ORA-24345 Problem.

-- 
Mikage Sawatari (Taku Sano) <[EMAIL PROTECTED]>



$ patch < ../DBD-Oracle-1.12-nlsconv-buff.patch


---- DBD-Oracle-1.12-nlsconv-buff.patch ----
--- oci8.c      Sat Sep  1 00:55:05 2001
+++ oci8.c2     Mon Sep 17 13:22:45 2001
@@ -884,7 +884,7 @@
        /*      the simple types        */
        case   1:                               /* VARCHAR2     */
        case  96:                               /* CHAR         */
-               fbh->disize = fbh->dbsize;
+               fbh->disize = fbh->dbsize * 4;
                fbh->prec   = fbh->disize;
                break;
        case  23:                               /* RAW          */


---- execute log before patch ----

[mikage@mana tmp]$ perl dbdtest.pl
DBD::Oracle::st fetchrow_arrayref failed: ORA-24345: A Truncation or null fetch error 
occurred (DBD ERROR: ORA-01406 error on field 1 of 1, ora_type 1) at dbdtest.pl line 
59.
Issuing rollback() for database handle being DESTROY'd without explicit disconnect() 
during global destruction.

---- execute log after patch ----

[mikage@mana tmp]$ perl dbdtest.pl
15

---- nlstest.pl ----

use DBI;
use DBD::Oracle;


BEGIN {
  $ENV{ORACLE_SID} = 'MANA';
  $ENV{ORACLE_HOME} = '/home/oracle/OraHome';
  $ENV{ORACLE_TERM} = 'vt100';
  $ENV{PATH} = $ENV{PATH} . ':' . $ENV{ORACLE_HOME} . '/bin';
  $ENV{LD_LIBRARY_PATH} = $ENV{LD_LIBRARY_PATH} . ':'
    . $ENV{ORACLE_HOME} . '/lib';
  $ENV{ORA_NLS33} = $ENV{ORACLE_HOME} . '/ocommon/nls/admin/data';
  $ENV{NLS_LANG} = 'AMERICAN_AMERICA.UTF8';
  $ENV{NLS_DATE_FORMAT} = 'YYYY-MM-DD HH24:MI:SS';
}

# SQL> create table test (
#   2  data VARCHAR2(10) NOT NULL
#   3  );
# SQL> insert into test values ('てすとです'); 
#                                         # insert Japanese Charactor
# SQL> commit;

$DB = DBI->connect('dbi:Oracle:',q{mikage/Pink0324},'', {
                    AutoCommit => 0, PrintError => 0, RaiseError => 1 })
  or die "Can't connect database.\n";

$DB->trace(10, 'trace.log');

my $sth = $DB->prepare(q{
SELECT * FROM test
});

$sth->execute;

while(my $data = $sth->fetchrow_arrayref) {
}

$DB->commit;
$DB->disconnect;

---- trace.log ----

    DBI::db=HASH(0x81001fc) trace level set to 10 in DBI 1.20-nothread
    Note: perl is running without the recommended perl -w option
    -> prepare for DBD::Oracle::db (DBI::db=HASH(0x81002b0)~0x81001fc '
SELECT *
  FROM test
')
    dbih_setup_handle(DBI::st=HASH(0x8100370)=>DBI::st=HASH(0x8100028), 
DBD::Oracle::st, 810037c, Null!)
    dbih_make_com(DBI::db=HASH(0x81001fc), DBD::Oracle::st, 208)
    dbih_setup_attrib(DBI::st=HASH(0x8100028), Err, DBI::db=HASH(0x81001fc)) 
SCALAR(0x8177b74) (already defined)
    dbih_setup_attrib(DBI::st=HASH(0x8100028), State, DBI::db=HASH(0x81001fc)) 
SCALAR(0x819a9a8) (already defined)
    dbih_setup_attrib(DBI::st=HASH(0x8100028), Errstr, DBI::db=HASH(0x81001fc)) 
SCALAR(0x8177b5c) (already defined)
    dbih_setup_attrib(DBI::st=HASH(0x8100028), Handlers, DBI::db=HASH(0x81001fc)) 
ARRAY(0x8100274) (already defined)
    dbih_setup_attrib(DBI::st=HASH(0x8100028), Debug, DBI::db=HASH(0x81001fc)) 10 
(already defined)
    dbih_setup_attrib(DBI::st=HASH(0x8100028), FetchHashKeyName, 
DBI::db=HASH(0x81001fc)) 'NAME' (already defined)
OCIHandleAlloc(0x81f7cb0,0x825d2c8,OCI_HTYPE_STMT,0,(nil))=SUCCESS
OCIStmtPrepare(0x825c5e8,0x821057c,'
SELECT *
  FROM test
',22,1,0)=SUCCESS
OCIAttrGet(0x825c5e8,OCI_HTYPE_STMT,0x825d2cc,(nil),24,0x821057c)=SUCCESS
    dbd_st_prepare'd sql SELECT
    dbd_describe SELECT (EXPLICIT, lb 80)...
OCIStmtExecute(0x8210510,0x825c5e8,0x821057c,0,0,(nil),(nil),16)=SUCCESS
OCIAttrGet(0x825c5e8,OCI_HTYPE_STMT,0xbffff3c8,(nil),18,0x821057c)=SUCCESS
OCIParamGet(0x825c5e8,4,0x821057c,0x826f278,1)=SUCCESS
OCIAttrGet(0x825c498,OCI_DTYPE_PARAM,0x826f28e,(nil),2,0x821057c)=SUCCESS
OCIAttrGet(0x825c498,OCI_DTYPE_PARAM,0x826f28c,(nil),1,0x821057c)=SUCCESS
OCIAttrGet(0x825c498,OCI_DTYPE_PARAM,0x826f290,(nil),5,0x821057c)=SUCCESS
OCIAttrGet(0x825c498,OCI_DTYPE_PARAM,0x826f292,(nil),6,0x821057c)=SUCCESS
OCIAttrGet(0x825c498,OCI_DTYPE_PARAM,0x826f293,(nil),7,0x821057c)=SUCCESS
OCIAttrGet(0x825c498,OCI_DTYPE_PARAM,0x826f2a0,0xbffff3c4,4,0x821057c)=SUCCESS
    fbh 1: 'DATA'       NO null , otype   1->  5, dbsize 10/11, p10.s0
OCIAttrSet(0x825c5e8,OCI_HTYPE_STMT,0xbffff3c0,4,11,0x821057c)=SUCCESS
OCIDefineByPos(0x825c5e8,0x826f27c,0x821057c,1,0x826f460,11,5,0x826f470,0x826f480,0x826f490,0)=SUCCESS
    dbd_describe'd 1 columns (row bytes: 10 max, 10 est avg, cache: 634)
    <- prepare= DBI::st=HASH(0x8100370) at dbdtest.pl line 52
    -> execute for DBD::Oracle::st (DBI::st=HASH(0x8100370)~0x8100028)
    dbd_st_execute SELECT (out0, lob0)...
OCIStmtExecute(0x8210510,0x825c5e8,0x821057c,0,0,(nil),(nil),0)=SUCCESS
OCIAttrGet(0x825c5e8,OCI_HTYPE_STMT,0xbffff5ca,(nil),10,0x821057c)=SUCCESS
    dbd_st_execute SELECT returned (SUCCESS, rpc0, fn4, out0)
    <- execute= '0E0' at dbdtest.pl line 57
    -> fetchrow_arrayref for DBD::Oracle::st (DBI::st=HASH(0x8100370)~0x8100028)
    dbd_st_fetch 1 fields...
OCIStmtFetch(0x825c5e8,0x821057c,1,2,0)=SUCCESS_WITH_INFO
    dbih_setup_fbav for 1 fields => 0x81003c4
    dbd_st_fetch 1 fields SUCCESS_WITH_INFO
OCIErrorGet(0x821057c,1,"<NULL>",0xbffff0dc,"ORA-24345: A Truncation or null fetch 
error occurred
",1024,2)=SUCCESS
    OCIErrorGet after ORA-01406 error on field 1 of 1, ora_type 1 (er1:ok): -1, 24345: 
ORA-24345: A Truncation or null fetch error occurred

OCIErrorGet(0x821057c,2,"<NULL>",0xbffff0dc,"ORA-24345: A Truncation or null fetch 
error occurred
",1024,2)=NO_DATA
    ERROR EVENT 24345 'ORA-24345: A Truncation or null fetch error occurred (DBD 
ERROR: ORA-01406 error on field 1 of 1, ora_type 1)' on DBI::st=HASH(0x8100028)
        0 (rc=1406): '√.※√..√.→'
    !! ERROR: 24345 'ORA-24345: A Truncation or null fetch error occurred (DBD ERROR: 
ORA-01406 error on field 1 of 1, ora_type 1)'
    <- fetchrow_arrayref= undef row1 at dbdtest.pl line 59
    -> DESTROY for DBD::Oracle::st (DBI::st=HASH(0x8100028)~INNER)
OCIStmtFetch(0x825c5e8,0x821057c,0,2,0)=SUCCESS
OCIHandleFree(0x825c5e8,OCI_HTYPE_STMT)=SUCCESS
    <- DESTROY= undef
    -> DESTROY for DBD::Oracle::db (DBI::db=HASH(0x81001fc)~INNER)
OCITransRollback(0x8210510,0x821057c,0)=SUCCESS
OCISessionEnd(0x8210510,0x821057c,0x821038c,0)=SUCCESS
OCIServerDetach(0x8210aa8,0x821057c,0)=SUCCESS
OCIHandleFree(0x821038c,OCI_HTYPE_SESSION)=SUCCESS
OCIHandleFree(0x8210aa8,OCI_HTYPE_SERVER)=SUCCESS
OCIHandleFree(0x8210510,OCI_HTYPE_SVCCTX)=SUCCESS
OCIHandleFree(0x821057c,OCI_HTYPE_ERROR)=SUCCESS
    <- DESTROY= undef during global destruction

Reply via email to