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