динамическое имя таблицы в запросе - PullRequest
1 голос
/ 05 марта 2012

Как я могу динамически поместить имя таблицы в запросе?

Предположим, у меня есть запрос, как показано ниже:

Select a.amount
      ,b.sal
      ,a.name
      ,b.address 
from  alloc a 
     ,part b 
where a.id=b.id;

В приведенном выше запросе я хочу использовать таблицу динамически(part b если база данных внутренняя, p_part b если база данных внешняя).

У меня есть функция, которая возвращает базу данных.Предположим, что функция getdatabase();

select decode(getdatabase(),'internal','part b','external','p_part b')
from  dual;

Как я могу использовать эту функцию в своем основном запросе для динамического добавления имени таблицы в запрос?

Я не хочу реализовывать этоиспользуя примитивный способ, добавляя строки для выполнения окончательного запроса, а затем открывая курсор с этой строкой.

Ответы [ 2 ]

4 голосов
/ 05 марта 2012

Я не хочу реализовывать это примитивным способом, добавляя строки для выполнения окончательного запроса, а затем открывая курсор с этой строкой.

Это действительно единственный способ, которым вы можетесделай это.Невозможно использовать переменную или вызов функции для имени таблицы при использовании обычного блока PL / SQL SQL, необходимо использовать динамический SQL.

Подробнее см. В документации Oracle: http://docs.oracle.com/cd/B10500_01/appdev.920/a96590/adg09dyn.htm

Вот пример из документа:

EXECUTE IMMEDIATE 'SELECT d.id, e.name
        FROM dept_new d, TABLE(d.emps) e  -- not allowed in static SQL
                                          -- in PL/SQL
        WHERE e.id = 1'
        INTO deptid, ename;
2 голосов
/ 06 марта 2012

Вы можете сделать это без динамического SQL, предполагая, что обе таблицы (part и p_part) доступны во время компиляции:

select a.amount
      ,b.sal
      ,a.name
      ,b.address 
from   alloc a 
      ,part b 
where  a.id=b.id
and    (select getdatabase() from dual) = 'internal'
UNION ALL
select a.amount
      ,b.sal
      ,a.name
      ,b.address 
from   alloc a 
      ,p_part b 
where  a.id=b.id
and    (select getdatabase() from dual) = 'external'
;

Я поместил вызов функции в подзапрос, чтобы он выполнялся только один раз за вызов (то есть дважды, в данном случае).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...