可以在Oracle中使用动态表名吗?

时间:2012-01-24 13:27:17

标签: oracle dynamic oracle11g

我可以做类似的事吗?

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 个答案:

答案 0 :(得分:2)

是的,但不是静态SQL。您可以使用Native Dynamic SQL(EXECUTE IMMEDIATE),它可能适合您的用例或更复杂(且功能强大)的DBMS_SQL包。

答案 1 :(得分:1)

你的设计不好。

我说的是表bd.images_yyyy。最好的方法是将它们放在单一的表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 ,以防您无法修改数据库或者您没有企业许可

使用name,year,imgblob(tmptable)创建一个temptable。

用以下内容填充:

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;

在populate('nananannaa')之后,您可以从tmptable中选择。

注意:如果不处理tmptable中的旧数据,您可以将其创建为global temporary table on commit delete。提交时,数据将从表中消失。