Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Как обратиться к полям ref cursor?  [new]
ref_cur
Guest
Доброго времени суток!

Есть такая вещь: с помощью ref cursor отбираю данные. Запрос формирую в виде строки. К полям курсора обращаюсь, объявив переменные + fetch.

declare
type ref_cur is ref cursor;
curs ref_cur;

l_str_sql varchar2(32767);
l_tt number;
l_attr1 table_1.ATTR1%TYPE;

begin
TEST_PKG.RetSql(7,'ррр, l_str_sql);

open curs for l_str_sql;
loop
fetch curs into l_tt,l_attr1;
exit when curs%notfound;
end loop;
close curs;
end;


Вопрос: можно ли обратиться к полям курсора без объявления переменных, т.к. их кол-во может быть большое и объявление переменных - дело грамозкое?

что-то типа такого:
open curs for l_str_sql;
for my in curs
loop
dbms_output.put_line('my.tt = ' || my.tt);
dbms_output.put_line('my.attr1 = ' || my.attr1);
.....

Спасибо.
11 дек 08, 12:35    [6555668]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к полям ref cursor?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18339
Кроме %TYPE есть еще и %ROWTYPE
11 дек 08, 12:37    [6555683]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к полям ref cursor?  [new]
ref_cur
Guest
andrey_anonymous,

делаю:

declare
type ref_cur is ref cursor;
curs ref_cur;

l_curs curs%rowtype;

ругается:
описание типа незавершено или выполнено неверно.

как это описать для моего примера?
11 дек 08, 12:59    [6555885]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к полям ref cursor?  [new]
Серафимный Шестикрыл
Member [заблокирован]

Откуда: С луны свалился
Сообщений: 2922
ref_cur
andrey_anonymous,

делаю:

declare
type ref_cur is ref cursor;
curs ref_cur;

l_curs curs%rowtype;

ругается:
описание типа незавершено или выполнено неверно.

как это описать для моего примера?


Документацию почитать не хочешь для начала ?
На предмет того, что такое курсорная переменная слабого типа, а что такое
сильного типа ? Ну и заодно попытаться узнать, что такое типизация в алгоритмических
языках и как она работает ?

Т.е. изучить устройство молотка, прежде чем отбить себе пальцы.
11 дек 08, 13:11    [6555999]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к полям ref cursor?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18339
ref_cur
как это описать для моего примера?

l_row table_1%ROWTYPE;
....
fetch curs into l_row;
11 дек 08, 13:17    [6556049]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к полям ref cursor?  [new]
ref_cur
Guest
andrey_anonymous
ref_cur
как это описать для моего примера?

l_row table_1%ROWTYPE;
....
fetch curs into l_row;


но в селекте, который возвращает пакет,
TEST_PKG.RetSql(7,'ррр, l_str_sql);

может быть разное количество полей, и названиямогут не соответствовать названиям полей таблицы table_1.
11 дек 08, 13:27    [6556134]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к полям ref cursor?  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
andrey_anonymous
ref_cur
как это описать для моего примера?

l_row table_1%ROWTYPE;
....
fetch curs into l_row;
а если у него динамический курсор вида
declare
c sys_refcursor;
begin
open c for :query;
loop
fetch c into ...
end loop;
end;
?
11 дек 08, 13:29    [6556152]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к полям ref cursor?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18339
ref_cur
может быть разное количество полей, и названиямогут не соответствовать названиям полей таблицы table_1.

Звиняйте бояре, бананиев не завезли.
Уходите в dbms_sql....
11 дек 08, 13:30    [6556160]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к полям ref cursor?  [new]
Серафимный Шестикрыл
Member [заблокирован]

Откуда: С луны свалился
Сообщений: 2922
andrey_anonymous
Звиняйте бояре, бананиев не завезли.
Уходите в dbms_sql....


Я же предупреждал, что следующий вопрос будет о вечном... :))
11 дек 08, 13:35    [6556203]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к полям ref cursor?  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
andrey_anonymous
Звиняйте бояре, бананиев не завезли
тоесть структура, скрытая под понятием REF CURSOR не содержит названий полей (либо нет инструментария для получения этих названий из нее)?
11 дек 08, 13:36    [6556216]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к полям ref cursor?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18339
--Eugene--
andrey_anonymous
Звиняйте бояре, бананиев не завезли
тоесть структура, скрытая под понятием REF CURSOR не содержит названий полей (либо нет инструментария для получения этих названий из нее)?

PL/SQL компилируется статически.

...впрочем, один способ таки есть.
Решая как-то подобную задачу, я генерировал динамически не только запрос, но и код по его обработке.
Все складывал в кучку и слал в execute immediate анонимным блоком.
11 дек 08, 13:46    [6556295]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к полям ref cursor?  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
andrey_anonymous,

тем временем ответа на мой вопрос так и не последовало
11 дек 08, 13:58    [6556391]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к полям ref cursor?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18339
--Eugene--
тем временем ответа на мой вопрос так и не последовало

А что, должен был?
Я не знаю как на него ответить менее чем на двух страницах текста.
А две страницы я тут писать не буду, извините :)
11 дек 08, 14:02    [6556418]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к полям ref cursor?  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
andrey_anonymous
Я не знаю как на него ответить менее чем на двух страницах текста
а если попробовать использовать стандартные слова вроде "да"/"нет"/"затрудняюсь ответить" ?
11 дек 08, 14:15    [6556532]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к полям ref cursor?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18339
--Eugene--
andrey_anonymous
Я не знаю как на него ответить менее чем на двух страницах текста
а если попробовать использовать стандартные слова вроде "да"/"нет"/"затрудняюсь ответить" ?

Тогда получится "вопрос сформулирован некорректно" ("Вы перестали бить свою жену?")
11 дек 08, 14:35    [6556720]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к полям ref cursor?  [new]
nf52
Guest
DBMS_SQL + DESCRIBE_COLUMNS
11 дек 08, 14:39    [6556766]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к полям ref cursor?  [new]
ref_cur
Guest
Спасибо всем!!!

DBMS_SQL - это то, что нужно!!!
11 дек 08, 16:23    [6557824]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к полям ref cursor?  [new]
Деев И.
Member

Откуда: отсюда
Сообщений: 783
Курсоры переводить из ref в dbms_sql и обратно, кажется, в 11g можно.

Лучше брать dbms_sql.describe_columns2 - более мощная процедурка.

Интересно,а с anydata и anydataset никак не получится refcursor подружить? Я никогда не пробовал. Может, кто-то пытался? Вообще-то проще взять dbms_sql, конечно.
11 дек 08, 18:17    [6558887]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к полям ref cursor?  [new]
VBR
Member

Откуда:
Сообщений: 79
Меня тоже заинтересовало, почему нет возможности по REF cursor получить список столбцов, их типы и т.д. Притом если сделать хранимку в БД на Java и этот ref cursor туда тупо передать параметром, то через ResultSetMetaData rsetMetaData = rset.getMetaData();
все эти данные можно получить.
11 дек 08, 18:26    [6558947]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить