2016-05-26 2 views
3

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

ALTER TABLE table_name 
ADD column_name another_table.column%TYPE; 

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

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

+2

Не в обычном SQL. Вы можете сделать это динамически с помощью PL/SQL (но не с этим синтаксисом). Это приемлемо? Или это действительно необходимо? Я бы подумал, что изменения схемы будут достаточно контролируемы, чтобы вы знали связанные с ними типы. –

+0

Возможно, вам нужно выполнить это в PLSQL-блоке. Просто заверните оператор в 'begin-end' –

+0

@AlexPoole @Evgeni | Не удалось выполнить код в блоке PL/SQL с ошибками «ORA-06550» и «PLS-00103», а «EXECUTE IMMEDIATE» завершился с той же ошибкой «ORA-00911», как указано выше. –

ответ

2

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

Смежные вопросы