2015-08-20 1 views
-1

У меня есть таблица x с 400 столбцами, такими как xpk, x1, x2..x399 (где xpk является основным ключом таблицы). Основываясь на требовании, мне нужно создать отдельную таблицу для каждого столбца, кроме xpk.Как создать таблицы с использованием имен столбцов существующей таблицы?

Чтобы сделать это традиционно, мне пришлось бы написать 400 заявлений о создании. Можете ли вы помочь мне достичь этого, используя процедуру или динамический sql?

Я попробовал что-то на столе сотрудников, чтобы дать вам представление. Но даже в этом я получаю ошибки.

set serveroutput on; 
DECLARE CURSOR COL_CUR IS 
    select column_name from all_tab_columns where table_name = 'EMPLOYEES'; 
    NAMES user_tables.table_name%TYPE; 
    SQL_STRING VARCHAR2(300); 
BEGIN 

    OPEN COL_CUR; 
    LOOP 
     FETCH COL_CUR INTO NAMES; 
     EXIT WHEN COL_CUR%NOTFOUND; 
     SQL_STRING := 'CREATE TABLE :T_NAMES AS SELECT employee_id, :C_NAMES FROM EMPLOYEES'; 
     EXECUTE IMMEDIATE SQL_STRING USING NAMES,NAMES; 
    END LOOP; 
    CLOSE COL_CUR; 
END; 

Требуемая мощность:

First_name в виде таблицы, имеющей следующие столбцы:

Employee_id First_name 
1234   Ashish 

Точно так же я хочу, таблицы для других столбцов.

ответ

1

Мы не можем использовать переменные связывания в динамическом DDL. Вам нужно переписать внутренний код, как это:

SQL_STRING := 'CREATE TABLE '|| NAMES || 
       ' AS SELECT employee_id, '|| NAMES ||' FROM EMPLOYEES'; 
EXECUTE IMMEDIATE SQL_STRING; 
0
set serveroutput on; 
DECLARE CURSOR COL_CUR IS 
    select column_name from all_tab_columns where table_name = 'EMPLOYEES' and Column_name != 'employee_id'; 
    NAMES user_tables.table_name%TYPE; 
    SQL_STRING VARCHAR2(300); 
BEGIN 

    OPEN COL_CUR; 
    LOOP 
     FETCH COL_CUR INTO NAMES; 
     EXIT WHEN COL_CUR%NOTFOUND; 
     SQL_STRING := 'CREATE TABLE '|| NAMES || 
       ' AS SELECT employee_id, '|| NAMES ||' FROM EMPLOYEES'; 
     EXECUTE IMMEDIATE SQL_STRING USING NAMES,NAMES; 
    END LOOP; 
    CLOSE COL_CUR; 
END;