Oracle 如何最小化物理DDL更改和PL/SQL更改之间的耦合/依赖关系?

Oracle 如何最小化物理DDL更改和PL/SQL更改之间的耦合/依赖关系?,oracle,plsql,ddl,ora-06502,Oracle,Plsql,Ddl,Ora 06502,我们在Oracle表定义(DDL)和一个PL/SQL脚本中遇到了一个特殊问题 问题是,表中有一个变化,从varchar(20)变为varchar(30),然而,这个变化并没有在我们的一个使用数据的PL/SQL脚本中得到认真的反映,它仍然是varchar(20),在我们的一个回归测试期间,导致出现ORA-06502:PL/SQL:numeric或value错误 我想从Oracle和数据库专家那里寻求建议,您过去是否遇到过这样的情况,即表DDL发生了更改,而PL/SQL中没有反映出来,以及您如何处理

我们在Oracle表定义(DDL)和一个PL/SQL脚本中遇到了一个特殊问题

问题是,表中有一个变化,从
varchar(20)
变为
varchar(30)
,然而,这个变化并没有在我们的一个使用数据的PL/SQL脚本中得到认真的反映,它仍然是
varchar(20)
,在我们的一个回归测试期间,导致出现
ORA-06502:PL/SQL:numeric或value错误

我想从Oracle和数据库专家那里寻求建议,您过去是否遇到过这样的情况,即表DDL发生了更改,而PL/SQL中没有反映出来,以及您如何处理这一差距

我知道一个简单的方法是某种形式的强制执行或文书工作,但会有更漂亮或优雅的解决方案吗,即外键避免插入/更新/删除异常的工作方式


谢谢

对于初学者,应始终根据表中的列定义将变量声明为类型:

即,代替:

dept_name  VARCHAR2(50);
使用:

这样,当基表更改时,声明仍然有效

还可以将过程参数声明为类型:

PROCEDURE proc(p1 IN dept.dept_name%TYPE)

+1一般来说,这很有效。如果你期望有一个尺寸限制,你仍然必须保持警惕。一个例子是一个地址,它将打印在一个信封上,在信封上放大的数据库列不适合它。@Chin Boon,这肯定是PL/SQL设计团队做对的事情@加里,同意。没有完美的解决方案。即使是提供字符串类型的语言,比如Perl,也会受到这种限制。那个讨厌的现实世界一直在阻挠;-)
PROCEDURE proc(p1 IN dept.dept_name%TYPE)