我可以做类似的事吗?
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'
答案 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
。提交时,数据将从表中消失。