从Laravel

时间:2018-03-13 13:27:08

标签: php oracle laravel

我正在使用Laravel-OCI8软件包与Laravel的Oracle数据库进行通信。 我正在调用oracle的函数,它将结果作为CLOB返回。 这是Laravel代码:

$stmt = $this->pdo_obj->prepare("begin :result := test_pkg.get_data(:param1,:param2,:param3); end;");
$stmt->bindParam(':result', $result, \PDO::PARAM_STR);
$stmt->bindParam(':param1', $param1, \PDO::PARAM_STR);
$stmt->bindParam(':param2', $param2, \PDO::PARAM_STR);
$stmt->bindParam(':param3', $param3, \PDO::PARAM_STR);
$stmt->execute();
return response($result);

但是我收到一个错误:ORA-06502:PL / SQL:数字或值错误:字符串缓冲区太小

我也尝试过:

$response   = $this->oracle_obj->select("select test_pkg.get_data('$param1','$param2','$param3') as refc from dual");

但由于我的函数中存在DML操作,因此无法在我的情况下使用上述调用。 有没有其他方法可以使用OCI8在Laravel中调用oracle的功能?

1 个答案:

答案 0 :(得分:-1)

我认为问题不是 Laravel 的原因,或者与使用任何其他方法在 Laravel 中调用oracle函数有关。与使用$stmt->bindParam方法绑定参数并设置数据类型长度时为参数指定正确的显式数据类型相关。根据官方PHP文档..

  

表示参数是OUT   从存储过程的参数,您必须显式设置长度。

     

请参阅 PDOStatement :: bindParam PHP文档http://php.net/manual/en/pdostatement.bindparam.php

中的 data_type 长度规范

只是一个例子,

$sth->bindParam(':param1', $param1, PDO::PARAM_INT);
$sth->bindParam(':param2', $param2, PDO::PARAM_STR, 12);

参考

希望有所帮助