2016-12-28 4 views
-1

У меня около 20 операторов для создания таблиц. Ежегодно данные изменяются. Как объявить переменную в верхней части окна SQL в Oracle и использовать ее в каждом объявлении.Как создать таблицу create в Oracle PLSQ с помощью переменных

Declare 
     new_yr number(5) := 2015; 
BEGIN 

create table my_table as 
select new_yr as yr, 
     t.index, 
     t.xcode, 
     ......... 
......... 
...... 
from acccounts t 
Join persons a on a.new_yr=(new_yr-t.new_yr) 
group by t.index, 
     t.xcode; 

Этот код не работает.

+0

Попробуйте использовать другое имя, кроме существующего псевдонима столбца. Переименуйте новую переменную new_yr как v_new_yr – mdem

+0

Я сделал это и получаю ORA-06550: строка 5, столбец 1: PLS-00103: встретил символ «CREATE», ожидая одно из следующего: (начало case declare exit для goto if loop mod null pragma raise return select update while with <идентификатор> << продолжить закрыть текущее удаление выборка блокировка вставка открыть откат savepoint set sql выполнить commit forall merge очистка труб – Unrealworld

ответ

0

Вы можете сделать это, создав динамический скрипт CTAS и выдав инструкцию EXECUTE IMMEDIATE.

P.S. Не уверен, что вы присоедините все свои таблицы к таблице PERSONS, поэтому просто отредактируйте при необходимости.

Declare 

     new_yr_var varchar2(100) := 2015; 

     cursor tbl_names 
     is 
     select owner 
      , Table_name 
     from dba_tables 
     where table_name in ('your_table_names_here'); 

     sql_statement := varchar2(4000); 

BEGIN 

    for c1 in tbl_names loop; 

     sql_statement := 'CREATE TABLE '||C1.owner||'.'||C1.Table_name||'_'||new_yr_var||' AS '; 
     sql_statement := sql_statement||'SELECT COLUMNS_HERE FROM'||C1.owner||'.'||C1.Table_name||'Join persons a on a.new_yr=(new_yr-t.new_yr) ';   
     sql_statement := sql_statement||'group by t.index, t.xcode'; 

     EXECUTE IMMEDIATE (sql_statement); 

    end loop; 

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