0

Oracle ドライバーの多くの場所で「ORA-01722: 無効な番号」というエラーが発生します。回避策/解決策を指摘できますか?

PDOException: SELECT base.fid AS fid, base.uid AS uid,
    base.filename AS filename, base.uri AS uri, base.filemime AS filemime,
    base.filesize AS filesize, base.status AS status, base.timestamp AS timestamp
    FROM {file_managed} base
    WHERE (base.fid IN (:db_condition_placeholder_0))
(prepared: SELECT base.fid AS fid, base."UID" AS "UID",
    base.filename AS filename, base.uri AS uri, base.filemime AS filemime,
    base.filesize AS filesize, base.status AS status, base.timestamp AS timestamp
    FROM "FILE_MANAGED" base
    WHERE (base.fid IN (:db_condition_placeholder_0))
)
e: SQLSTATE[HY000]: General error: 1722
OCIStmtExecute: ORA-01722: invalid number (ext\pdo_oci\oci_statement.c:146)
args: Array ( [:db_condition_placeholder_0] => )
in DrupalDefaultEntityController->load()
(line 196 of C:\xampp\htdocs\new\drupal\includes\entity.inc).
4

1 に答える 1

3

文脈がなければ、確かなことはわかりません。しかし、私は推測の気分にあるので、ここに行きます:

base.fid数値列です。:db_condition_placeholder_0のようなトークンの文字列を渡そうとしてい"23, 42, 69"ます。

ここで期待しているのは、SQL エンジンがそれを組み合わせて、次のような行を生成することです。

where base.fid in (23, 42, 69)

残念ながら、実際に生成されるのは次のとおりです。

where base.fid in ('23, 42, 69')

...論理的には次と同じです:

where base.fid = to_number('23, 42, 69')

明らかに、文字列は有効な数値ではないため、ORA-1722 です。

今、あなたがそれについて何をするかは、トリッキーな問題です. ネストされたテーブルまたは配列、パイプライン化された関数、動的 SQL など、いくつかの異なるアプローチがあります。どちらが最適かは、要件の詳細によって異なります。

さらに、もちろん、とにかくあなたの問題について推測しています:-)

于 2011-07-21T10:43:56.377 に答える