![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Select from ( функция которая возвращает строку) /10g [D7]
tytus © (2008-03-20 18:28:00)Доброго дня всем. Есть ф-я которая возвращает строку
' SELECT * FROM PCMD_MAIN PARTITION(PART_010308) order by CALL_START_TIME '
затем, я использую эту функцию в хранимке, примерно таким способом:
stmt:=' select поле1, поле 2.... поле N '||+
' from (моя функция)*** a, таблица_1 b. таблица_2 c '||+
' where a_поле=b_поле '||+
' and b_поле=c_поле ';
затем dbms_sql.parse(cur,stmt,dbms_sql.native);
и так далее.
Так вот, ежели в строке *** написать строку приведенную в начале, то все работает, ежели как функцию - то нет.
Ругается что (пропущена правая скобка ...???!!!)
Хотя запрос
select Моя_Функция from Dual - дает вышеописанную строку.
Как мне исправить сию проблему?
Правильный_Вася (2008-03-21 14:37:00) [1]
> очень хотелось бы увидеть рабочий пример select from str
он не понимает разницы между SQL и строкой, которая будет исполняться как SQL, будучи собранной из кусочков
Кщд (2008-03-21 14:31:00) [2]>tytus (21.03.08 09:01) [3]
очень хотелось бы увидеть рабочий пример select from str
пусть и под 8-ку)
tytus (2008-03-21 10:13:00) [3]>Правильный_Вася (21.03.08 09:12) [4]
Вот это - то что надо... Просто была есче ошибка, она меня с толку сбила,
а твой вариант подошел. Спасибо.
Спасибо всем.
Правильный_Вася (2008-03-21 09:12:00) [4]потому что нельзя сделать выборку из строки
если тебе так хочется динамический скл, то
'from (' ||моя_функция || ')a, таблица_1 b. таблица_2 c ' ||
tytus (2008-03-21 09:01:00) [5]>Правильный_Вася (20.03.08 20:48) [2]
Подобное я содрал с одного проекта, еще для Oracle 8i, и там такой "финт " работал нормально. Только текст самой ф-ции не помню, но то, что она возвращала строку - это 100%. А набор данных тут, имхо, непричем, потому как просто формируется строка stmt, которая затем парсится... И если -бы нужен был набор данных - то оракл заругался-бы по-другому...
А смысл этого -прост. Есть таблица с разделами по диапазону, равному одному месяцу. Так, PART_0108 - это за янвырь, PART_0208 - за февраль и так далее. А функция должна возвратить след.:
select * from Таблица Partition (PART_0102)
union all --это ежели больше одного месяца
select * from Таблица Partition (PART_0103)
И потом сей текст вставить в строку stmt. Так вот, как уже было сказано, просто текст работает, а через функцию - нехочет...
Правильный_Вася (2008-03-20 20:48:00) [6]если твоя функция возвращает строку, а не набор данных, то это работать не будет
> dbms_sql?и это в наше-то время?
иногда очень удобно
у Кайта подробно разобрано, в каких случаях дин. sql лучше через этот пакет, а в каких - через execute immediate
Reindeer Moss Eater (2008-03-20 18:54:00) [7]dbms_sql?
и это в наше-то время?