Ok I will have a look at it and you are right the code does not look quite right.
Do you think you can raise a ticket for this at http://rt.cpan.org/Public/Dist/Display.html?Status=Active&Name=DBD-Oracle that way I can track it better. You do not happen to know what the orginal starting line number was in oci8? cheers John SColes > 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 tablenameew_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. > > >