在oracle中添加Datatype的列,该列将从另一个表的列的Datatype派生

在oracle中添加Datatype的列,该列将从另一个表的列的Datatype派生,oracle,oracle19c,Oracle,Oracle19c,我遇到了一个独特的问题 我不想在使用alter语句创建新列时指定数据类型 alter table <TABLE_NAME> add <COLUMN_NAME> <DATATYPE> constraint TABLE2_FK references TABLE2(C2); 这可能吗 如果没有,我可以做些什么来实现这一点?很快,不可能 但是,如果它适合您的需要,请创建一个视图——它将“继承”列的数据类型。您可以使用PL/SQL创建DDL语句: 声明 v_src_表

我遇到了一个独特的问题

我不想在使用alter语句创建新列时指定数据类型

alter table <TABLE_NAME> add <COLUMN_NAME> <DATATYPE> constraint TABLE2_FK references TABLE2(C2);
这可能吗

如果没有,我可以做些什么来实现这一点?

很快,不可能


但是,如果它适合您的需要,请创建一个视图——它将“继承”列的数据类型。

您可以使用PL/SQL创建DDL语句:

声明
v_src_表VARCHAR2(30):=“表2”;
v_src_列VARCHAR2(30):=“ID”;
表VARCHAR2(30):=“表1”;
v_dst_列VARCHAR2(30):=“T2_ID”;
v|dst_constr VARCHAR2(30):=v|dst_表| | | | | | | v|dst_列;
v_型VARCHAR2(30);
v_精度PLS_整数;
v_标度PLS_整数;
v|u sql_前缀VARCHAR2(100):=“ALTER TABLE”;| v|u dst| u TABLE |添加”;| v|u dst| u列| |”;
v|sql_后缀VARCHAR2(100):=“约束”| v|dst_constr||““引用”| v|src_表| |“(“| v|src_列|”);
v_sql VARCHAR2(200);
开始
选择数据类型,
解码(
数据类型,
“VARCHAR2”,数据长度,
“字符”,数据长度,
“NVARCHAR2”,数据长度,
“NCHAR”,数据长度,
数据精度
),
解码(
数据类型,
'VARCHAR2',NULL,
“CHAR”,NULL,
“NVARCHAR2”,空,
'NCHAR',空,
数据量表
)
变成v_型,,
v_精度,
v_标度
从用户选项卡列
其中table_name=v_src_table
和column_name=v_src_column;
如果v_精度为空,则
v_sql:=v_sql_前缀| | v_类型| | v_sql_后缀;
如果v_刻度为空,则
v|u sql:=v|u sql|u前缀| v|u类型| |'('v| u精度| |')'| v|u sql|u后缀;
其他的
v|U sql:=v|U sql|U前缀| v|U类型| |'(“| v|U精度| |',“| v|U比例| |”)| v|U sql|U后缀;
如果结束;
DBMS_OUTPUT.PUT_LINE(v_sql);
执行即时v_sql;
结束;
/
如果您有以下表格:

创建表table2(id号(8,-4)主键);
创建表table1(id号(8,0));
执行以下语句:

ALTER TABLE“TABLE1”添加“T2\u ID”编号(8,-4)约束“TABLE1\u T2\u ID\u FK”引用“TABLE2”(“ID”)
dbfiddle

不要在
SYS
用户中创建表。我会问,“为什么?”?您知道要引用的列的数据类型,那么为什么不首先指定它,而尝试跳过这些复杂的环呢?这能解决什么真正的问题?
'%TYPE SYS.TABLE2.ID'