PDO调用Oracle存储过程

$tns = "(DESCRIPTION =  (ADDRESS = (PROTOCOL = TCP)(HOST = 'ip')(PORT = '端口')) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = 'ORCL') ))";
try {
    $conn = new \PDO("oci:dbname=" . $tns . ";charset=utf8", '用户名', '密码');
    $conn->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
    $conn->setAttribute(\PDO::ATTR_CASE,\PDO::CASE_NATURAL);

    //下面是没有返回值的存储过程调用
    $conn->prepare("call db.func(?,to_date(?,'YYYY-MM-DD hh24:mi:ss'))");    
    $state->bindParam(1,$var1);
    $state->bindParam(2,$var2);
    
    //下面是有返回值的存储过程调用,第一个参数是输入的,第二个参数是存储过程返回的
    $conn->prepare("call db.func(?,?)");
    $state->bindParam(1,$var1); 
    $state->bindParam(2,$var2,\PDO::PARAM_INPUT_OUTPUT,20);
    
    $state->execute();
    
}
catch(PDOException $e)
{
    echo "ODBC异常: ".$e->getMessage();
    exit();
}

主要主要两点:

1,时间格式参数,要用to_date转换

2,当有返回值的时候 $state->bindParam(2,$var2,\PDO::PARAM_INPUT_OUTPUT,20); 这一行最后的长度参数 必须要有,表示返回值最大长度,否则会报如下错误:

      General error: 3131 OCIStmtExecute: ORA-03131: 提供了下一段的无效缓冲区

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值