在 PL/SQL 中,%TYPE
attribute可用于将变量声明为与表中的列相同的数据类型。可以在 SQL 中使用相同或相似的功能吗?例如,在 ALTER TABLE
语句中创建,例如:
ALTER TABLE table_name
ADD column_name another_table.column%TYPE;
有什么办法吗?尝试运行上面的代码(使用更正的参数)会产生:
ORA-00911: invalid character
最佳答案
您不能使用 %TYPE在 SQL 中。
对于您的 alter 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)可能会让您头疼。不过,您可以将其转换为过程,并传入两个表名和列名。您还可以测试该列是否已经存在于目标表中,如果存在,它是否是预期的类型等。
关于sql - 在 SQL 中使用 %TYPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37459950/