2015-04-17 1 views
2

У меня есть таблица A, которая имеет столбец A, который содержит имена таблиц в качестве значений. Все эти таблицы имеют общую колонку C. Мне нужно максимальное значение этого столбца для каждой таблицы.Динамический запрос PLSQL

Я пробовал это с помощью динамического SQL, но получаю ошибки. Пожалуйста, предложите.

DECLARE  
query1 VARCHAR2(100); 
c_table VARCHAR2(40); 
c_obj VARCHAR2(20); 
Cursor cursor_a IS 
SELECT a FROM A; 
BEGIN 
Open cursor_a; 
    LOOP 
     Fetch cursor_a INTO c_table2;  
     EXIT WHEN cursor_a%notfound;  
     query1 := 'SELECT max(object_ref) AS "c_obj" FROM c_table' ; 
     EXECUTE IMMEDIATE query1; 
     dbms_output.put_line('Maximum value: '|| c_table || c_obj); 
    END LOOP; 
Close cursor_a; 
END; 
+0

«*, но получает сообщение об ошибке *» - и ошибки? –

ответ

-4

Существует некоторый промах матча в veriables, что вы использовали то

  1. объявлен как "c_table", но доступ как "c_table2"
  2. Каждая таблица общее имя столбца " C ", но доступ к которому" object_ref "
  3. В динамическом запросе u се INTO ключевое слово, чтобы хранить значение для вашего varibale

Предложения

  1. Использование CONCAT() для подготовки запроса динамически то есть что-то вроде:

    SET @SQL: = CONCAT ('SELECT max (c) INTO', c_obj, 'FROM', c_table);

  2. Этапы реализации динамического запроса является:

    SET @SQL = <your dynamic query> 
    PREPARE stmt FROM @SQL; 
    EXECUTE stmt; 
    

Пример кода:

DECLARE  
query1 VARCHAR2(100); 
c_table VARCHAR2(40); 
c_obj VARCHAR2(20); 
CURSOR cursor_a IS 
SELECT a FROM A; 
BEGIN 
OPEN cursor_a; 
    LOOP 
     FETCH cursor_a INTO c_table;  
     EXIT WHEN cursor_a%notfound; 
     SET @SQL := CONCAT('SELECT max(object_ref) AS c_obj INTO ', c_obj, ' FROM ',c_table); 
    PREPARE stmt FROM @SQL;   
    EXECUTE stmt;  
    dbms_output.put_line('Maximum value: '|| c_table || c_obj); 
    END LOOP; 
CLOSE cursor_a; 
END; 
+0

Это недействительно Синтаксис Oracle PL/SQL – APC

+0

Да, это образец для запуска динамического запроса (ссылочный синтаксис: для совместимости с MySQL), вы требуете изменений на основе используемой базы данных, то есть Oracle –

+1

У StackOverflow много вопросов MySQL. Почему бы не ответить на некоторые из них? Если вы не хотите принять это как шанс научить себя Oracle PL/SQL, ответив на вопрос с помощью решения, которое фактически соответствует требованиям OP **. – APC

2

Dynamic SQL не может видеть переменную PL/SQL: вам необходимо пройти это строка, которая может быть выполнена в рамках механизма SQL. Так что вам нужно сцепить имя таблицы с шаблонным текстом Заявления по:

query1 := 'SELECT max(c) FROM ' || variable_name; 

Вы также должны возвращать результат запроса в переменный.

Вот как это работает (я раздел часть ненужного кода из вашего примера):

DECLARE  
c_table VARCHAR2(40); 
c_obj VARCHAR2(20); 
BEGIN 
    for lrec in (select a as tab_name from A) 
    LOOP 
     EXECUTE IMMEDIATE 'SELECT max(object_ref) FROM ' || lrec.tab_name 
      into c_obj ; 
     dbms_output.put_line('Maximum value: '|| lrec.tab_name 
      || '='|| c_obj); 
    END LOOP; 
END; 
+0

Поскольку заявленные OP «* Все эти таблицы имеют общий столбец' C' * ', он должен быть скорее 'EXECUTE IMMEDIATE' SELECT max (C) FROM '|| lrec.tab_name в c_obj; ' –

+0

@Wernfried - хорошая точка – APC