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.