1

Oracle データベースがあり、YYYY-MM-DD HH:MM:SS 形式の日付を含む文字列を Oracle タイムスタンプ フィールドに挿入する必要があります。このために、私はこのコードを書きました:

$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値をバインドできます

スタック オーバーフローに関する ORA-01461 に関する質問はすでに山ほどありますが、この特定の問題の解決策を見つけることができませんでした。この星座のどこにLONGが入ってくるのか、私には本当に理解できません。

4

1 に答える 1

2

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

「ORA-01461: LONG 列に挿入するためだけに LONG 値をバインドできます」というエラーが発生することがあります。このエラーは、特に LONG 列または LONG 値がない場合に非常に誤解を招きます。

私のテストでは、バインドされた変数の値が割り当てられた長さを超えたときに、このエラーが発生する可能性があるようです。

このエラーを回避するには、varchar をバインドするときに必ず長さを指定してください。

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

数値にはデフォルトの長さ(-1)を使用しますが、オラクルに整数を伝えます。

<?php
    oci_bind_by_name($stmt,':num',$num, -1, SQLT_INT);
?>
于 2013-11-20T15:58:25.663 に答える