2012-03-05 6 views
1

クエリにテーブル名を動的に配置するにはどうすればよいですか?クエリの動的テーブル名

は、以下に示すように、私は、クエリを持っていると仮定:上記のクエリで

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

(データベース外部もしあればp_part b、データベースが内部である場合part b)Iが動的テーブルを使用します。

私はそれがどのデータベースであるかを返す関数を持っています。機能は、私は、クエリに動的にテーブル名を挿入するために私のメインのクエリでこの機能を使用するにはどうすればよい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

は、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; 
+0

:thanks dcp、ネイティブsqlまたはdbms_sqlユーティリティを参照していますか? –

+0

@ user1136858 - EXECUTE IMMEDIATEまたはdbms_sqlを使用できます。最新の編集にEXECUTE IMMEDIATEの例が含まれています。 – dcp

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

関数呼び出しをサブクエリに入れて、呼び出しごとに1回だけ実行するようにしました。 。この場合、2回)。

関連する問題