Использование%TYPE в SQL

В PL/SQL %TYPE Атрибут может использоваться для объявления переменной с тем же типом данных, что и столбец в таблице. Может ли та же или аналогичная функция использоваться в SQL? Например, создание в ALTER TABLE утверждение, например:

ALTER TABLE table_name
ADD column_name another_table.column%TYPE;

Есть какой-либо способ сделать это? Попытка запустить вышеуказанный код (с исправленными параметрами) приводит к:

ORA-00911: недопустимый символ

1 ответ

Решение

Вы не можете использовать %TYPE в SQL.

Для примера изменения таблицы вы можете использовать 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 - могут причинить вам головную боль. Вы можете превратить это в процедуру и передать имена двух таблиц и столбцов. Вы также можете проверить, существует ли уже столбец в целевой таблице, и если да, то ожидаемый ли это тип и т. Д.

Другие вопросы по тегам