有谁知道任何包含“真实”列到虚拟列的引用的 Oracle 字典视图?
例如,假设我有一个这样的表:
create table t (
c1 varchar2(5)
,c2 as (c1 || '*')
)
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种确定 c1 具有 c2 依赖项的方法(不尝试解析 user_tab_cols.data_default)。我正在编写一个模式同步工具,我正在尝试弄清楚我需要做什么才能将表与执行最少工作的“模型”同步。如果模型显示上表中的 c1 从 varchar2(5) 更改为 varchar2(6),我希望能够确定我需要执行以下操作:
alter table t modify( c2 as ( null ) );
alter table t modify( c1 varchar2(6) );
alter table t modify( c2 as ( c1 || '*' ) );
Run Code Online (Sandbox Code Playgroud)
并避免使用 ORA-54031。
[编辑]
似乎我在解释我的问题时不够清楚,所以这里是。
当我们的开发人员开始处理错误时,他们会创建应用程序的 git 分支以及填充了主 git 分支内容的数据库模式。在处理 bug 时,开发人员可能会进行 DML 更改或偶尔会进行 DDL 更改(当然还有代码更改)。一旦他们的 bug 完成并被审查,他们的 git 分支就会与 master 合并。同步工具允许对数据库模式进行完整的“差异”——从内容和结构的角度来看。这构成了审查的一部分。开发人员使用同步工具生成其架构的导出,此导出是分支的一部分。在 bug 分支合并到 master …
这是一张桌子
create table tq84_virtual_test_without (
col_1 number,
col_2 number,
col_3 number,
col_4 number,
col_5 number
);
Run Code Online (Sandbox Code Playgroud)
规则col_5
的值是其他四列的总和。
所以表格被相应地填充:
insert into tq84_virtual_test_without values( 1, 2, 3, 4, 10);
insert into tq84_virtual_test_without values( 3, 8, 7, 5, 23);
commit;
Run Code Online (Sandbox Code Playgroud)
现在,假设需要复制一行并仅更改一列的值。这当然可以非常优雅地完成(恕我直言,也就是说)使用rowtype-variable,就像这样
declare
r tq84_virtual_test_without%rowtype;
begin
select * into r from tq84_virtual_test_without where col_2 = 8;
r.col_4 := r.col_4 - 2;
r.col_5 := r.col_5 - 2;
insert into tq84_virtual_test_without values r;
end;
/
Run Code Online (Sandbox Code Playgroud)
这很优雅,因为它不会用insert into …