я объявил следующую процедуру:ORA-01403: Нет данных ПОЧЕМУ?
CREATE OR REPLACE PROCEDURE MODIFY_NOT_NULL(
v_tbName IN VARCHAR2,
v_cName IN VARCHAR2,
v_defaultValue IN VARCHAR2)
IS
v_is_null VARCHAR2(1);
BEGIN
SELECT nullable INTO v_is_null
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = v_tbName
AND COLUMN_NAME = v_cName;
IF v_is_null = 'Y' THEN
EXECUTE IMMEDIATE ('ALTER TABLE ' || v_tbName
|| ' MODIFY (' || v_cName
|| ' DEFAULT ' || v_defaultValue
|| ' NOT NULL)');
END IF;
END;
Однако когда я исполню мой код:
BEGIN
modify_not_null('TABLE_NAME', 'COLUMN_NAME ' ,'0');
END;
/
Я получаю
"ORA-01403: No Data Found"
Это исключение будет обычно самостоятельно, если «SELECT INTO
» оператор не возвращает никакого значения, однако я всегда получаю значение, когда я выполнить это:
Select nullable
from USER_TAB_COLUMNS
WHERE table_name = 'TABLE_NAME'
AND column_name = 'COLUMN_NAME';
Когда я выполняю код выше, я получаю «N» или «Y», как результат. Поэтому я всегда получаю результат. Я не знаю, почему это исключение брошено.
Почему выбирают данные в ' v_is_null', но условие 'IF' находится на' l_nullable'? Может быть, что 'l_nullable' является объявленной локальной переменной, но инициализируется. –
Мне очень жаль, это была опечатка снова в моем посте ... Это, к сожалению, не ошибка, но очень важно для подсказки – NoName123
Выполняете ли вы запрос и блок PL SQL от разных пользователей? В случае, если идентификатор пользователя отличается, данные в USER_TAB_COLUMNS изменяются. Лучший способ отладки - поместить dbms_output после каждой строки в вашем коде, чтобы понять происхождение исключения. –