I have a table defined as follows:
SQL> desc sb1
Name Null? Type
----------------------------- -------- --------------------
C1 VARCHAR2(30 CHAR)
C2 VARCHAR2(30)
Note the difference is the character semantics, c1 is CHAR, c2 is BYTE.
I am trying to distinguish between them in my perl code which looks like
this:
my $name = 'sb1';
$dbh->{'ora_verbose'} = 6;
my $sth = $dbh->prepare( 'select * from ' . $tname . ' where 1=0' );
my $p = $sth->{PRECISION};
$dbh->{'ora_verbose'} = 0;
log_it(Data::Dumper->Dump([$p], ['$p']));
Here's the output:
OCIHandleAlloc(2548710,25eb278,OCI_HTYPE_STMT,0,0)=SUCCESS
OCIStmtPrepare(25e94b0,256eda8,'select * from SB1 where 1=0',27,1,0)=SUCCESS
OCIAttrGet(25e94b0,OCI_HTYPE_STMT,25eb28c,0,OCI_ATTR_STMT_TYPE,256eda8)=SUCCESS
dbd_st_prepare'd sql SELECT ( auto_lob1, check_sql1)
dbd_describe SELECT (EXPLICIT, lb 80)...
OCIStmtExecute(25763c0,25e94b0,256eda8,0,0,0,0,mode=DESCRIBE_ONLY,16)=SUCCESS
OCIAttrGet(25e94b0,OCI_HTYPE_STMT,7ffcea08f4fc,0,OCI_ATTR_PARAM_COUNT,256eda8)=SUCCESS
OCIParamGet(25e94b0,4,256eda8,25eca10,1,OCI_HTYPE_STMT)=SUCCESS
OCIAttrGet(25ec8f8,OCI_DTYPE_PARAM,25eca40,0,OCI_ATTR_DATA_TYPE,256eda8)=SUCCESS
OCIAttrGet(25ec8f8,OCI_DTYPE_PARAM,25eca42,0,OCI_ATTR_DATA_SIZE,256eda8)=SUCCESS
OCIAttrGet(25ec8f8,OCI_DTYPE_PARAM,25eca58,0,OCI_ATTR_CHAR_USED,256eda8)=SUCCESS
OCIAttrGet(25ec8f8,OCI_DTYPE_PARAM,25eca5a,0,OCI_ATTR_CHAR_SIZE,256eda8)=SUCCESS
OCIAttrGet(25ec8f8,OCI_DTYPE_PARAM,25eca5c,0,OCI_ATTR_CHARSET_ID,256eda8)=SUCCESS
OCIAttrGet(25ec8f8,OCI_DTYPE_PARAM,25eca5e,0,OCI_ATTR_CHARSET_FORM,256eda8)=SUCCESS
OCIAttrGet(25ec8f8,OCI_DTYPE_PARAM,25eca44,0,OCI_ATTR_PRECISION,256eda8)=SUCCESS
OCIAttrGet(25ec8f8,OCI_DTYPE_PARAM,25eca46,0,OCI_ATTR_SCALE,256eda8)=SUCCESS
OCIAttrGet(25ec8f8,OCI_DTYPE_PARAM,25eca47,0,OCI_ATTR_IS_NULL,256eda8)=SUCCESS
OCIAttrGet(25ec8f8,OCI_DTYPE_PARAM,25eca48,7ffcea08f4f8,OCI_ATTR_NAME,256eda8)=SUCCESS
Describe col #1 type=1(VARCHAR)
Described col 1: dbtype 1(VARCHAR), scale 0, prec 120, nullok 1, name C1
: *dbsize 120, char_used 1, char_size 30*, csid 873, csform
1(SQLCS_IMPLICIT), disize 120
fbh 1: 'C1' NULLable, otype 1-> 5, dbsize 120/121, p120.s0
OCIParamGet(25e94b0,4,256eda8,25ecab8,2,OCI_HTYPE_STMT)=SUCCESS
OCIAttrGet(25ec8a8,OCI_DTYPE_PARAM,25ecae8,0,OCI_ATTR_DATA_TYPE,256eda8)=SUCCESS
OCIAttrGet(25ec8a8,OCI_DTYPE_PARAM,25ecaea,0,OCI_ATTR_DATA_SIZE,256eda8)=SUCCESS
OCIAttrGet(25ec8a8,OCI_DTYPE_PARAM,25ecb00,0,OCI_ATTR_CHAR_USED,256eda8)=SUCCESS
OCIAttrGet(25ec8a8,OCI_DTYPE_PARAM,25ecb02,0,OCI_ATTR_CHAR_SIZE,256eda8)=SUCCESS
OCIAttrGet(25ec8a8,OCI_DTYPE_PARAM,25ecb04,0,OCI_ATTR_CHARSET_ID,256eda8)=SUCCESS
OCIAttrGet(25ec8a8,OCI_DTYPE_PARAM,25ecb06,0,OCI_ATTR_CHARSET_FORM,256eda8)=SUCCESS
OCIAttrGet(25ec8a8,OCI_DTYPE_PARAM,25ecaec,0,OCI_ATTR_PRECISION,256eda8)=SUCCESS
OCIAttrGet(25ec8a8,OCI_DTYPE_PARAM,25ecaee,0,OCI_ATTR_SCALE,256eda8)=SUCCESS
OCIAttrGet(25ec8a8,OCI_DTYPE_PARAM,25ecaef,0,OCI_ATTR_IS_NULL,256eda8)=SUCCESS
OCIAttrGet(25ec8a8,OCI_DTYPE_PARAM,25ecaf0,7ffcea08f4f8,OCI_ATTR_NAME,256eda8)=SUCCESS
Describe col #2 type=1(VARCHAR)
Described col 2: dbtype 1(VARCHAR), scale 0, prec 30, nullok 1, name C2
: *dbsize 30, char_used 0, char_size 30*, csid 873, csform
1(SQLCS_IMPLICIT), disize 30
fbh 2: 'C2' NULLable, otype 1-> 5, dbsize 30/31, p30.s0
OCIAttrSet(25e94b0,OCI_HTYPE_STMT,
7ffcea08f4f8,4,Attr=OCI_ATTR_PREFETCH_MEMORY,256eda8)=SUCCESS
OCIAttrSet(25e94b0,OCI_HTYPE_STMT,
7ffcea08f4f4,4,Attr=OCI_ATTR_PREFETCH_ROWS,256eda8)=SUCCESS
cache settings DB Handle RowCacheSize=0,Statement Handle RowCacheSize=0,
OCI_ATTR_PREFETCH_ROWS=156, OCI_ATTR_PREFETCH_MEMORY=0, Rows per Fetch=156,
Multiple Row Fetch=On
OCIDefineByPos(25e94b0,25eca18,256eda8,1,25edc90,121,5,25ecb60,25ecca0,25ecde0,mode=DEFAULT,0)=SUCCESS
calling OCIAttrSet OCI_ATTR_CHARSET_FORM with csform=1 (SQLCS_IMPLICIT)
OCIAttrSet(25ec700,OCI_HTYPE_DEFINE,
25eca5e,0,Attr=OCI_ATTR_CHARSET_FORM,256eda8)=SUCCESS
OCIDefineByPos(25e94b0,25ecac0,256eda8,2,25f32b0,31,5,25f45a0,25f46e0,25f4820,mode=DEFAULT,0)=SUCCESS
calling OCIAttrSet OCI_ATTR_CHARSET_FORM with csform=1 (SQLCS_IMPLICIT)
OCIAttrSet(25ec4b0,OCI_HTYPE_DEFINE,
25ecb06,0,Attr=OCI_ATTR_CHARSET_FORM,256eda8)=SUCCESS
dbd_describe'd 2 columns (row bytes: 150 max, 75 est avg, cache: 0)
$p = [
120,
30
];
As you can see, DBD::Oracle knows the difference but the array returned by
PRECISION is in bytes rather than characters. I want to access the number
of characters.
Is this possible?
Thanks,
Steve
--
------------------------------------------------------------------
This email is intended solely for the use of the addressee and may
contain information that is confidential, proprietary, or both.
If you receive this email in error please immediately notify the
sender and delete the email..
------------------------------------------------------------------