У меня есть код Pro * C, который подключается к базе данных Oracle и выполняет запрос SQL по мере необходимости.
Простой SQL-запрос, подобный следующему:
SELECT A, B FROM TBL1 WHERE A = 'a'
сталкивается с ошибкой ORA-01405: fetched column value is NULL
Примечание в TBL1, A определяется как VARCHAR2 (30), а B — это NUMBER (4,2).
Моя версия Pro * c Pro*C/C++: Release 11.2.0.3.0
И я использую семейство GNU gcc компилятора g ++ версии 2.95.3.
Документация Oracle (http://docs.oracle.com/cd/A57673_01/DOC/api/doc/PC_22/ch03a.htm) говорится, что
if you SELECT or FETCH a null into a host variable that has no indicator, Oracle issues the following error message:
ORA-01405: fetched column value is NULL
Одно из возможных решений: мы можем указать UNSAFE_NULL = YES, чтобы отключить сообщение ORA-01405 при запуске Pro * c, но когда я пытаюсь добавить этот флаг с помощью команды proc, он говорит, что UNSAFE_NULL = YES разрешен, если MODE = ORACLE и DBMS = V7 или V8
Любые другие предложения?
Прошли годы с тех пор, как я работал с Pro * C, но я помню, когда впервые столкнулся с этим в более ранней версии Pro * C, и вам пришлось использовать переменную-индикатор, чтобы проверить, было ли значение NULL или нет. Это изменилось, однако, когда Oracle представил тип данных STRING. Мне так понравилось, что я даже начал записывать номера TO_CHAR и сохранять их в STRING.
Посмотрите это из документа, на который вы ссылались:
STRING
Тип данных STRING аналогичен типу данных VARCHAR2, за исключением того, что
Значение STRING всегда заканчивается нулем.На входе Oracle использует
указанная длина для ограничения сканирования для нулевого терминатора. Если ноль
терминатор не найден, Oracle генерирует ошибку. Если вы этого не сделаете
указав длину, Oracle предполагает максимальную длину 2000 байт.
минимальная длина значения STRING составляет 2 байта. Если первый символ
нулевой терминатор и указанная длина равна 2, Oracle вставляет нулевой
если столбец не определен как NOT NULL; если столбец определен как
NOT NULL, возникает ошибка. Полностью пустое значение сохраняется без изменений.На выходе Oracle добавляет нулевой байт к последнему возвращенному символу.
Если длина строки превышает указанную длину, Oracle усекает
выходное значение и добавляет нулевой байт. Если выбрано значение NULL,
Oracle возвращает нулевой байт в первой позиции символа.
Использование индикаторов для определения нуля:
короткий idxA, idxB;
FETCH … INTO: varA: idxA,: varB: idxB;
Тогда индикатор устанавливается в -1, если значение равно NULL;