在 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 中,如果存在,它是否是预期的类型,等等