php oci clob-PHP OCI执行oracle存储过程如何传递CLOB参数

问题描述

PHP OCI执行oracle存储过程如何传递CLOB参数

_下面的代码有关于测试数据表test_clob,以及插入记录的存储过程test_p_saveclob 。代码如下:
#!/opt/php/bin/php -q
<?php
// 参考:http://www.golaravel.com/php/function.oci-new-descriptor.html
// 参考:http://php.net/manual/zh/function.oci-bind-by-name.php

/*
1)数据表 test_clob
SQL> desc test_clob
Name Null? Type


ID NUMBER
BIGSTR CLOB
SNAM VARCHAR2(20)

SQL>
2)存储过程
SQL> desc test_p_saveclob
PROCEDURE test_p_saveclob
Argument Name Type In/Out Default?


I_ID NUMBER(38) IN
I_BIGSTR CLOB IN
I_SNAM VARCHAR2 IN
O_COUNT NUMBER(38) OUT
O_RETURN NUMBER(38) OUT

SQL>

CREATE OR REPLACE PROCEDURE TEST_P_SAVECLOB
(
I_ID IN INT,
I_BIGSTR IN CLOB,
I_SNAM IN VARCHAR2,
O_COUNT OUT INT, --返回值导入的号码数量
O_RETURN OUT INT --返回值:0为导入成,-1为导入失败
)
AS
V_BIGSTR CLOB;
BEGIN
--INSERT INTO TEST_CLOB(ID,BIGSTR,SNAM) VALUES(I_ID ,I_BIGSTR ,I_SNAM);
--insert into TEST_CLOB(id,BIGSTR,SNAM) values(I_ID ,EMPTY_CLOB() ,I_SNAM) returning BIGSTR into I_BIGSTR;
INSERT INTO TEST_CLOB(ID,BIGSTR,SNAM) VALUES(I_ID ,EMPTY_CLOB() ,I_SNAM);
SELECT BIGSTR INTO V_BIGSTR FROM TEST_CLOB WHERE ID=I_ID;
DBMS_LOB.OPEN(V_BIGSTR,DBMS_LOB.LOB_READWRITE);
DBMS_LOB.WRITE(V_BIGSTR,LENGTH(I_BIGSTR),1,I_BIGSTR);
DBMS_LOB.CLOSE(V_BIGSTR);
O_COUNT := 1; --插入的个数
O_RETURN := 0; --插入成功
END;

3)pl/sql测试:
declare
O_COUNT int := 88;
O_RETURN int := -2;
begin
TEST_P_SAVECLOB(3,'11111111---','wjj',O_COUNT,O_RETURN);
commit;
end;

*/

//参数--------------
$I_ID = 5;
$I_BIGSTR = '---abc--';
$I_BIGSTR = str_repeat($I_BIGSTR,12);
$I_SNAM = 'wjj';
$O_COUNT = 88;
$O_RETURN = -2;

  $db_str = "172.29.3.191/mobile";
  $conn = oci_connect("帐号", "密码",$db_str);

   $sql_sp = "begin TEST_P_SAVECLOB(:I_ID ,:I_BIGSTR ,:I_SNAM ,:O_COUNT ,:O_RETURN); end;";
   $stmt = oci_parse($conn, $sql_sp);

   //输入参数
   oci_bind_by_name($stmt, ":I_ID", $I_ID ,32);
   oci_bind_by_name($stmt, ":I_SNAM", $I_SNAM ,64);
   //输出参数
   oci_bind_by_name($stmt, ":O_COUNT", $O_COUNT, 32);
   oci_bind_by_name($stmt, ":O_RETURN", $O_RETURN, 32);

//oci_execute($stmt, OCI_DEFAULT);

   //大数据CLOB: // Create a new lob descriptor object
   $textLob = oci_new_descriptor($conn, OCI_D_LOB);
   oci_bind_by_name($stmt, ":I_BIGSTR", $textLob, -1, OCI_B_CLOB);

   //$textLob->write($I_BIGSTR);
   $textLob->write($I_BIGSTR);
   oci_execute($stmt, OCI_DEFAULT);

/*

   // Execute the statement but do not commit
  oci_execute($stmt, OCI_DEFAULT);
   // Save the body of the blog entry to the CLOB
    if ( !$textLob->save($I_BIGSTR) ) {  //这里才是处理CLOB大数据的关键技术
        // Rollback the procedure
        oci_rollback($conn);
        die ("Error saving lob
");
    }

*/
// Everything OK so commit
oci_commit($conn);
echo $O_COUNT,"--",$O_RETURN,"
";

?>

可是在linux下面运行后,总是报错,如下:
vm-web1:/var/www/html/test # ./clob-proc2.php
PHP Warning: OCI-Lob::write(): OCI_INVALID_HANDLE in /var/www/html/test/clob-proc2.php on line 85
?
Warning: OCI-Lob::write(): OCI_INVALID_HANDLE in /var/www/html/test/clob-proc2.php on line 85
PHP Warning: oci_execute(): ORA-22275: invalid LOB locator specified
ORA-06512: at "YLCQ.TEST_P_SAVECLOB", line 17
ORA-06512: at line 1 in /var/www/html/test/clob-proc2.php on line 86

Warning: oci_execute(): ORA-22275: invalid LOB locator specified
ORA-06512: at "YLCQ.TEST_P_SAVECLOB", line 17
ORA-06512: at line 1 in /var/www/html/test/clob-proc2.php on line 86
88---2
vm-web1:/var/www/html/test #
问题:在sqlplus中用匿名过程调用存储过程test_p_saveclob,一切都正常,数据表中可以新增一条记录。可是用上面的php脚本测试,就出错!
求高手指点!
__

解决方案

Oracle执行参数化SQL语句和存储过程

时间: 2024-09-16 00:29:53

php oci clob-PHP OCI执行oracle存储过程如何传递CLOB参数的相关文章

ado.net执行oracle 存储过程

  ado.net执行oracle 存储过程如下: OracleConnection con=new OracleConnection(strcon); OracleCommand cmd=new OracleCommand(); OracleTransaction mytrans ; try { con.Open (); mytrans =con.BeginTransaction(); cmd.Connection =con; cmd.CommandText ="rfgetid";

cursor-如何用OleDbCommand执行Oracle存储过程,返回REF CURSOR类型的结果集

问题描述 如何用OleDbCommand执行Oracle存储过程,返回REF CURSOR类型的结果集 如何用OleDb执行Oracle存储过程,返回REF CURSOR类型的结果集??? 如何设值OleDbCommand的Parameters啊? 要求用OleDb,而不是OracleClient! 该存储过程的参数如果只有一个CURSOR类型的结果集,或者一个CURSOR类型的结果集参数一个其他类型的参数,调用也没有问题, 一旦除了CURSOR类型的结果集参数外,还有两个或多个以上的参数时就不

用PHP执行Oracle存储过程示例

oracle|存储过程|示例|执行 <?//在oracle中执行存储过程示例//供大家参考$gConn=ocilogon("test","test"); /* OCIDefineByPos example thies@digicol.de (980219) *///discrate与nEcode是out parameter,其余均是 in parameter.//存储过程get_discrate存放于package ebiz_pg中.$stmt = OCIPa

java调用存储过程的传递Date参数的问题

建了一个存储过程 create procedure PR_YDFT_GETFT_TIME @AJLB tinyint, -- 案件类别 @AJBHLIST varchar(1500), -- 案件编号列表 @KSSJ datetime, -- 开始时间 @JSSJ datetime -- 结束时间 as begin ---- select BH, AH from K_ZS..B_ZX where(这里返回一个结果集) end 在java代码中如下调用(时间类型为java.sql.Date),即使

PUSH模式,RDLC使用同一个存储过程,传递的参数不一样,如何把这几张表放在同一个RDLC里?如何绑定数据源?有示例代码最好,谢谢。

问题描述 谢谢. 解决方案 解决方案二: 解决方案三:该回复于2012-01-31 13:39:05被版主删除解决方案四:该回复于2012-01-31 14:16:26被版主删除

JAVA与Oracle存储过程(一)

在大型数据库系统中,有两个很重要作用的功能,那就是存储过程和触发器.在数据库系统中无论是存储过程还是触发器,都是通过SQL 语句和控制流程语句的集合来完成的.相对来说,数据库系统中的触发器也是一种存储过程.存储过程在数据库中运算时自动生成各种执行方式,因此,大大提高了对其运行时的执行速度.在大型数据库系统如Oracle.SQL Server中都不仅提供了用户自定义存储过程的功能,同时也提供了许多可作为工具进行调用的系统自带存储过程. 所谓存储过程(Stored Procedure),就是一组用于

asp.net中oracle 存储过程(图文)_jquery

在大型数据库系统中,存储过程和触发器具有很重要的作用.无论是存储过程还是触发器,都是SQL 语句和流程控制语句的集合. ORACLE代码 CREATE OR REPLACE PROCEDURE gd_CURSOR(MYCS1 OUT SYS_REFCURSOR,MYCS2 OUT SYS_REFCURSOR,a out varchar)as BEGIN a:='test'; OPEN MYCS1 FOR SELECT 1 from dual; OPEN MYCS2 FOR SELECT 2 fr

oracle存储过程字符串数组参数得不到值?

问题描述 应用程序传递到oracle存储过程的字符串数组参数得不到值,都是空值.但是number数组没有问题?请问各位兄弟姐妹,有什么解决的办法?下面是我的代码:/**自定义number数组**/createorreplacetypearray_numistableofnumber;/**自定义varchar2数组**/createorreplacetypearray_varchar2_50istableofvarchar2(50);/**测试存储过程**/createorreplaceproc

在JAVA端使Oracle存储过程串行地执行

我们知道给资源上锁可以使我们串行化地访问资源,oracle为plsql开发人员提供了DBMS_SQL包用来管理USERL LOCK锁资源.这种锁可以使得多个session串行的执行某个存储过程,还可以用来排他的访问某个外部设备或服务,甚至可以检测事务的提交或回滚(提交或回滚时锁的释放). 有人说我在java端调用db的存储过程,可以使用synchronized lock来串行的调用存储过程.那就不需要db lock呢?因为当java端应用服务器down的时候,存储过程已经在执行了,但是可能ora