查询中的动态表名称

时间:2012-03-05 19:10:14

标签: plsql oracle11g

如何在查询中动态放置表名?

假设我有一个如下所示的查询:

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

在上面的查询中,我想动态使用一个表(part b如果数据库是内部的,p_part b如果数据库是外部的。{/ p>

我有一个返回数据库的函数。假设函数是getdatabase();

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

如何在主查询中使用此函数将表名动态插入查询?

我不想使用原始方法通过附加字符串来进行最终查询,然后用该字符串打开游标来实现它。

2 个答案:

答案 0 :(得分:4)

  

我不想通过附加原始方式来实现它   字符串,以进行最终查询,然后用该字符串打开游标。

这是你能做到的唯一方法。使用常规PL / SQL SQL块时,无法对表名使用变量或函数调用,必须使用动态SQL。

有关更多详细信息,请参阅Oracle文档: http://docs.oracle.com/cd/B10500_01/appdev.920/a96590/adg09dyn.htm

以下是doc:

的示例
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;

答案 1 :(得分:2)

假设两个表(part和p_part)在编译时都可用,则可以在没有动态SQL的情况下执行此操作:

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'
;

我已将函数调用放在子查询中,以便每次调用只运行一次(在本例中为两次)。