﻿<?xml version='1.0' encoding='UTF-8'?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Релиб / Oracle / Базы данных  / Запросы с динамически формируемыми колонками / Latest Posts</title><generator>InstantForum.NET v4.1.4</generator><description>Релиб</description><link>http://www.relib.com/forums/</link><webMaster>robot@relib.com</webMaster><lastBuildDate>Fri, 22 Aug 2008 03:41:30 GMT</lastBuildDate><ttl>20</ttl><item><title>RE: Запросы с динамически формируемыми колонками</title><link>http://www.relib.com/forums/Topic894346-21-1.aspx</link><description>Ok, пока я сделал так. Все работает как часы.[code]CREATE OR REPLACE FUNCTION getReportContent(idReal IN int, idServReal IN INT, idOt IN INT)    RETURN SYS_REFCURSORIS RESULT SYS_REFCURSOR;  FIELD_PREFIX VARCHAR2(15) := 'STRING_C_';  TABLE_PREFIX VARCHAR2(15) := 'DATA_'; CUR1 SYS_REFCURSOR; SEL VARCHAR2(4096) := ''; isSt INT;BEGIN    --читаем список полей из паленой таблицы метаданных    OPEN CUR1 FOR SELECT ID_ST FROM STR_ST_F        WHERE STR_ST_F.ID_OT = idOt        ORDER BY NUM_ST;    LOOP       FETCH CUR1 INTO isSt;       EXIT WHEN CUR1%NOTFOUND;       SEL := SEL || FIELD_PREFIX || CAST(isSt AS VARCHAR2) || ',';    END LOOP;    CLOSE CUR1;     --избавляемя от последней запятой    SEL := SubStr(SEL,1,LENGTH(SEL)-1);    --формируем динамический запрос    SEL :=       'SELECT C1.ID_PART,        C1.ID_SERV_PART,        C1.NAME_PART,        C1.PR_PART,        C1.STR,        C1.ID_F,        C1.ID_SERV_ID_F,        C1.K_ECR, '||        SEL||        ' FROM STR_OTCH_F C1        LEFT OUTER JOIN ' || TABLE_PREFIX || CAST(idOt AS VARCHAR2) || ' D        ON D.ID_PART=C1.ID_PART AND        C1.ID_SERV_PART = D.ID_SERV_PART AND        ID_REAL=' || CAST(idReal AS VARCHAR2) || ' AND ID_SERV_REAL = ' || CAST(idServReal AS VARCHAR2) || '      WHERE C1.ID_OT = ' || CAST(idOt AS VARCHAR2) || '      ORDER BY STR';-- включить для отладки--    INSERT INTO DEBUG(SQL) VALUES(SEL);--    COMMIT;    OPEN RESULT FOR SEL;  RETURN RESULT;END;[/code]А где применять EXECUTE IMMEDIATE я пока не понял. Еще вопрос. Как бы мне в этой функции наполнить таблицу из трех полей: recordNo int, fieldName varchar2(15), fieldValue varchar2(200), primary key(recordNo, fieldName). То бишь я бы все-таки хотел бы возвращать набора данных, а не курсор. Дело в том что обработка курсора на яве тянет за собой пакет oracle.jdbc и решение получается далеко не универсальное (я молчу про толстого клиента - он  у них на Power Builder). Если я верну набор данных, я вполне обойдусь стандартным jdbc И поставлю только оракловые дрова.   Спасибо.</description><pubDate>Tue, 04 Apr 2006 15:09:00 GMT</pubDate><dc:creator>mishau</dc:creator></item><item><title>RE: Запросы с динамически формируемыми колонками</title><link>http://www.relib.com/forums/Topic894346-21-1.aspx</link><description>[quote]Я не так написал, надоы было так select a,b,c,.... from ...[/quote] Ну дык a,b,c - это что? Имена полей? Ты же писал, что[quote]Посему имена таблиц и колонок для выбора в селекте тоже хранятся в определенных таблицах и селект должен собираться динамически[/quote] Значит имена полей и их количество заранее неизвестны, и определяются по неким другим определенным таблицам - я так понял. Т.е. ты сначала надо выбрать имена таблиц, потом по ним имена полей и потом "склеить" их в запрос. Так? И при чем тут тогда курсоры какие то? Вложенными циклами выдираешь нужное и формируешь строку запроса. После выполняешь ее EXECUTE IMMEDIATE.Или я запутался совсем?</description><pubDate>Tue, 04 Apr 2006 14:48:00 GMT</pubDate><dc:creator>TSergey</dc:creator></item><item><title>RE: Запросы с динамически формируемыми колонками</title><link>http://www.relib.com/forums/Topic894346-21-1.aspx</link><description>[quote="TSergey"][quote]В виду этого проще наверно сразу выполнять open mycorsor for 'select a,b,c from ...'[/quote]  Если тебе заранее известны имена полей "a,b,c", то о чем вопрос вообще? Не понял я тебя.[/quote]Я не так написал, надоы было так select a,b,c,.... from ...</description><pubDate>Tue, 04 Apr 2006 10:47:00 GMT</pubDate><dc:creator>mishau</dc:creator></item><item><title>RE: Запросы с динамически формируемыми колонками</title><link>http://www.relib.com/forums/Topic894346-21-1.aspx</link><description>[quote]В виду этого проще наверно сразу выполнять open mycorsor for 'select a,b,c from ...'[/quote]  Если тебе заранее известны имена полей "a,b,c", то о чем вопрос вообще? Не понял я тебя.</description><pubDate>Mon, 03 Apr 2006 16:15:00 GMT</pubDate><dc:creator>TSergey</dc:creator></item><item><title>RE: Запросы с динамически формируемыми колонками</title><link>http://www.relib.com/forums/Topic894346-21-1.aspx</link><description>[quote="TSergey"]&gt;Как мне организовать такую процедуру?Динамический SQL - т.е. формируешь строку запроса динамически и выполняешь ее EXECUTE IMMEDIATE. Организовать нетрудно, но для Оракла это не есть хорошо - постоянный разбор запроса.[/quote]Команда EXECUTE IMMEDIATE вероятно бесполезна для select ибо все равно требует курсор. В виду этого проще наверно сразу выполнять [code]open mycorsor for 'select a,b,c from ...'[/code]</description><pubDate>Mon, 03 Apr 2006 11:31:00 GMT</pubDate><dc:creator>mishau</dc:creator></item><item><title>RE: Запросы с динамически формируемыми колонками</title><link>http://www.relib.com/forums/Topic894346-21-1.aspx</link><description>&gt;Как мне организовать такую процедуру?Динамический SQL - т.е. формируешь строку запроса динамически и выполняешь ее EXECUTE IMMEDIATE. Организовать нетрудно, но для Оракла это не есть хорошо - постоянный разбор запроса.</description><pubDate>Mon, 03 Apr 2006 09:06:00 GMT</pubDate><dc:creator>TSergey</dc:creator></item><item><title>RE: Запросы с динамически формируемыми колонками</title><link>http://www.relib.com/forums/Topic894346-21-1.aspx</link><description>[quote="Karbofos"]спроси на asktom.oracle.com[/quote]Хотел спросить, вот какой информативный ответ там дают:Sorry I have a large backlog right now, please ask a question later...:(</description><pubDate>Sun, 02 Apr 2006 13:34:00 GMT</pubDate><dc:creator>mishau</dc:creator></item><item><title>RE: Запросы с динамически формируемыми колонками</title><link>http://www.relib.com/forums/Topic894346-21-1.aspx</link><description>спроси на asktom.oracle.com</description><pubDate>Sun, 02 Apr 2006 11:51:00 GMT</pubDate><dc:creator>Karbofos</dc:creator></item><item><title>Запросы с динамически формируемыми колонками</title><link>http://www.relib.com/forums/Topic894346-21-1.aspx</link><description>Привет всем!Заказчики дали БД по сбору отчетов с филиалов. Она, мягко скажем, спроектирована нестандартно. Посему имена таблиц и колонок для выбора в селекте тоже хранятся в определенных таблицах и селект должен собираться динамически что и делается на java. Хотелось бы все это перенести в Oracle. Что я имею в виду? Вот пример:repforms (repform_tablename, repform_name) иаблица для названий форм: имя таблицы БД, имя формы; repcols (repform_tablename, repcol_fieldname, repcol_name) таблица названий столбцов: имя таблицы БД (внешн. ключ к repforms), имя поля для select, имя колонки соответствено;необходима хранимая процедура, где я подаю на вход значение table_name из repforms И она генерирует запрос и выдает данные согласно repcols:[code]select &lt;repcol_fieldname1&gt;, &lt;repcol_fieldname2&gt;, ... from &lt;repform_tablename&gt; [/code] Вообще-то, еще лучше будет, если будут возвращены всего два поля:&lt;repcol_fieldname1&gt;,&lt;repcol_value1&gt;; &lt;repcol_fieldname2&gt;,&lt;repcol_value2&gt;; &lt;repcol_fieldname3&gt;,&lt;repcol_value3&gt;; Как мне организовать такую процедуру?Спасибо. </description><pubDate>Sun, 02 Apr 2006 10:37:00 GMT</pubDate><dc:creator>mishau</dc:creator></item></channel></rss>