Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Опять про запрос из функции  [new]
Лобба
Guest
Добрый день.
Допустим есть процедура в пакете CURRENCIES_PACK

    --  Функция для вывода валют    
    function SP_CURRENCIES(p_DT in date) return ref_cursor 
    is
        rs ref_cursor;
    begin
        open rs for select a.ID, a.NAME, a.SHORTNAME, GET_COURSE(a.ID, p_DT) as COURSE from CURRENCIES a;
        return rs;
    end;

как можно добиться вызова в клиенте типа
select * from SP_CURRENCIES(sysdate)
?

Прочитал пример про пайп (пайп), но там указывается
TYPE numset_t IS TABLE OF NUMBER;
а т.к. у меня возвращаются не только поля таблицы, я не могу использовать даже %ROWTYPE
Подскажите, как поступать в таких случаях?
Спасибо
15 янв 09, 06:07    [6687680]     Ответить | Цитировать Сообщить модератору
 Re: Опять про запрос из функции  [new]
__vvp_
Member

Откуда: Санкт-Петербург
Сообщений: 1158
Лобба,
обычно делают так:

    procedure SP_CURRENCIES(p_DT in date, rc out sys_refcursor)
    is
    begin
        open rs for select a.ID, a.NAME, a.SHORTNAME, GET_COURSE(a.ID, p_DT) as COURSE
                    from CURRENCIES a
                    where fdate = p_DT;
    end;

а клиент САМ управляет курсором

или же на клиенте и вызывайте свой запрос

select a.ID, a.NAME, a.SHORTNAME, GET_COURSE(a.ID, p_DT) as COURSE
from CURRENCIES a
where fdate = :p_DT;

Pipelined function - это иной способ передачи данных клиенту и реализация его иная
15 янв 09, 10:10    [6688195]     Ответить | Цитировать Сообщить модератору
 Re: Опять про запрос из функции  [new]
Ashton
Member

Откуда: Moscow
Сообщений: 1178
Так не получится. Возвращай в функции table, а не ref cursor.

CREATE TABLE test_table2 AS
SELECT 1 ID, 'A' f1, 100 f2 FROM dual UNION ALL
SELECT 2 ID, 'B' f1, 200 f2 FROM dual UNION ALL
SELECT 3 ID, 'C' f1, 300 f2 FROM dual UNION ALL
SELECT 4 ID, 'D' f1, 400 f2 FROM dual

CREATE TYPE test_type_obj AS OBJECT ( 
    id NUMBER, 
    f1 CHAR(1),
    f2 NUMBER
)

CREATE TYPE test_type_table IS TABLE OF test_type_obj

CREATE OR REPLACE FUNCTION test_func RETURN test_type_table 
IS
    result test_type_table  := test_type_table(); 
BEGIN 
    SELECT test_type_obj(id, f1, f2) BULK COLLECT INTO RESULT
    FROM test_table2
    WHERE f2 < 400;
    RETURN result; 
END;

SELECT * FROM TABLE(CAST(test_func AS test_type_table))
15 янв 09, 10:17    [6688256]     Ответить | Цитировать Сообщить модератору
 Re: Опять про запрос из функции  [new]
Лобба
Guest
__vvp_

Спасибо за ответ. Вызывать свой запрос - выход. Но вот хочется попробовать через функцию.

__vvp_
а клиент САМ управляет курсором

А может подскажете, как сделать? Использую Delphi и ODAC

Ashton

Спасибо, попробую
15 янв 09, 10:32    [6688376]     Ответить | Цитировать Сообщить модератору
 Re: Опять про запрос из функции  [new]
__vvp_
Member

Откуда: Санкт-Петербург
Сообщений: 1158
Лобба
__vvp_

Спасибо за ответ. Вызывать свой запрос - выход. Но вот хочется попробовать через функцию.

__vvp_
а клиент САМ управляет курсором

А может подскажете, как сделать? Использую Delphi и ODAC

Ashton

Спасибо, попробую


На форум Delphi Вам дорога :)
15 янв 09, 10:33    [6688395]     Ответить | Цитировать Сообщить модератору
 Re: Опять про запрос из функции  [new]
Лобба
Guest
__vvp_
На форум Delphi Вам дорога :)

Я просто увидел что вы и там писали :) Поэтому спросил.
Спасибо всем за ответы
15 янв 09, 10:46    [6688542]     Ответить | Цитировать Сообщить модератору
 Re: Опять про запрос из функции  [new]
__vvp_
Member

Откуда: Санкт-Петербург
Сообщений: 1158
Лобба,

Вам надо посмотреть компоненты ODAC-а, которые реализуют DataSet
я ODAC не пользовал, только DOA, поэтому не подскажу конкретно :)
15 янв 09, 10:50    [6688596]     Ответить | Цитировать Сообщить модератору
 Re: Опять про запрос из функции  [new]
Alexanderpeshkov
Member

Откуда:
Сообщений: 315
Ashton
Так не получится. Возвращай в функции table, а не ref cursor.

CREATE TABLE test_table2 AS
SELECT 1 ID, 'A' f1, 100 f2 FROM dual UNION ALL
SELECT 2 ID, 'B' f1, 200 f2 FROM dual UNION ALL
SELECT 3 ID, 'C' f1, 300 f2 FROM dual UNION ALL
SELECT 4 ID, 'D' f1, 400 f2 FROM dual

CREATE TYPE test_type_obj AS OBJECT ( 
    id NUMBER, 
    f1 CHAR(1),
    f2 NUMBER
)

CREATE TYPE test_type_table IS TABLE OF test_type_obj

CREATE OR REPLACE FUNCTION test_func RETURN test_type_table 
IS
    result test_type_table  := test_type_table(); 
BEGIN 
    SELECT test_type_obj(id, f1, f2) BULK COLLECT INTO RESULT
    FROM test_table2
    WHERE f2 < 400;
    RETURN result; 
END;

SELECT * FROM TABLE(CAST(test_func AS test_type_table))

а как вставить в результирующую таблицу например два поля если в таблице FROM test_table2 несколько столбцов??? где можно указать те стобцы которые необходимо взять???
26 янв 09, 10:19    [6734376]     Ответить | Цитировать Сообщить модератору
 Re: Опять про запрос из функции  [new]
I00N
Member

Откуда:
Сообщений: 454
Ashton

SELECT * FROM TABLE(CAST(test_func AS test_type_table))

Для чего используете cast? Он тут не нужен
26 янв 09, 14:04    [6736432]     Ответить | Цитировать Сообщить модератору
 Re: Опять про запрос из функции  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
I00N
Для чего используете cast? Он тут не нужен
Ну это вопрос спорный...
26 янв 09, 14:38    [6736702]     Ответить | Цитировать Сообщить модератору
 Re: Опять про запрос из функции  [new]
I00N
Member

Откуда:
Сообщений: 454
Jannny
I00N
Для чего используете cast? Он тут не нужен
Ну это вопрос спорный...
Можно подробнее?
26 янв 09, 15:11    [6737032]     Ответить | Цитировать Сообщить модератору
 Re: Опять про запрос из функции  [new]
Alexanderpeshkov
Member

Откуда:
Сообщений: 315
CREATE TYPE test_type_obj AS OBJECT ( 
    id NUMBER, 
    f1 CHAR(1),
)

CREATE TYPE test_type_table IS TABLE OF test_type_obj

CREATE OR REPLACE FUNCTION test_func RETURN test_type_table 
IS
    result test_type_table  := test_type_table(); 
BEGIN 
    SELECT test_type_obj(id, f1) BULK COLLECT INTO RESULT
    FROM test_table2;
    RETURN result; 
END;
можно ли как то в таком варианте добавить в таблицу RESULT только 2 поля, если например в таблице test_table2 например их 6.... если можно то подскажите синтаксис где необходимо прописать имена полей которые мне нужны???
26 янв 09, 15:53    [6737333]     Ответить | Цитировать Сообщить модератору
 Re: Опять про запрос из функции  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
I00N
Jannny
I00N
Для чего используете cast? Он тут не нужен
Ну это вопрос спорный...
Можно подробнее?
тынц
26 янв 09, 15:55    [6737342]     Ответить | Цитировать Сообщить модератору
 Re: Опять про запрос из функции  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Alexanderpeshkov
можно ли как то в таком варианте добавить в таблицу RESULT только 2 поля, если например в таблице test_table2 например их 6
Вы говорите о чем-то непонятном. Какая разница, сколько полей в test_table2? И сколько по_Вашему добавляется в RESULT, если не 2?
26 янв 09, 15:58    [6737371]     Ответить | Цитировать Сообщить модератору
 Re: Опять про запрос из функции  [new]
__vvp_
Member

Откуда: Санкт-Петербург
Сообщений: 1158
Alexanderpeshkov
CREATE TYPE test_type_obj AS OBJECT ( 
    id NUMBER, 
    f1 CHAR(1),
)

CREATE TYPE test_type_table IS TABLE OF test_type_obj

CREATE OR REPLACE FUNCTION test_func RETURN test_type_table 
IS
    result test_type_table  := test_type_table(); 
BEGIN 
    SELECT test_type_obj(id, f1) BULK COLLECT INTO RESULT
    FROM test_table2;
    RETURN result; 
END;
можно ли как то в таком варианте добавить в таблицу RESULT только 2 поля, если например в таблице test_table2 например их 6.... если можно то подскажите синтаксис где необходимо прописать имена полей которые мне нужны???


А что - так, как сейчас, не получается?
26 янв 09, 16:00    [6737387]     Ответить | Цитировать Сообщить модератору
 Re: Опять про запрос из функции  [new]
I00N
Member

Откуда:
Сообщений: 454
Jannny
I00N
Jannny
I00N
Для чего используете cast? Он тут не нужен
Ну это вопрос спорный...
Можно подробнее?
тынц

Понятно, спс. Это undefined behavior оракла или есть какое-то обоснование?
26 янв 09, 19:19    [6738861]     Ответить | Цитировать Сообщить модератору
 Re: Опять про запрос из функции  [new]
Alexanderpeshkov
Member

Откуда:
Сообщений: 315
CREATE TYPE test_type_obj AS OBJECT ( 
    id NUMBER, 
    f1 CHAR(1),
)

CREATE TYPE test_type_table IS TABLE OF test_type_obj

CREATE OR REPLACE FUNCTION test_func RETURN test_type_table 
IS
    result test_type_table  := test_type_table(); 
BEGIN 
    SELECT test_type_obj(id, f1) BULK COLLECT INTO RESULT
    FROM test_table2;
    RETURN result; 
END;
можно ли как то в таком варианте добавить в таблицу RESULT только 2 поля, если например в таблице test_table2 например их 6.... если можно то подскажите синтаксис где необходимо прописать имена полей которые мне нужны???
27 янв 09, 10:10    [6740263]     Ответить | Цитировать Сообщить модератору
 Re: Опять про запрос из функции  [new]
Alexanderpeshkov
Member

Откуда:
Сообщений: 315
__vvp_
Alexanderpeshkov
CREATE TYPE test_type_obj AS OBJECT ( 
    id NUMBER, 
    f1 CHAR(1),
)

CREATE TYPE test_type_table IS TABLE OF test_type_obj

CREATE OR REPLACE FUNCTION test_func RETURN test_type_table 
IS
    result test_type_table  := test_type_table(); 
BEGIN 
    SELECT test_type_obj(id, f1) BULK COLLECT INTO RESULT
    FROM test_table2;
    RETURN result; 
END;
можно ли как то в таком варианте добавить в таблицу RESULT только 2 поля, если например в таблице test_table2 например их 6.... если можно то подскажите синтаксис где необходимо прописать имена полей которые мне нужны???


А что - так, как сейчас, не получается?

ладно наверное я не понятно объяснил, суть такая в результирующей таблицу RESULT два поля а в test_table2 например 6 как указать ораклу в этом запросе какие именно 2 поля взять из таблицы test_table2??? или этот вариант работает только для одинаковых по количеству полей таблиц???
27 янв 09, 10:14    [6740290]     Ответить | Цитировать Сообщить модератору
 Re: Опять про запрос из функции  [new]
__vvp_
Member

Откуда: Санкт-Петербург
Сообщений: 1158
Alexanderpeshkov
CREATE TYPE test_type_obj AS OBJECT ( 
    id NUMBER, 
    f1 CHAR(1)/*,*/
);

CREATE TYPE test_type_table IS TABLE OF test_type_obj;

CREATE OR REPLACE FUNCTION test_func RETURN test_type_table 
IS
    result test_type_table  := test_type_table(); 
BEGIN 
    SELECT test_type_obj(id, f1) BULK COLLECT INTO RESULT
    FROM test_table2;
    RETURN result; 
END;
можно ли как то в таком варианте добавить в таблицу RESULT только 2 поля, если например в таблице test_table2 например их 6.... если можно то подскажите синтаксис где необходимо прописать имена полей которые мне нужны???


Какую ошибку выдает???
Все правильно написано (если id, f1 поля таблицы test_table2), за исключением запятой.
27 янв 09, 10:15    [6740293]     Ответить | Цитировать Сообщить модератору
 Re: Опять про запрос из функции  [new]
Elic
Member

Откуда:
Сообщений: 29979
Alexanderpeshkov
можно ли как то в таком варианте добавить в таблицу RESULT только 2 поля, если например в таблице test_table2 например их 6....
Если тупой вопрос задать дважды, умнее ни он ни ты не станете
27 янв 09, 10:15    [6740297]     Ответить | Цитировать Сообщить модератору
 Re: Опять про запрос из функции  [new]
Alexanderpeshkov
Member

Откуда:
Сообщений: 315
Jannny
Alexanderpeshkov
можно ли как то в таком варианте добавить в таблицу RESULT только 2 поля, если например в таблице test_table2 например их 6
Вы говорите о чем-то непонятном. Какая разница, сколько полей в test_table2? И сколько по_Вашему добавляется в RESULT, если не 2?

блин я как раз говорю понятные вещи. я пытаюсь выяснить можно ли как то изменить этот запрос чтобы добавлять например 2 определенных поля из таблицы test_table2 если в ней например 6???
данный же запрос подходит только если количество полей в таблице RESULT=количеству полейtest_table2!!!
27 янв 09, 10:17    [6740308]     Ответить | Цитировать Сообщить модератору
 Re: Опять про запрос из функции  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Alexanderpeshkov
блин я как раз говорю понятные вещи.
вопрос - понятные "кому"? :)

Alexanderpeshkov
данный же запрос подходит только если количество полей в таблице RESULT=количеству полейtest_table2!!!
Вы говорите фигню. Попробуйте понять пример, иначе говорить бессмысленно в принципе. Или хотя бы попробовать использовать таблицу из 6 полей :)
27 янв 09, 10:29    [6740372]     Ответить | Цитировать Сообщить модератору
 Re: Опять про запрос из функции  [new]
Alexanderpeshkov
Member

Откуда:
Сообщений: 315
Elic
Alexanderpeshkov
можно ли как то в таком варианте добавить в таблицу RESULT только 2 поля, если например в таблице test_table2 например их 6....
Если тупой вопрос задать дважды, умнее ни он ни ты не станете

зачем писать никому ненужные кометы от каторых толку 0 если что то знаешь так напиши тогда по сути вопроса...
27 янв 09, 10:37    [6740426]     Ответить | Цитировать Сообщить модератору
 Re: Опять про запрос из функции  [new]
Alexanderpeshkov
Member

Откуда:
Сообщений: 315
Jannny
Alexanderpeshkov
блин я как раз говорю понятные вещи.
вопрос - понятные "кому"? :)

Alexanderpeshkov
данный же запрос подходит только если количество полей в таблице RESULT=количеству полейtest_table2!!!
Вы говорите фигню. Попробуйте понять пример, иначе говорить бессмысленно в принципе. Или хотя бы попробовать использовать таблицу из 6 полей :)

я то как раз пробую:
CREATE OR REPLACE FUNCTION super.ufgd_UserData(groupby varchar2,star varchar2,fin varchar2) RETURN tb_t IS
t tb_t;
BEGIN
    t:=tb_t();
     SELECT t_t(label,value) BULK COLLECT INTO t FROM super.tUserDataH;
   RETURN t;
   EXCEPTION
     WHEN NO_DATA_FOUND THEN
     RETURN NULL;
     WHEN OTHERS THEN
       -- Consider logging the error and then re-raise
       RAISE;
END ufgd_UserData;
вот моя функция которая возвращает таблицу с двумя полями label и value в таблице tUserDataH 8 полей из них мне нужно только два... я сделал как у вас в примере написано но функция не компилируется значит где то не коректный синтаксис но где не понятно... у меня стоит оракл экспрес...
27 янв 09, 10:42    [6740461]     Ответить | Цитировать Сообщить модератору
 Re: Опять про запрос из функции  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Alexanderpeshkov
     SELECT t_t(label,value) BULK COLLECT INTO t FROM super.tUserDataH;
Кто такой t_t? И на всякий случай Оракл редко ругается молча... :)
ЗЫ: И ещё на всякий случай перехватывать no_data_found при select bulk collect into не нужно, его не будет.
27 янв 09, 10:49    [6740501]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить