#32859 [Fbk->Opn]: Error when attempting to write Clob to oracle
ID: 32859 User updated by: Diomedes_01 at yahoo dot com Reported By: Diomedes_01 at yahoo dot com -Status: Feedback +Status: Open Bug Type: OCI8 related Operating System: Solaris 9 (Server) PHP Version: 5.0.4 Assigned To: tony2001 New Comment: With regards to my problem, it was not an issue of the clob not being initialized. I noticed this problem on CLOBs that were already in existence. Using a stored procedure we have that updates the value of the CLOB, that was when I noticed the error. One thing I will verify with our DBA is the possibility that the recent upgrade of the database to UTF-8 could be contributing to the problem. I will try to replicate the issue with PHP 5.0.4 against our older UTF-7 ASCII database. Previous Comments: [2005-06-13 08:41:26] [EMAIL PROTECTED] So you tried to write CLOB without setting it empty with EMPTY_CLOB() ? Am I right? [2005-06-13 02:03:35] ab5602 at wayne dot edu This appears to possibly be parsing problem with the oci_parse function not returning a real placeholder location. The placeholder :fieldname does not work if used in this fashion during an sql statement in v5.0.4, I've found this to work in previous versions: update table mytable set clob1=:clob; However, I've found it to work in v5.0.4 if the sql is rewritten such as: update table mytable set clob1=empty_clob() returning clob1 as :clob; [2005-04-28 19:48:32] Diomedes_01 at yahoo dot com Unfortunately, my website is behind a firewall and contains company sensitive information; so I cannot grant access. The reproducible code is already included; please note that I attempted to continue using my previous PHP4 code (that worked beforehand) and it failed. That code was: WriteTemporary($comments); OCIExecute ($sth, OCI_DEFAULT) or display_main_error(); $clob->close(); $clob->free(); OCIFreeStatement($sth); ?> When I attempted to execute the above code, I received a fatal error from PHP indicating that the writeTemporary method was not found. According to what I read in the documentation, it appears to not be part of the new OCI class. So when I followed the documentation and re-implemented the code following the instructions provided; which by the way, look like so: (straight from your online help) = 4.0.6). * Example PL/SQL stored procedure signature is: * * PROCEDURE save_data * Argument Name TypeIn/Out Default? * -- --- -- * KEYNUMBER(38) IN * DATA CLOBIN * */ $conn = oci_connect($user, $password); $stmt = oci_parse($conn, "begin save_data(:key, :data); end;"); $clob = oci_new_descriptor($conn, OCI_D_LOB); oci_bind_by_name($stmt, ':key', $key); oci_bind_by_name($stmt, ':data', $clob, -1, OCI_B_CLOB); $clob->write($data); oci_execute($stmt, OCI_DEFAULT); oci_commit($conn); $clob->free(); oci_free_statement($stmt); ?> Here is the documentation URL: http://us2.php.net/manual/en/function.oci-new-descriptor.php That is when I receive a problem with regards to the 'write' method. So either this is a bug or a documentation problem; I know the stored procedure I am using works and that the variables being passed are valid. It works in SQL*Plus and it works if I revert back to PHP4. Please advise. [2005-04-28 15:04:53] [EMAIL PROTECTED] Thank you for this bug report. To properly diagnose the problem, we need a short but complete example script to be able to reproduce this bug ourselves. A proper reproducing script starts with , is max. 10-20 lines long and does not require any external resources such as databases, etc. If possible, make the script source available online and provide an URL to it here. Try to avoid embedding huge scripts into the report. Also, you don't have to modify your script to make it run with PHP5. Old-style named functions are working in the same way as in PHP4. [2005-04-27 21:44:58] Diomedes_01 at yahoo dot com Description: I am receiving errors after upgrading from php 4.3.9 to php 5.0.4 when attempting to upload a clob to my Oracle database. The code has already been modified to follow the PHP 5 paradigm; but it is refusing to function. Code is as follows: Reproduce code: --- $sql1 = ("begin append_comments(:incident_id,:comments_id);end;"); $sth = oci_parse ( $connection, $sql1 ) or display_main_error(); $clob = oci_new_descripto
#32859 [Fbk->Opn]: Error when attempting to write Clob to oracle
ID: 32859 User updated by: Diomedes_01 at yahoo dot com Reported By: Diomedes_01 at yahoo dot com -Status: Feedback +Status: Open Bug Type: OCI8 related Operating System: Solaris 9 (Server) PHP Version: 5.0.4 New Comment: Unfortunately, my website is behind a firewall and contains company sensitive information; so I cannot grant access. The reproducible code is already included; please note that I attempted to continue using my previous PHP4 code (that worked beforehand) and it failed. That code was: WriteTemporary($comments); OCIExecute ($sth, OCI_DEFAULT) or display_main_error(); $clob->close(); $clob->free(); OCIFreeStatement($sth); ?> When I attempted to execute the above code, I received a fatal error from PHP indicating that the writeTemporary method was not found. According to what I read in the documentation, it appears to not be part of the new OCI class. So when I followed the documentation and re-implemented the code following the instructions provided; which by the way, look like so: (straight from your online help) = 4.0.6). * Example PL/SQL stored procedure signature is: * * PROCEDURE save_data * Argument Name TypeIn/Out Default? * -- --- -- * KEYNUMBER(38) IN * DATA CLOBIN * */ $conn = oci_connect($user, $password); $stmt = oci_parse($conn, "begin save_data(:key, :data); end;"); $clob = oci_new_descriptor($conn, OCI_D_LOB); oci_bind_by_name($stmt, ':key', $key); oci_bind_by_name($stmt, ':data', $clob, -1, OCI_B_CLOB); $clob->write($data); oci_execute($stmt, OCI_DEFAULT); oci_commit($conn); $clob->free(); oci_free_statement($stmt); ?> Here is the documentation URL: http://us2.php.net/manual/en/function.oci-new-descriptor.php That is when I receive a problem with regards to the 'write' method. So either this is a bug or a documentation problem; I know the stored procedure I am using works and that the variables being passed are valid. It works in SQL*Plus and it works if I revert back to PHP4. Please advise. Previous Comments: [2005-04-28 15:04:53] [EMAIL PROTECTED] Thank you for this bug report. To properly diagnose the problem, we need a short but complete example script to be able to reproduce this bug ourselves. A proper reproducing script starts with , is max. 10-20 lines long and does not require any external resources such as databases, etc. If possible, make the script source available online and provide an URL to it here. Try to avoid embedding huge scripts into the report. Also, you don't have to modify your script to make it run with PHP5. Old-style named functions are working in the same way as in PHP4. [2005-04-27 21:44:58] Diomedes_01 at yahoo dot com Description: I am receiving errors after upgrading from php 4.3.9 to php 5.0.4 when attempting to upload a clob to my Oracle database. The code has already been modified to follow the PHP 5 paradigm; but it is refusing to function. Code is as follows: Reproduce code: --- $sql1 = ("begin append_comments(:incident_id,:comments_id);end;"); $sth = oci_parse ( $connection, $sql1 ) or display_main_error(); $clob = oci_new_descriptor ($connection, OCI_D_LOB); oci_bind_by_name ( $sth, ":incident_id", $incident ); oci_bind_by_name ($sth, ":comments_id", &$clob, -1, OCI_B_CLOB ); $clob->write($comments); oci_execute ($sth, OCI_DEFAULT) or display_main_error(); oci_commit($connection); $clob->free(); oci_free_statement($sth); Expected result: The above code should properly insert the clob into the Oracle database. The code executed correctly in php4.3.9 and the stored procedure being used functions normally in SQL*Plus. Actual result: -- I receive the following warnings from PHP when attempting to execute the code: Warning: OCI-Lob::write() [function.write]: OCILobGetLength: OCI_INVALID_HANDLE in /www/htdocs/EtrackTest/oracle_update.php on line 218 Warning: oci_execute() [function.oci-execute]: OCIStmtExecute: ORA-22275: invalid LOB locator specified ORA-06512: at "SYS.DBMS_LOB", line 366 ORA-06512: at "ETRACK.APPEND_COMMENTS", line 14 ORA-06512: at line 1 in /www/htdocs/EtrackTest/oracle_update.php on line 219 The code I use is virtually identical to what exists in the PHP documentation. -- Edit this bug report at http://bugs.php.net/?id=32859&edit=1