2015-04-16 3 views
1

У меня есть таблица, и я хочу создать ее копию. Но я хочу, чтобы эта копия была динамичной. Первая таблица может измениться. В FOR LOOP для каждого i (кроме 1) я хочу изменить вторую таблицу и добавить столбец с именем «Col» + «i». Пример: Col1, Col2, Col3. При отладке все в порядке, за исключением этой строки: EXECUTE IMMEDIATE 'ALTER TABLE '||tab_name||' ADD Col'||i||' NUMBER(2)';, которая выдает 2 ошибки: «ORA-01403: данных не найдено» и «ORA-06512» Что я делаю неправильно? Спасибо!Выполнить немедленную ошибку «alter table» pl/sql

CREATE TABLE first_table (
id NUMBER(2,0) NOT NULL PRIMARY KEY, 
col1 NUMBER(2,0) NOT NULL, 
col2 NUMBER(2,0) NOT NULL, 
col3 NUMBER(2,0) NOT NULL, 
col4 NUMBER(2,0) NOT NULL, 
col5 NUMBER(2,0) NOT NULL, 
col6 NUMBER(2,0) NOT NULL, 
col7 NUMBER(2,0) NOT NULL 
); 

CREATE TABLE second_table (
first_col NUMBER PRIMARY KEY 
); 

CREATE OR REPLACE PROCEDURE second_table 
AS 
nr_columns NUMBER(2); 
tab_name VARCHAR2(20); 
col_nam VARCHAR2(20) := 'COL'; 
BEGIN 

SELECT COUNT (*) 
INTO nr_columns 
FROM user_tab_columns 
WHERE table_name='FIRST_TABLE'; 

SELECT table_name 
INTO tab_name 
FROM user_tab_columns 
WHERE column_name ='FIRST_COL'; 

FOR i IN 1..NR_COLUMNS 
LOOP 

IF (i=1) THEN 
EXECUTE IMMEDIATE 'ALTER TABLE '||tab_name||' RENAME COLUMN FIRST_COL TO id'; 
ELSE 
EXECUTE IMMEDIATE 'ALTER TABLE '||tab_name||' ADD Col'||i||' NUMBER(2)'; 

END IF; 
END LOOP; 
END; 
/

ответ

1

Это прекрасно работает для меня.

Столы

SQL> CREATE TABLE first_table (
    2 id NUMBER(2,0) NOT NULL PRIMARY KEY, 
    3 col1 NUMBER(2,0) NOT NULL, 
    4 col2 NUMBER(2,0) NOT NULL, 
    5 col3 NUMBER(2,0) NOT NULL, 
    6 col4 NUMBER(2,0) NOT NULL, 
    7 col5 NUMBER(2,0) NOT NULL, 
    8 col6 NUMBER(2,0) NOT NULL, 
    9 col7 NUMBER(2,0) NOT NULL 
10 ); 

Table created. 

SQL> 
SQL> CREATE TABLE second_table (
    2 first_col NUMBER PRIMARY KEY 
    3 ); 

Table created. 

SQL> 

Процедура

SQL> CREATE OR REPLACE PROCEDURE p_second_table 
    2 AS 
    3 nr_columns NUMBER(2); 
    4 tab_name VARCHAR2(20); 
    5 col_nam VARCHAR2(20) := 'COL'; 
    6 BEGIN 
    7 SELECT COUNT (*) 
    8 INTO nr_columns 
    9 FROM user_tab_columns 
10 WHERE table_name='FIRST_TABLE'; 
11 
12 SELECT table_name 
13 INTO tab_name 
14 FROM user_tab_columns 
15 WHERE column_name ='FIRST_COL'; 
16 
17 FOR i IN 1..NR_COLUMNS 
18 LOOP 
19  IF (i=1) THEN 
20  EXECUTE IMMEDIATE 'ALTER TABLE '||tab_name||' RENAME COLUMN FIRST_COL TO id'; 
21  dbms_output.put_line('if'); 
22  ELSE 
23  EXECUTE IMMEDIATE 'ALTER TABLE '||tab_name||' ADD Col'||i||' NUMBER(2)'; 
24  dbms_output.put_line('else'); 
25  END IF; 
26 END LOOP; 
27 END; 
28/

Procedure created. 

SQL> 
SQL> sho err 
No errors. 
SQL> 

Я добавил DBMS_OUTPUT, чтобы показать вам, когда он переходит в блок IF-ELSE.

тест Давайте это увидеть:

SQL> set serveroutput on 
SQL> EXEC p_second_table; 
if 
else 
else 
else 
else 
else 
else 
else 

PL/SQL procedure successfully completed. 

Давайте проверим определение таблицы:

SQL> desc second_table; 
Name          Null? Type 
----------------------------------------- -------- --------- 
ID          NOT NULL NUMBER 
COL2            NUMBER(2) 
COL3            NUMBER(2) 
COL4            NUMBER(2) 
COL5            NUMBER(2) 
COL6            NUMBER(2) 
COL7            NUMBER(2) 
COL8            NUMBER(2) 

SQL> 
+0

Извините, я допустил ошибку. Строка 11 выглядит так: WHERE table_name = 'FIRST_TABLE'; и он возвращает 8 столбцов. – XhensB

+0

Укажите инструкцию create для first_table. –

+0

Я обновил код. Посмотрите пожалуйста – XhensB

0

Вы должны проверить этот запрос

SELECT table_name 
INTO tab_name 
FROM user_tab_columns 
WHERE column_name ='FIRST_COL'; 

Исключение 210 означает, что select не возвращал строку. Проверьте, существует ли таблица second_table, а может быть, вы создали ее в другой схеме и теперь работаете в другой. Также проверьте название coolumn SECOND_TABLE.FIRST_COL в user_tab_columns

+0

Я допустил ошибку при отправке кода, но я обновил его сейчас. Но, в любом случае, есть все те же ошибки. – XhensB