2009-09-01 6 views
0

Это вопрос noobie, скорее всего, синтаксис. Но я немного потерян ...Перейдите ко всем столбцам в таблицах в Oracle

Мне нужно пройти все столбцы во всех таблицах в Oracle, чтобы сгенерировать триггерный скрипт. Этот триггер должен вставлять обновляемую строку в таблицу журналов, которая почти совпадает с исходной таблицей. Я думал, что просто перейду все столбцы и просто конкатенировать строки. Довольно легко, но я борюсь с синтаксисом ...

Вот что я до сих пор:

DECLARE 
    cursor tableNames is 
     select table_name 
     from user_tables 
     where table_name not like '%_A'; 
    lSql varchar2(3000); 
    type t_columnRow is ref cursor; 

    v_columns t_columnRow; 
begin 

FOR tableName in tableNames 
LOOP 
    open v_columns for select COLUMN_NAME from user_tab_columns where table_name = tableName; 

    for columnRow in v_columns LOOP 
     DBMS_OUTPUT.PUT_LINE(tableName || '.' || columnRow.COLUMN_NAME); 
     -- Here I would just concatenate the strings .... 
    END LOOP; 

END LOOP;  

End; 

Для этого я получаю следующее сообщение об ошибке:

Error at line 1 
ORA-06550: line 14, column 84: 
PLS-00382: expression is of wrong type 
ORA-06550: line 16, column 22: 
PLS-00221: 'V_COLUMNS' is not a procedure or is undefined 
ORA-06550: line 16, column 5: 
PL/SQL: Statement ignored 
+0

Какие ошибки вы получаете? –

+0

Ошибка в строке 1 ОР-06550: строка 14, столбец 84: PLS-00382: выражение неправильного типа ОР-06550: строка 16, столбец 22: PLS-00221: 'V_COLUMNS' не является процедура или undefined ORA-06550: строка 16, столбец 5: PL/SQL: заявление игнорируется – Rashack

ответ

2

Попробуйте это:

BEGIN 
    FOR t IN (SELECT table_name FROM user_tables WHERE table_name not like '%_A') 
    LOOP 
     FOR c IN (SELECT column_name FROM user_tab_columns WHERE table_name = t.table_name) 
     LOOP 
      DBMS_OUTPUT.PUT_LINE(t.table_name||'.'||c.column_name); 
      -- Here I would just concatenate the strings .... 
     END LOOP; 
    END LOOP; 
END; 
+0

Да - я знал, что есть что-то с моим синтаксисом ;-) – Rashack

1

Вы можете быть в состоянии уйти с чем-то же просто, как это:

DECLARE 
    cursor tableNames is 
     select table_name 
     from user_tables 
     where table_name not like '%_A'; 
    lSql varchar2(3000); 
begin 

FOR tableName in tableNames 
LOOP 
    for columnRow in (select COLUMN_NAME from user_tab_columns where table_name = tableName) LOOP 
     DBMS_OUTPUT.PUT_LINE(tableName || '.' || columnRow.COLUMN_NAME); 
     -- Here I would just concatenate the strings .... 
    END LOOP; 

END LOOP;  

End; 
+0

Выглядит довольно близко. Тем не менее получают ошибки, хотя: Ошибки в строке 1 ORA-06550: строка 11, столбец 82: PLS-00382: выражение неправильного типа ОР-06550: строка 12, столбец 30: PLS-00306: неправильный номер или типы аргументов при вызове '||' ORA-06550: строка 12, столбец 9: PL/SQL: заявление игнорируется – Rashack

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

  • Нет связанных вопросов^_^