sql - 在 SQL 中使用 %TYPE

标签 sql oracle plsql alter-table

在 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/

相关文章:

mysql - 生成组合并确定出现次数最多的组合

sql - 日期的整数表示

sql - 从 'IN' 子句保持顺序

oracle - 在所有 oracle 包中查找带引号和双引号的字符串

oracle - 如何在一个脚本中更改 Oracle 模式上的所有索引 (10G)

sql - SQL 中两个具有相同名称的临时表

sql - 使用 while 条件的嵌套查询 - sql

python - 使用 Python 连接到 Oracle AQ

sql - 如何获取六个月内每个月的最小日期?

java - 如何将字符串数组显示到 JPanel?