Ошибка «ORA-01722: неверный номер» во многих местах была создана - PullRequest
0 голосов
/ 21 июля 2011

Я получаю ошибку «ORA-01722: неверный номер» во многих местах с драйвером Oracle.Можете ли вы указать обходной путь / решение?

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).

1 Ответ

3 голосов
/ 21 июля 2011

Без контекста нам трудно быть уверенным.Но я в угадывающем настроении, так что вот так:

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.Какой из них подойдет вам лучше всего, зависит от деталей вашего требования.

Плюс, конечно, я все равно догадываюсь о вашей проблеме: -)

...