2012-01-24 4 views
0

私はそれのような何かをすることはできますか?Oracleでは動的表名を使用できますか?

SELECT * FROM bd.images_ || '2011' 

私はこのような何かやりたいので:

SELECT 
    x.name, x.year, w.imgblob 
FROM 
    bd.img_idx x, 
    (SELECT imgblob FROM bd.images_ || x.year WHERE name = x.name) w 
WHERE 
    x.name = 'nanananana' 

答えて

2

はい、ではなく、静的SQLとは。 Native Dynamic SQL(EXECUTE IMMEDIATE)を使用できます。これはおそらく、ユースケースまたはより複雑で強力なDBMS_SQLパッケージに適しています。

1

あなたはデザインが悪いです。

私はテーブルbd.images_yyyyについて話します。 1年間にがパーティション化されたの列の年を持つ単一の表bd_imagesにそれらを配置することが最善です。

あなたのクエリはなる:

SELECT 
    x.name, x.year, w.imgblob 
FROM 
    bd.img_idx x 
    JOIN bd.images w on (x.year = w.year and w.name = x.name) 
WHERE 
    x.name = 'nanananana' 

しかし、あなたはあなたのデータベースを変更することはできませんか、あなたはエンタープライズライセンスを持っていない場合には、いくつかのダイナミックDDLを行うことができます。

名前、年、imgblob(tmptable)で誘惑を作成します。

はを移入:

Procedure populate_tmp (text varchar2) 
begin 
for r in (select x.name, x.year from bd.img_idx x where x.name= text) 
loop 
    execute immediate 'insert into tmptable values ('||r.name||','||r.year||',' (select w.imgblob from bd.images'||r.year||' w where w.year = '||r.year||' and w.name= '||r.name||'))'; 

end loop; 
end; 

と移入( 'nananannaa')の後に、あなたはtmptableから選択することができます。

注意::tmptableの古いデータを処理しないため、global temporary table on commit deleteとして作成できます。コミットすると、データは表から消滅します。

+0

データベースを変更できません。また、ストアドプロシージャを使用することを避けたいのは、プロシージャを変更するたびにデータベース管理者に許可を求める必要があるからです。 –

+0

dbaと通信して、ビジネスの必要性を説明する代わりに、トリックを使用する方が賢明でしょうか?パーティションを使用するのがずっと簡単かもしれませんし、おそらく古い古いパーティションビューを使用することもできます。動的SQLを使用する場合も、バインド変数を必ず使用してください。 –

+0

確かに、ik_selfは正しいです。あなたとあなたのDBAは技術的な上司を持っており、何が良いのかを理解する必要があります。何もしないで、DBAは4か月間働くか、DBAは1日と3日間働きます。それはあなたの選択肢ではなく、彼の選択肢(テクニカルリーダー) –

関連する問題