ORACLE:php,laravel调用存储过程并传递参数(in,out,in out)(ORA-06502: character string buffer too small)

1.连接
$username="xxx";
$password="xxx";
$host="localhost";
$service_name="orcl";
$conn = oci_connect($username,$password,$host.'/'.$service_name,'utf8');
2.配置 Oracle 语句预备执行
$sql = "begin sp_test(:in_param,:in_out_param); end;";
$stmt = oci_parse($conn, $sql_sp);
3.绑定in,in out参数
$in_param = "入参";
$in_out_param = "出入参";
oci_bind_by_name($stmt,':in_param',$in_param);
oci_bind_by_name($stmt,':in_out_param',$in_out_param );
4.执行与关闭连接
oci_execute($stmt);
oci_close($conn);

注意: 对于in out参数来说,oci_bind_by_name() 将 PHP 变量 variable 绑定到 Oracle 的位置标志符 ph_name。该变量是否会被用作输入输出是在运行时决定的,并且函数给该变量分配必要的存储空间。length 参数确定该绑定的最大长度,如果将 length 设为 -1,oci_bind_by_name() 会用 variable 变量的当前长度确定绑定的最大长度。

所以在此处定义 in out参数长度:

oci_bind_by_name($stmt,':in_out_param',$in_out_param ,1000);

否则会抛出error:character string buffer too small

二注:四项注意:
1.对于in out参数如果传递与返回长度不一致需要指定长度;
2.对于数据库连接,如果你的SQL或者SP中存在中文,需要去在连接中指定utf8编码
3.一般而言SP都有异常处理行为,存在出参时应去判断出参而不是判断函数的执行状态
4.对于我本次调用,开启了一个新函数而不是去取框架本身的连接池,最好在调用结束后手动关闭该连接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值