首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > Informix >

php调用informix存储过程的有关问题

2012-12-24 
php调用informix存储过程的问题现在网上有很多php调用存储过程的说明,但是都是 php 调用sqlserver,oracle,

php调用informix存储过程的问题
现在网上有很多php调用存储过程的说明,但是都是 php 调用sqlserver,oracle,mysql的,一个也没有看到 php 调用informix

一个informix存储过程一般是   sp_proc(var1,var2) returning ret3
 我现在要传递参数给sp_proc   var1 date类型 var2 char类型


        $begdate="2012-10-12"
                
        $stmt = $db->prepare("call sp_proc(?,?)");
$stmt->bindparam(1,$begate);
$stmt->bindParam(2,"1");
$stmt->execute();

以上代码不正确,那么正确的代码应该如何写呢?还有返回值如何获取呢? 
[解决办法]
简单 示例
$result=ifx_query("execute procedure sp_mailsetup('$ID')",$conn);
 if($result)
 {
 $row=ifx_fetch_row($result,'NEXT');
 print $result['[Expr_1]'];
 print $result['[Expr_2]'];
 }
[解决办法]
我刚开始接触php ,所以不太明白,特向您请教
 
 ifx_query --这个是否就是不用pdo了? 用了专用的连接库?
 能否使用PDO 连接,因为我们这里没有ifx的相关连接库,只有pdo的!

$result=ifx_query("execute procedure sp_mailsetup('$ID')",$conn); 

--这个 $conn是什么?是连接数据库的串吗?
--您举的这个例子中 sp_mailsetup 是否只有一个变量?
--若回来有2个变量那是否 $result=ifx_query("execute procedure sp_mailsetup('$ID','$DD')",$conn);

这个 $result 是返回值?
例子中又使用了 ifx_fetch_row($result,'NEXT') --是否是说,若返回一组数据的时候使用,若只返回一个值
就可以只用
如下写法
$result=ifx_query("execute procedure sp_mailsetup('$ID')",$conn);
echo $result;

-------------------------------
$result=ifx_query("execute procedure sp_mailsetup('$ID')",$conn);
if($result)
 {
 $row=ifx_fetch_row($result,'NEXT');
  
 
 print $result['[Expr_1]'];
 print $result['[Expr_2]'];
 }
[解决办法]
我查找了一些文档  如下:其中第一个人提出了问题,最后一个人的意思是目前好像只有ids 10,11才支持php调用存储过程,ids9,并不支持。我们就是ids9估计是不行了。请有用过的给个意见?

[2010-02-19 08:26 UTC] ihabunek at gmail dot com
Description:
------------
I have a very similar problem when calling stored procedures. 

Server is IDS 11.50uc4 running on Debian. The problem is reproducable on both Windows and Linux clients running PHP 5.2.x (both CLI and Apache), PDO_INFORMIX 1.2.6 and Informix Client SDK 3.50.

The problem is when calling the following stored procedure:

CREATE PROCEDURE test_proc(
param varchar(10)
)
END PROCEDURE;

Reproduce code:
---------------
<?php
$db_url = "informix:host=tstdb; service=1526; database=buba; server=tstdb; CLIENT_LOCALE=hr_hr.1250; DB_LOCALE=hr_hr.1250";
$db = new PDO($db_url, '<user>', '<pass>');

$query = "EXECUTE PROCEDURE test_proc(:param)";
$args = array('param' => 'abc');

$db = new PDO($db_url, $username, $password);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $db->prepare($query);
$stmt->execute($args);
?>

Expected result:


----------------
Statement is executed.

Actual result:
--------------
PDO Exception thrown with the following message:
SQLSTATE[22001]: String data, right truncated: -11023 [Informix][Informix ODBC Driver]String data right truncation. (SQLExecute[-11023] at /root/PDO_INFORMIX-1.2.6/informix_statement.c:757)

Notes
-----
* The same happend when using bindValue or bindParam methods to pass the value of ':param'. 
* The same happend when using unnamed parameters ('?' instead of ':param'). 
* The exception is always thrown from execute(), not bindValue or bindParam as described by matthias.
* The error does NOT appear if the ':param' argument value is an empty string. All other values trigger the above error.
 [2010-02-19 11:14 UTC] ihabunek at gmail dot com
We have tracked the problem down to the stmt_bind_parameter() function in informix_statement.c (rev 268707). When processing a string, the value param_res->param_size is passed to SQLBindParameter function on line 422. In some cases, this value is set to 0 regardless of the length of the string.

param_size is initialized by SQLDescribeParam function called on line 203. In our case (described in the above comment) this function sets param_size to 0. So, when SQLBindParameter is called in line 422, length of the string does not correspond to param_size. This produces the "String data right truncation" error.

We are not sure if this is a bug in SQLDescribeParam (from the SDK), but a quick fix would be to initialize this value to the length of input parameter. This can be done by inserting the following line after line 405 (param_res->transfer_length = 0;):

param_res->param_size = Z_STRLEN_P(curr->parameter);

Hope this helps.
 [2011-07-07 21:32 UTC] support at globalheritagefund dot org
Great atircle, thank you again for writing.
 [2011-12-07 21:00 UTC] bavo at janss dot nl
I was facing the same problems and I thought I found the solution here.
But even with the fix, no data gets to the database using bindValue.
I finally discovered PDO_Informix only works with informix 10 not with 9 and not 
with 11. For 11 you should use PDO_Ibm.


[解决办法]
现在还有人用informix啊.... 想当年....就是从它开始的啊....还有点怀念它...

热点排行