【问题标题】:Updating column type in Oracle在 Oracle 中更新列类型
【发布时间】:2014-12-27 22:19:30
【问题描述】:

我想将 Oracle 表中列的类型从 varchar2(50) 更新为 varchar2(200)。

我已经开始做一些影响分析,这种变化可能会在搜索使用该字段的包中产生,但是在查看了一些之后,似乎没有在任何地方指定字段长度。唯一指定的是列类型,在这种情况下是 varchar2

我的问题是:

如果您只想更改某个特定列的 varchar2 类型的字段长度,这是否会影响可能引用该字段的任何底层包?

谢谢

【问题讨论】:

  • 我相信,您可能需要在根据答案进行影响分析和集成测试后回来,将其中一个答案标记为已回答;-)

标签: sql oracle plsql


【解决方案1】:

如果您只想更改某个特定列的 varchar2 类型的字段长度,这是否会影响可能引用该字段的任何底层包

这正是%Type type 试图解决的场景,即如果您更改引用列的基础类型,引用该列的依赖工件(如包)将保持同步。

不幸的是,如果您在包中将参数和变量定义为 varchar2(50),则需要手动将它们更新为新宽度,在这种情况下,您可以将其更改为 MYTABLE.MYCOLUMN%TYPE 以防止将来发生更改.

【讨论】:

    【解决方案2】:

    “唯一指定的是列类型”究竟是什么意思?

    如果您的意思是您的代码始终使用锚定类型,即

    l_variable_name table_name.column_name%type;
    

    然后,每当您更改底层代码中的数据类型时,更改将自动通过您的代码传播。这是使用锚定类型的主要好处之一——它可以防止代码中的类型声明与表中列的声明不同步。

    【讨论】:

    • 通过说:“唯一指定的是列类型”参见示例:v_sp_columns(7).column_name := 'PAYEE_NAME'; v_sp_columns(7).datatype := 'VARCHAR2';此包中未指定长度
    • @Andreas - 如何声明一个变量? v_sp_columns 集合是否被其他一些代码使用,这些代码为您针对表运行的每个查询生成动态 SQL?那将是一个相当疯狂的架构。
    【解决方案3】:
      1234563
    1. 查看是否有任何type 被显式创建为database object 引用此列,如果它是用大小硬编码的,那么它也会在那里失败。

    首先进行此影响分析,尤其是当您的 application/system 相当陈旧或遗留问题时。当时的开发人员可能没有考虑过未来,可能已经硬编码了我上面描述的大小。我已经在我处理的一个应用程序中看到它发生了,幸运的是在system integration testing 期间发现了它。所以,请彻底执行impact analysis,并尽可能做好integration testing

    【讨论】:

      猜你喜欢
      • 2022-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-25
      • 1970-01-01
      • 2016-01-19
      • 2019-04-17
      • 2021-07-16
      相关资源
      最近更新 更多