![]() |
|
Модераторы: LSD |
![]()
|
|
| Oleg |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 16.9.2002 Репутация: нет Всего: нет |
Привет всем!
Вот если есть у меня хранимая процедура в Oracle8i БД, например просто SELECT * FROm something... Как мне датасет отобразить в делфячьей форме (не говорю в DBGrid)? В параметрах хр.проц. можно вернуть тип данных ftCursor, в хелпе сказано, что возвращает курсор из Oracle. Если это ключ, то как им пользоваться? Спасибо. --------------------
...Знающий не доказывает. Доказывающий не знает... |
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 1 Всего: 118 |
Так никто и не ответил. Жаль. Очень хотелось бы знать. У меня было некое промежуточное решение с использованием временных таблиц. Процедура туда записывает, Следующий оператор - читает.
Но хотелось, чтобы как в MS SQL. Похоже не получится |
|||
|
||||
| Medved |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 1 Всего: 154 |
Ладно поспешу опередить события и отвечу.... Да, дело в том, что если мы напишем в хранимой процедуре (и не только в ней. здесь имеется в виду, без каких либо компонент, т.е. напрямую) просто запрос SELECT * FROM MyTable то Oracle не воспримет такую конструкцию.... вернее он возвратит результат, но мы с ним ничего не сможем сделать..... это будет не набор данных (как мы это привыкли понимать, а такая "картинка") мы не сможем ни осуществлять навигацию по ней, ничего с ней сделать.... Oracle не позволяет (скорее всего по соображениям безопасности) осуществлять прямой доступ к таблицам. Чтобы получить такой набор данных (в смысле "живой" с которым можно манипулировать, т.е. осуществлять навигацию и тд.), мы должны результаты какого-либо запроса, присвоить курсору (есть еще и другие подобные конструкции PL/SQL, такие как "записи" и "таблицы", но о них в другой раз) Курсор - означает "текущий набор записей" и представляет из себя специальный элемент PL/SQL, с которым связан SQL-оператор SELECT. Но отойдем от теории и рассмотрим пример: У нас таблицы студентов (students), в которой четыре поля 0) ID; 1) Имя (Name); 2) Фамилия (Surname); 3) Курс (Kurs).
Здесь хотелось бы обратить ваше внимание на конструкции PL/SQL которые я использовал: 1) CURSOR <имя курсора> IS <запрос SELECT>. - создание курсора; 2) OPEN <имя курсора> - открытие курсора; 3) LOOP <операторы;> EXIT WHEN <условие выхода>; END LOOP; Это конструкция цикицеской обработки (читай - "цикл"); 4) FETCH <имя курсора> INTO <список переменных куда заносяться результаты выборки>; 5) CLOSE <имя курсора>; - закрытие курсора; Вот вообщем-то и все! Хотя это лишь сотая часть из того, что относиться к курсорам и вообще выборки записей из таблиц Oracle... Но как я уже сказал... скоро будет цикл статей по этому поводу. Кому интересно, ждите.... P.S. Да, еще важно в конструкции - FETCH <имя курсора> INTO <список переменных куда заносяться результаты выборки>, чтобы количество переменных, в которые мы заносим результаты выборки из курсора, соответствовали типу и количеству полей, которые мы указываем после оператора SELECT, когда мы создаем курсор; -------------------- |
||||
|
|||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 1 Всего: 118 |
Г-н Pegas !
Был задан КОНКРЕТНЫЙ вопрос, а вы стали разводить непонятную теорию. Тот код, который приведен, то, что просилось изначально - НЕ ДЕЛАЕТ. Нафига флейм разводить ? Показать свою осведомленность ? Ну так заводите отдельную тему с циклом статей. А показательные примеры на уровне документации "для чайников" не надо ! Прошу рассматривать сие послание не как наезд или обвинение в профнепригодности, но хотелось услышать ответ на поставленный вопрос МОЖНО ЛИ, И ЕСЛИ МОЖНО, ТО КАК ВЕРНУТЬ ИЗ ХРАНИМОЙ ПРОЦЕДУРЫ НА ORACLE В ВИДЕ НАБОРА ДАННЫХ ? Например, как в MS SQL. |
|||
|
||||
| Medved |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 1 Всего: 154 |
Фу, какая невоспитанность....... на такой вопрос даже отвечать нехочется..... -------------------- |
|||
|
||||
| AntonSaburov |
|
||||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 1 Всего: 118 |
Я действительно несколько вспылил. За что извиняюсь. Но просто очень хотелось услышать ответ, который у меня изредка всплывает уже в течении нескольких лет. А воз и ныне там. |
||||
|
|||||
| Medved |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 1 Всего: 154 |
Да, не все так просто, как мне показалось, должен извиниться, надо работать не через курсор, а объявлять в качестве выходного параметра записи (имя_записи имя_таблицы%ROWTYPE), и используй в качестве компонентов для доступа к Oracle - библиотеку ODAC, я о ней раньше писал.... там есть такаой компонент OraStoredProc....
-------------------- |
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 1 Всего: 118 |
А вот за эту идею - спасибо. Надо посмотреть. Мне тут знакомые тоже что-то такое посоветовали. |
|||
|
||||
| Oleg |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 16.9.2002 Репутация: нет Всего: нет |
Yes, people, we got it!
Читайте ЭТО! create or replace table periods( -- создадим тестовую таблицу pid varchar2(10), name varchar2(3)); / insert into periods(pid, name) values('1','JAN'); insert into periods(pid, name) values('2','FEB'); insert into periods(pid, name) values('3','MAR'); insert into periods(pid, name) values('4','APR'); insert into periods(pid, name) values('5','MAY'); insert into periods(pid, name) values('6','JUN'); insert into periods(pid, name) values('7','JUL'); insert into periods(pid, name) values('8','AUG'); insert into periods(pid, name) values('9','SEP'); insert into periods(pid, name) values('10','OCT'); insert into periods(pid, name) values('11','NOV'); insert into periods(pid, name) values('12','DEC'); / create or replace type tRec as object( -- создадим обьектный тип для pid varchar2(10), -- записи name varchar2(3)); / create or replace type tTab as table of tRec; / -- создаем таблицу записей create or replace function f_Periods -- сама хранимая функция return tTab as p varchar2(10); n varchar2(3); res tTab:= tTab() ; rec tRec:= tRec(p,n) ; -- инициализация составного типа a Number; cnt Number; begin select count(*) into cnt from periods; for a in 1..cnt LOOP Res.extend; select pid, name into rec.pid, rec.name from periods where pid = a; res(a):= rec; END LOOP; RETURN Res; end; / -- а вот и сам текст кверя -- ОБРАТИТЕ ВНИМАНИЕ: cast select * from table(cast(f_periods() as tTab)); Победа! P.S. Кстати, вопрос к Pegas'у: я-то ODAC скачал, но я так понял, что он триальный со всеми вытекающими...Что с ним сделать или зачем он нужен тогда? Штука, согласен, неплохая. --------------------
...Знающий не доказывает. Доказывающий не знает... |
|||
|
||||
| Medved |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 1 Всего: 154 |
Молодчинка!
P/S/ а по поводу ODAC я даже точно не знаю...... его мой коллега скачивал, но у меня он не триальный. Я завтра у него спрошу, что он там с ним вытворял -------------------- |
|||
|
||||
| Medved |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 1 Всего: 154 |
Разузнал! Компоненты для прямого доступа к Oracle из Дельфи - ODAC и DAO находятся на сайте http://oraclebones.narod.ru
Там же лежит и SQL Developer - удобная штука между прочим! З.Ы. все компоненты рабочии, не триальные... -------------------- |
|||
|
||||
| Oleg |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 16.9.2002 Репутация: нет Всего: нет |
Спасибо, Pegas!
ODAC под Delphi7. --------------------
...Знающий не доказывает. Доказывающий не знает... |
|||
|
||||
![]()
|
| Правила форума "Oracle" | |
|
|
Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Oracle | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |