Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.12.12;
Скачать: [xml.tar.bz2];

Вниз

Возможно ли выбрать из ассоциативного массива (table) в Cursor   Найти похожие ветки 

 
Grrey   (2003-11-18 16:30) [0]

Есть функция, которая возврацает курсорную переменную. (Выбрал именно ее, так как ODAC не поддерживает получение из базы параметра типа ассоциативного массива(Table)) В ней формируется нужный для возвращения Table, а передать его в приложение я не могу.
Кроме ODAC ничего использовать нельзя. Требование заказчика.
Помогите. Чего делать?


 
Grrey   (2003-11-18 16:40) [1]

Надо еще сказать, что темповую таблицу создавать не хочется. Слишком Она будет медленно формироваться.


 
Reindeer Moss Eater   (2003-11-18 16:42) [2]

А поле типа вложенная таблица не подходит?


 
Grrey   (2003-11-18 16:49) [3]

Это не поле таблицы. Эта переменная пакета, в котором она и формируется.


 
Reindeer Moss Eater   (2003-11-18 16:56) [4]

Так что мешает иметь поле и формировать значение поля?


 
Grrey   (2003-11-18 17:09) [5]

Для того чтоб иметь поле, нужно иметь таблицу, а этого как раз не хочется.


 
Reindeer Moss Eater   (2003-11-18 17:17) [6]

Ну а что в итоге-то должно получиться?


 
Grrey   (2003-11-18 17:25) [7]

Функция должна возвращать курсор на ассоциативный массив.
Такое возможно?


 
Reindeer Moss Eater   (2003-11-18 17:30) [8]

Если такие курсоры существуют, то возможно.
А их нету.


 
Grrey   (2003-11-18 18:02) [9]

Т.е. это в принципе не может быть выполнено?


 
Reindeer Moss Eater   (2003-11-18 18:03) [10]

Что в принципе?
Возврат несуществующего типа курсора или решение прикладной задачи?


 
Grrey   (2003-11-18 18:13) [11]

Прикладной задачи. И этот тип курсора действительно не существует?


 
Reindeer Moss Eater   (2003-11-18 18:16) [12]

Вот про прикладную задачу я и спрашивал в [6]


 
Grrey   (2003-11-18 18:25) [13]

Так я все описал в [1]. Может не все понятно? Тогда что именно?


 
Reindeer Moss Eater   (2003-11-18 18:29) [14]

Ты мне описал то, как ты хочешь решить свою таинственную прикладную задачу с помощью массива и курсора.
А что это за задача - до сих пор молчишь.


 
Grrey   (2003-11-18 18:47) [15]

Есть таблица рассписания.
состоит из строк:
ID,
start_dt,
end_dt,
Name,
Caption,
RezCaption,
Kind
Мне нужно распечатать репрорт в виде :
Name | 1 | 2 | 3 | ...

Где Name - это имя человека, 1,2,3 числа месяца. В сами ячейки добавляется инфа из Caption или RezCaption в зависимости от состояния поля Kind.
Я решил сделать функцию, возвращабщую курсор на структуру репорта, а потом ее распечатать из обычного QReport"а.
Если будут дополнительные вопросы, задавайте.


 
Reindeer Moss Eater   (2003-11-19 00:09) [16]

Ну вот теперь полет мысли ясен.

По порядку.
Курсор вернуть можно, но для него надо написать "Select"
Select из коллекций делать нельзя.
Вернее можно, с помощью псевдофункций коллекций типа "THE" и "TABLE", но только если коллекция - столбец таблицы и только в контексте SQL (а не в PL/SQL).
Значит в твоем случае - нельзя.
Остается выбирать из Dual и прибегнуть к помощи union.
select my_array("name1").Caption,...
union
select my_array("name2").Caption,...
...
и так далее по количеству имен.

Дальше.
Надо еще сказать, что темповую таблицу создавать не хочется. Слишком Она будет медленно формироваться.

Понимаю, что не хочется, но не понимаю почему медленно.
Нужно иметь денормализованную таблицу в виде готового расписания, которую формировать процедурами пакета причем раз в месяц.
Не понимаю почему кажется, что насиловать сервер формированием расписания каждый раз, когда за ним приходит очередной желающий - это быстрее, чем один раз в месяц.
Если уж так не хочется формировать двумерную таблицу, то запиши свой массив (он же как я понял уже сформирован) целиком в поле соответствующего типа таблицы готовых расписаний и делай к нему запрос как к набору данных.


 
Grrey   (2003-11-20 12:22) [17]

Спасибо.
Формироваться она будет точно не раз в месяц. А под конец месяца ее раз десять будут вызывать постоянно делаяя какие-нибуть мелкие поправки. Так вот под конец месяца база будет просто виснуть, т.к. кроме этого приложения там еще вертится весь офис, а это 30-40 компов, которые без базы как без рук.
Сейчас столкнулся еще с одной проблемой.
Сама процедура добавления достаточно быстрая, но если посмотреть сколько она оперативы сжирает! Это просто ужас почти 500 метров. Это скорее всего где-то я чего-то упустил. Не должно быть так, как я думаю.
В крайнем случае придется процедуру формирования репорта делать в фоновом режиме за ночь. Не нравиться мне это. Должно же быть какое-то решение без этих экстримальных мер.


 
Nikolay M.   (2003-11-20 12:34) [18]

Если не хочется насиловать сервер, насилуй клиента - сделай из таблицы простой селект, а на клиенте распарси его как хочешь и загони данные в что-нибудь а-ля RxMemoryTable.


 
Grrey   (2003-11-20 17:30) [19]

Это конечно все хорошо,но все же это лучше сделать на сервере. Кто знает как они потом будут это использовать. Вполне вероятно, что появиться и вебовский интерфейс, и мобильный интерфейс. Не хочеться все переделывать.
Может сложиться впечатление, что я лентя, которому ничего делать не хочится, а получить идельную программку позарез надо. Дело в том, что один вариант я уже сделал. Вроде не так много оперативы сжирает, но сетку грузит (и от этого, я думаю, исбавлюсь). Просто хотелось бы знать как в такой ситуации поступают мастера. Может есть способ лучше.


 
Reindeer Moss Eater   (2003-11-20 17:35) [20]

Если потребуется доступ к расписанию через веб, то прямая дорога тебе к формированию таблицы которая будучи открытой представляла бы собой готовое расписание.
У тебя же как я понял уже есть подобный но массив. Остается переинсертить его в физическую таблицу.
Кстати с фичами "девятки" весь код будет очень компактным и вдобавок быстрым.


 
Grrey   (2003-11-21 12:05) [21]

Расскажи ка про фичи девятки.
Какие именно ты имел ввиду?


 
Reindeer Moss Eater   (2003-11-21 12:12) [22]

Пакетный вариант цикла for (for all) - сводит к минимуму переключение контекстов PL/SQL и SQL

Возможность использовать записи (например %rowtype) в инструкциях Insert into


 
Grrey   (2003-11-22 02:37) [23]

Вот именно об этом я сейчас и думаю. Глюки какие-то. Скорее всего сам разберусь, но все же расскажу. Написал я процедурку вставки во временную таблицу. Приведу сразу кусок кода:
forall iTab in vSchedRepTab.First .. vSchedRepTab.Last
insert into tempRepTable values(
vSchedRepTab(iTab).SchedID,
vSchedRepTab(iTab).Person_id,
vSchedRepTab(iTab).FullName,
vSchedRepTab(iTab).persent,
Там эта инструкция строк на 100 вниз уходит. Но это не проблема. Проблема в том, что Оракл не хочет все это дело компилировать. Выдает ошибку -
PLS-00436: ограничение реализации: невозможно обращение к полям или таблице массовой привязки ln записей.
Хотя в книге (кстати хорошая книга, не считая мелких опечаток, Фернштейн, Прибыл) написанно, что именно так и надо делать.
Может я что-то не так понял?


 
Reindeer Moss Eater   (2003-11-22 20:57) [24]

Использование записей в DML - фича 9iR2.
Не раньше.

declare
my_rec mytable%rowtype;
begin
insert into mytable values my_rec;
end;

Кроме записей на основе привязки можно использовать и все другие типы коллекций.
Лишь бы количество и типы полей совпадали с табличными.
То есть если имеется ассоциативный массив, то его элементами должны быть коллекции с количеством и типами полей совпадающими с табличными (куда идет вставка)



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.12.12;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.012 c
4-36895
Urri
2003-10-17 07:02
2003.12.12
Размер области многострочного вывода


14-36818
RealRascal
2003-11-19 22:26
2003.12.12
Москва, сравним цены?


14-36806
Thor
2003-11-15 15:28
2003.12.12
соединить компьютеры в сеть :)


8-36767
Zorik
2003-08-14 11:10
2003.12.12
как отобразить 3D карту поверхности


1-36738
Koba
2003-12-01 11:04
2003.12.12
Перемещение формы по экрану.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский