如何在查询中动态放置表名?
假设我有一个如下所示的查询:
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;
如何在主查询中使用此函数将表名动态插入查询?
我不想使用原始方法通过附加字符串来进行最终查询,然后用该字符串打开游标来实现它。
答案 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'
;
我已将函数调用放在子查询中,以便每次调用只运行一次(在本例中为两次)。