在 SQL 中使用 %TYPE
Use of %TYPE in SQL
在 PL/SQL 中,%TYPE
attribute 可用于将变量声明为与 table 中的列相同的数据类型。可以在 SQL 中使用相同或类似的功能吗?例如,在 ALTER TABLE
语句中创建,例如:
ALTER TABLE table_name
ADD column_name another_table.column%TYPE;
有什么办法吗?尝试 运行 上面的代码(使用更正的参数)会产生:
ORA-00911: invalid character
您不能在 SQL 中使用 %TYPE。
对于您的更改 table 示例,您可以使用 PL/SQL,但您需要从数据字典中提取数据类型信息,例如:
declare
stmt varchar2(4000);
begin
select 'alter table table_name add column_name ' ||
data_type || case
when data_type in ('NVARCHAR2', 'CHAR', 'TIMESTAMP')
then '(' || data_length || ')'
when data_type in ('VARCHAR2')
then '(' || char_length || case when char_used = 'C' then ' CHAR' else ' BYTE' end || ')'
when data_type in ('NUMBER')
and (data_precision is not null or data_scale is not null)
then '(' || data_precision || case
when data_scale > 0 then ',' || data_scale
end || ')'
-- handling for other types
end
into stmt
from user_tab_columns
where table_name = 'ANOTHER_TABLE'
and column_name = 'COLUMN_NAME';
dbms_output.put_line(stmt);
execute immediate stmt;
end;
/
这将生成并执行如下语句:
alter table table_name add column_name VARCHAR2(5 BYTE)
这并不漂亮,某些数据类型(尤其是 UDT)可能会让您头疼。不过,您可以将其转换为过程,并传入两个 table 名称和列名称。您还可以测试该列是否已经存在于目标 table 中,如果存在,它是否是预期的类型,等等
在 PL/SQL 中,%TYPE
attribute 可用于将变量声明为与 table 中的列相同的数据类型。可以在 SQL 中使用相同或类似的功能吗?例如,在 ALTER TABLE
语句中创建,例如:
ALTER TABLE table_name
ADD column_name another_table.column%TYPE;
有什么办法吗?尝试 运行 上面的代码(使用更正的参数)会产生:
ORA-00911: invalid character
您不能在 SQL 中使用 %TYPE。
对于您的更改 table 示例,您可以使用 PL/SQL,但您需要从数据字典中提取数据类型信息,例如:
declare
stmt varchar2(4000);
begin
select 'alter table table_name add column_name ' ||
data_type || case
when data_type in ('NVARCHAR2', 'CHAR', 'TIMESTAMP')
then '(' || data_length || ')'
when data_type in ('VARCHAR2')
then '(' || char_length || case when char_used = 'C' then ' CHAR' else ' BYTE' end || ')'
when data_type in ('NUMBER')
and (data_precision is not null or data_scale is not null)
then '(' || data_precision || case
when data_scale > 0 then ',' || data_scale
end || ')'
-- handling for other types
end
into stmt
from user_tab_columns
where table_name = 'ANOTHER_TABLE'
and column_name = 'COLUMN_NAME';
dbms_output.put_line(stmt);
execute immediate stmt;
end;
/
这将生成并执行如下语句:
alter table table_name add column_name VARCHAR2(5 BYTE)
这并不漂亮,某些数据类型(尤其是 UDT)可能会让您头疼。不过,您可以将其转换为过程,并传入两个 table 名称和列名称。您还可以测试该列是否已经存在于目标 table 中,如果存在,它是否是预期的类型,等等