Не использует BULK, но все еще получает ORA-06502: PL / SQL: ошибка с числом или значением: Массовая привязка: Усеченная привязка - PullRequest
0 голосов
/ 08 января 2019

Следующее утверждение приводит к этому сообщению об ошибке:

ORA-06502: PL/SQL: numeric or value error: Bulk Bind: Truncated Bind

BEGIN
   FOR rec IN (SELECT
                  COALESCE (
                            (SELECT '123' FROM dual WHERE  1=0) ,
                            (SELECT '123' || '4' FROM dual)
                           )
                          FROM DUAL
              )
   LOOP
        NULL;
   END LOOP;
END;
/

Очевидно, что массовое утверждение никак не связано.

Когда я изменяю первый 123 на 1234, ошибка исчезает. Кажется, COALESCE в курсоре испортит выделенное пространство строки?

Это происходит с моим Oracle 12.2.0.1, но также и с Oracle 18 в https://livesql.oracle.com/ (требуется регистрация)

Это ошибка Oracle или я что-то упускаю.

Обновление

Я создал запрос на обслуживание с Oracle. Они могут воспроизвести проблему и проводят расследование.

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Вроде как, потому что первый выбор приведет к NO_DATA_FOUND, а не к истинному NULL, тогда это заставит COALESCE не работать, однако NVL с этим справится, что немного странно.

Одним из способов является завершение выбора в NVL, как показано ниже ...

BEGIN
   FOR rec IN (SELECT
                  NVL2 (
                            (NVL((SELECT '123' FROM dual WHERE  1=0), null)) ,
                            (SELECT '123' || '4' FROM dual), null
                           )
                          FROM DUAL
              )
   LOOP
        NULL;
   END LOOP;
END;
/
0 голосов
/ 08 января 2019

Вы можете использовать NVL2 вместо COALESCE

BEGIN
   FOR rec IN (SELECT
                  NVL2 (
                            (SELECT '123' FROM dual WHERE  1=0) ,
                            (SELECT '123' || '4' FROM dual), null
                           )
                          FROM DUAL
              )
   LOOP
        NULL;
   END LOOP;
END;
/

Редактировать Для определения основной причины проблемы

Прежде всего, Coalesce нужно, чтобы оба аргумента были в одном типе данных. Также типы данных выражений определяются по порядку.

В вашем случае кажется, что ваш первый запрос состоит из трех символов SELECT '123' FROM dual WHERE 1=0), а второй - из 4 символов с конкатенацией (здесь конкатенация играет роль: я тоже пытаюсь разобраться с этим). Следовательно, oracle пытается преобразовать тип данных varchar2(4) (второй оператор) в тип данных varchar2(3) (первый оператор). Таким образом, ORA-6502 происходит

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...