Можно ли использовать динамические имена таблиц в Oracle? - PullRequest
0 голосов
/ 24 января 2012

Могу ли я сделать что-то подобное?

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 ]

2 голосов
/ 24 января 2012

Да, но не со статическим SQL.Вы можете использовать Собственный динамический SQL (EXECUTE IMMEDIATE), который, вероятно, соответствует вашему варианту использования или более сложному (и мощному) пакету DBMS_SQL.

1 голос
/ 24 января 2012

У вас плохой дизайн.

Я говорю о таблицах bd.images_yyyy. Лучше всего иметь их в одной таблице bd_images с колонкой year, , разбитой на on year.

Ваш запрос станет:

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. При фиксации данные исчезнут из таблицы.

...