Вы не можете использовать %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 - могут дать вам головные боли. Вы можете превратить это в процедуру, хотя и передать имена двух таблиц и столбцов. Вы также можете проверить, существует ли столбец в целевой таблице, и если да, то если это ожидаемый тип и т. Д.
Не в обычном SQL. Вы можете сделать это динамически с помощью PL/SQL (но не с этим синтаксисом). Это приемлемо? Или это действительно необходимо? Я бы подумал, что изменения схемы будут достаточно контролируемы, чтобы вы знали связанные с ними типы. –
Возможно, вам нужно выполнить это в PLSQL-блоке. Просто заверните оператор в 'begin-end' –
@AlexPoole @Evgeni | Не удалось выполнить код в блоке PL/SQL с ошибками «ORA-06550» и «PLS-00103», а «EXECUTE IMMEDIATE» завершился с той же ошибкой «ORA-00911», как указано выше. –