【发布时间】:2017-01-20 10:24:38
【问题描述】:
我已经声明了以下程序:
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是声明的局部变量,但已初始化。 -
非常抱歉,我的帖子又是一个错字...不幸的是,这不是错误,但非常感谢您的提示
-
您是否正在执行来自不同用户的查询和 PL SQL 块?如果用户 ID 不同,则 USER_TAB_COLUMNS 中的数据会发生变化。最好的调试方法是在代码的每一行之后放置一个 dbms_output 以了解异常的来源。
-
不,我只使用一个用户执行。
-
你的子程序调用参数中多了一个空格:
'COLUMN_NAME '
标签: oracle plsql database-metadata execute-immediate