Hi *,
I'm using DBD::Oracle (code checked onCPAN and verified in version 1.21) and 
encountered a problem (DB is Oracle 10gR2) related to LOBs and synonyms:

Table TTHUMBNAIL (DOCUMENT_ID NUMBER(12), THUMBNAIL BLOB NOT NULL) is owned by 
user DMSSGADM. User DMSSGDP has a synonym TTHUMBNAIL on the table and all 
necessary rights granted.

When executing the following code

$sthInsertTTHUMBNAIL = prepareStatement($dbh,
                                        'INSERT ' .
                                        'INTO    tthumbnail ' .
                                        '       (document_id, ' .
                                        '        thumbnail) ' .
                                        'VALUES (document_id_seq.CURRVAL, ' .
                                        '        ?)');
$sthInsertTTHUMBNAIL->bind_param(1, $thumbnail, { ora_type => ORA_BLOB });
$sthInsertTTHUMBNAIL->execute();

I get the following error:

ORA-04043: object DMSSGADMTTHUMBNAIL.TTHUMBNAIL does not exist (DBD SUCCESS: 
OCIDescribeAny(view)/LOB refetch)

Currently I tracked down the error to the following place in oci8.c, but since 
I got no compiler here, I can't verify further:

01 #ifdef OCI_ATTR_OBJ_NAME /* not in 8.0.x */
02     OCIDescribeAny_log_stat(imp_sth->svchp, errhp, tablename, 
strlen(tablename),
03              (ub1)OCI_OTYPE_NAME, (ub1)1, (ub1)OCI_PTYPE_SYN, dschp, status);
04     if (status == OCI_SUCCESS) { /* There is a synonym, get the schema */
05       char new_tablename[100];
06       char *syn_schema=NULL,  *syn_name=NULL;
07       OCIAttrGet_log_stat(dschp,  OCI_HTYPE_DESCRIBE,
08                                &parmhp, 0, OCI_ATTR_PARAM, errhp, status);
09       OCIAttrGet_log_stat(parmhp, OCI_DTYPE_PARAM,
10                        &syn_schema, 0, OCI_ATTR_SCHEMA_NAME, errhp, status);
11       OCIAttrGet_log_stat(parmhp, OCI_DTYPE_PARAM,
12                        &syn_name, 0, OCI_ATTR_OBJ_NAME, errhp, status);
13       strcpy(new_tablename, syn_schema);
14       strcat(new_tablename, ".");
15       strcat(new_tablename, syn_name);
16       tablename=new_tablename;
17       if (DBIS->debug >= 3)
18      PerlIO_printf(DBILOGFP, "       lob refetch synonym, schema=%s, 
name=%s, new tablename=%s\n", syn_schema, syn_name, tablename);
19     }
20 #endif /* OCI_ATTR_OBJ_NAME */

First, lines 05 & 16 constitute a very bad situation, since the pointer refers 
to a stack variable that is freed when the block is closed :-( So this buffer 
should be declared outside the block, anyway...

And from what I know about OCIAttrGet, if you retrieve a text attribute, you 
have to pass a pointer to receive the length of the string, as it is not '\0' 
terminated! After that you would call something like

strncpy(new_tablename, syn_schema, syn_schema_length);
strcpy (new_tablename, ".");
strncpy(new_tablename, syn_name, syn_name_length);

I'm looking forward to hearing from you about the issue, since I'm really stuck 
on the topic.

Sincerely,

  Mirko Kraft

UBS AG
Global Wealth Management & Business Banking
Information Technology
eRMS - electronic Records Management Solutions
Viaduktstr. 31-35, PO Box 4473, CH-4051 Basel
Tel. +41-61-288 53 72
Fax +41-61-288 71 91
www.ubs.com

Based on previous e-mail correspondence with you and/or an agreement reached 
with you, UBS considers itself authorized to contact you via unsecured e-mail.
Warning:
(a) E-mails can involve SUBSTANTIAL RISKS, e.g. lack of confidentiality, 
potential manipulation of contents and/or sender's address, incorrect recipient 
(misdirection), viruses etc. UBS assumes no responsibility for any loss or 
damage resulting from the use of e-mails. UBS recommends in particular that you 
do NOT SEND ANY SENSITIVE INFORMATION, that you do not include details of the 
previous message in any reply, and that you enter e-mail address(es) manually 
every time you write an e-mail.
(b) As a matter of principle, UBS does NOT accept any ORDERS, revocations of 
orders or authorizations, blocking of credit cards, etc., sent by e-mail. 
Should such an e-mail nevertheless be received, UBS is not obliged to act on or 
respond to the e-mail.
Please notify UBS immediately if you received this e-mail by mistake or if you 
do not wish to receive any further e-mail correspondence. If you have received 
this e-mail by mistake, please completely delete it (and any attachments) and 
do not forward it or inform any other person of its contents.
 

Reply via email to