【问题标题】:numeric or value error: character string buffer too small - PHP + Oracle数字或值错误:字符串缓冲区太小 - PHP + Oracle
【发布时间】:2014-02-21 06:11:19
【问题描述】:

下面是我的过程

NOBL_TEC_TEST_PROC(v1 number,v2 out number)

我的模型函数

public function testProc()
{
    $result = '';
    $db = "orcl";
    $conn = oci_connect("***", "****", $db);
    $sql = 'begin NOBL_TEC_TEST_PROC(222, :seqno); end;';
    $stmt = oci_parse($conn,$sql);
    oci_bind_by_name($stmt, ':seqno', $result);
    oci_execute($stmt);

    return $result;

}

如果我给 IN 值 10 时,它会给出以下错误。

<b>Warning</b>:  oci_execute(): ORA-06502: PL/SQL: numeric or value error: character string buffer too small ORA-06512: at line 1 in....

我该如何解决这个问题?有什么帮助吗?谢谢

【问题讨论】:

  • 您需要更改过程....您正在将参数之一分配给该过程中的局部变量(或过程调用的东西等)。局部变量没有正确的数据类型来接受您传递的内容...您将不得不更改它。
  • 我应该如何更改程序?我是 php 开发人员所以我真的不知道..
  • 如果您发布程序,那么有人将能够提供帮助...更改它可能会产生连锁反应,因此最好询问负责人。

标签: php oracle stored-procedures


【解决方案1】:

可能在数据库中,过程参数 IN 有参数 VARCHAR2(1) 或类似的东西。

大于 10 的数字是两个字符,因此会引发错误。

您只需访问 Oracle 过程的源代码,更改过程头和主体中的参数类型并重新编译即可。

【讨论】:

    【解决方案2】:

    我知道有点晚了,但是您需要将缓冲区大小添加到您的 oci_bind_by_name 中

    oci_bind_by_name($stmt, ':seqno', $result,2000);
    

    这应该可以解决您的问题

    【讨论】:

      【解决方案3】:

      仅供参考:当参数声明为“IN OUT”时也会引发此错误。由于我们使用 refcursor 来检索结果,因此实际上不需要这样的声明,并且仅将其更改为“IN”。这解决了我们的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-11
        • 1970-01-01
        • 1970-01-01
        • 2013-07-14
        • 1970-01-01
        • 2013-09-14
        • 2011-03-31
        • 1970-01-01
        相关资源
        最近更新 更多