【问题标题】:PHP: oci_bind_by_name and timestamp field results in "ORA-01461: can bind a LONG value only for insert into a LONG column"PHP:oci_bind_by_name 和时间戳字段导致“ORA-01461:只能绑定 LONG 值以插入 LONG 列”
【发布时间】:2013-10-24 20:56:11
【问题描述】:

我有一个 Oracle 数据库,需要在 Oracle 时间戳字段中插入一个日期为 YYYY-MM-DD HH:MM:SS 格式的字符串。为此,我编写了以下代码:

$date = '2013-01-01 10:10:10';
$sql = oci_parse($c,"INSERT INTO MY_TABLE (ID, SEND_DATE) VALUES (MY_SEQ.nextval, TO_TIMESTAMP(:send_date, 'YYYY-MM-DD HH24:MI:SS'))");
oci_bind_by_name($sql, ':send_date', $date, null, SQLT_CHR);
oci_execute($sql);

表格如下所示:

CREATE TABLE "MY_TABLE" 
(   "ID" NUMBER NOT NULL ENABLE, 
    "SEND_DATE" TIMESTAMP (0) NOT NULL ENABLE );

如果我执行上面的查询,我会得到这个错误:

ORA-01461: 只能绑定 LONG 值以插入 LONG 列

Stack Overflow 上已经有很多关于 ORA-01461 的问题,但我找不到这个特定问题的解决方案。我真的不明白LONG在这个星座的什么地方。

【问题讨论】:

    标签: php oracle


    【解决方案1】:

    来自(http://www.php.net/manual/en/function.oci-bind-by-name.php#92334):

    有时您会收到错误“ORA-01461:只能绑定 LONG 值以插入 LONG 列”。此错误具有高度误导性,尤其是当您没有 LONG 列或 LONG 值时。

    从我的测试看来,当绑定变量的值超过分配的长度时,可能会导致此错误。

    为避免此错误,请确保在绑定 varchars 时指定长度,例如

    <?php
        oci_bind_by_name($stmt,':string',$string, 256);
    ?>
    

    对于数字,使用默认长度 (-1),但告诉 oracle 它是一个整数,例如

    <?php
        oci_bind_by_name($stmt,':num',$num, -1, SQLT_INT);
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-08
      • 2014-09-20
      • 2013-06-01
      • 2017-08-29
      • 2020-06-22
      • 1970-01-01
      • 2016-05-07
      相关资源
      最近更新 更多