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