2012-03-05 62 views
1

如何在查詢中動態地添加表名?查詢中的動態表名

假設我有一個查詢,如下所示:

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; 

如何使用這個功能在我的主查詢表中插入動態的名稱到查詢?

我不想通過附加字符串進行最終查詢,然後用該字符串打開遊標來使用原始方式實現此目的。

回答

4

我不想用原始方式實現此操作,方法是追加 字符串進行最終查詢,然後用該字符串打開遊標。

這真的是你做到這一點的唯一方法。在使用常規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; 
+0

:謝謝dcp,你是指原生的sql或dbms_sql工具? – 2012-03-05 19:18:20

+0

@ user1136858 - 您可以使用EXECUTE IMMEDIATE或dbms_sql。我在最新的編輯中包含了一個EXECUTE IMMEDIATE的例子。 – dcp 2012-03-05 19:21:50

2

你可以做到這一點沒有動態SQL,假設兩個表(部分和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' 
; 

我已經把函數調用放在一個子查詢中,以便它每次調用只運行一次(即。在這種情況下兩次)。