Автор Тема: PL/SQL, Oracle, IT  (Прочитано 1905 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Uncle_V

  • Эксперт
  • *****
  • Сообщений: 1095
Re: PL/SQL, Oracle, IT
« Ответ #15 : Июня 01, 2016, 17:00:19 »
Выкладывай исходники, стилистику подправлю, если время будет.  :)

Оффлайн Sata Автор темы

  • Ветеран форума
  • ******
  • Сообщений: 5195
  • Пиво
Re: PL/SQL, Oracle, IT
« Ответ #16 : Июня 01, 2016, 17:03:00 »
Выкладывай исходники, стилистику подправлю, если время будет.  :)

Оффлайн Uncle_V

  • Эксперт
  • *****
  • Сообщений: 1095
Re: PL/SQL, Oracle, IT
« Ответ #17 : Июня 01, 2016, 17:12:21 »
Sata, это у тебя хобби или ты в этом некое развитие видишь в профессиональном плане?

Оффлайн Sata Автор темы

  • Ветеран форума
  • ******
  • Сообщений: 5195
  • Пиво
Re: PL/SQL, Oracle, IT
« Ответ #18 : Июня 01, 2016, 20:05:13 »
Sata, это у тебя хобби или ты в этом некое развитие видишь в профессиональном плане?
тестирую релизы, и у нас все на оракле. вощемто непосредственная связь.
но, как и на прошлой работе с оптикой, нравится разбираться во всех этих делах.
еще шарп надо начать  ???

Оффлайн Mishok

  • Эксперт
  • *****
  • Сообщений: 2470
  • ♠ ♣ ♥ ♦
Re: PL/SQL, Oracle, IT
« Ответ #19 : Июня 01, 2016, 22:54:04 »
А я на следующей неделе коммандируюсь на курсы Developing SQL Server Database/  :crazy:

Оффлайн Sata Автор темы

  • Ветеран форума
  • ******
  • Сообщений: 5195
  • Пиво
Re: PL/SQL, Oracle, IT
« Ответ #20 : Июня 01, 2016, 22:58:06 »
А я на следующей неделе коммандируюсь на курсы Developing SQL Server Database/  :crazy:
красава, а куда?
ну там же те же стандарты ANSI?

Оффлайн Mishok

  • Эксперт
  • *****
  • Сообщений: 2470
  • ♠ ♣ ♥ ♦
Re: PL/SQL, Oracle, IT
« Ответ #21 : Июня 01, 2016, 22:58:47 »
Да тут же в Питере, где и работаю. Работа вобщем и посылает.  :)

Оффлайн SatanClaus

  • Опытный
  • ****
  • Сообщений: 696
Re: PL/SQL, Oracle, IT
« Ответ #22 : Июня 02, 2016, 12:11:14 »

... и добавил:

Из этих таблиц селекты делать нельзя. К ним можно обращаться только в цикле и по индексу, как описано выше. Это не таблицы, это коллекции.
Топикстартер, как тебе написали, смешиваешь plsql конструкции и sql запросы. Хочешь использовать типы в запросах, создавай type в базе и тогда его можно через table() использовать в sql запросах.

Оффлайн Uncle_V

  • Эксперт
  • *****
  • Сообщений: 1095
Re: PL/SQL, Oracle, IT
« Ответ #23 : Июня 02, 2016, 12:24:46 »
SatanClaus, это довольно сложный путь, и в данном случае не оправданный. Я сам объектными типами пользуюсь в основном только когда мне надо передавать коллекции параметров при вызове процедур через динамический PL/SQL - диспетчеры всякого рода.

... и добавил:

Тут скорее дилемма такая, что приложенный код содержит "споры" CRM-системы, но трудоемкость всей задачи автором, вероятно, недооценивается. Поэтому в самой ER-модели уже куча ошибок по нормализации.
« Последнее редактирование: Июня 02, 2016, 12:32:58 от Uncle_V »

Оффлайн Sata Автор темы

  • Ветеран форума
  • ******
  • Сообщений: 5195
  • Пиво
Re: PL/SQL, Oracle, IT
« Ответ #24 : Июня 02, 2016, 15:00:08 »
Вот этот раздел доки курим

http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/collections.htm#CIHIEBJC

И еще условие Bulk collect оператора Select, но это если лень в цикле заполнять.

... и добавил:

Он на объявления курсоров ругается, потому, что ищет таблицу в базе, а не переменную в разделе декларации.

... и добавил:

Если надо заполнить коллекцию из базы, то это делается так:

PROCEDURE process_all_rows
IS
   TYPE employees_aat
   IS TABLE OF employees%ROWTYPE
      INDEX BY PLS_INTEGER;
   l_employees employees_aat;
BEGIN
   SELECT *
   BULK COLLECT INTO l_employees
      FROM employees;
     
   FOR indx IN 1 .. l_employees.COUNT
   LOOP
       analyze_compensation
      (l_employees(indx));
   END LOOP;
END process_all_rows;

Без Rowtype можно обойтись, но в селекте должно стоять одно поле соответсвующего типа.


я вот вроде понял тут все. но это же нужна внешняя таблица, а с массивами тут никак это не выйдет?

... и добавил:

таблицу в декларации тоже создать же нельзя, как я понял, чтобы с нее тянуть

... и добавил:

Создал просто таблицу, запихнул туда имена секвенций, для лупа
Но все равно он не хочет, ну что это такое :pozor:
(нажмите чтобы показать/спрятать)





« Последнее редактирование: Июня 03, 2016, 09:50:48 от Sata »

Оффлайн SatanClaus

  • Опытный
  • ****
  • Сообщений: 696
Re: PL/SQL, Oracle, IT
« Ответ #25 : Июня 03, 2016, 11:55:46 »
SatanClaus, это довольно сложный путь, и в данном случае не оправданный. Я сам объектными типами пользуюсь в основном только когда мне надо передавать коллекции параметров при вызове процедур через динамический PL/SQL - диспетчеры всякого рода.

... и добавил:

Тут скорее дилемма такая, что приложенный код содержит "споры" CRM-системы, но трудоемкость всей задачи автором, вероятно, недооценивается. Поэтому в самой ER-модели уже куча ошибок по нормализации.
Согласен, что упомянутый подход тут не нужен. Я просто написал как можно реализовать запрос из массива.

Sata, если есть plsql массив, обрабатывай его в цикле (loop) или по индексу. Курсор не нужен.
Если у тебя данные в таблицах, используй запросы/курсоры.
Запрос на последнем скриншоте что должен делать (где подчеркнуто)?

Конструкция с неявным курсором for i in (query) loop тут очень странная. Цикл отработает столько раз, сколько результатов вернет курсор. Функция каунт вернет один результат (6). А главное, почему идет обращение к полю таблицы в фром? Фром - таблица.

Оффлайн Sata Автор темы

  • Ветеран форума
  • ******
  • Сообщений: 5195
  • Пиво
Re: PL/SQL, Oracle, IT
« Ответ #26 : Июня 03, 2016, 12:00:37 »
SatanClaus, тут просто луп создания секвенции для PK таблиц.
и хотел сделать один криейт в лупе, а названия секвенций он брал бы из массива, (но пока это не массив, а таблица, из массива не хочет) и отработает, по идее, столько раз сколько там названий, следовательно нужное количество раз

... и добавил:

изменил, тк на скрине это неправильно написано

 for cur in (select count(indx_pk_ar) from mssvs)
        loop

но сейчас говорит, что

indx_pk_crsr(i)

такой функции нет
« Последнее редактирование: Июня 03, 2016, 12:04:18 от Sata »

Оффлайн SatanClaus

  • Опытный
  • ****
  • Сообщений: 696
Re: PL/SQL, Oracle, IT
« Ответ #27 : Июня 03, 2016, 12:15:07 »
Тогда:

for rec in (select * from mssvs) loop
  do_smth(rec.indx_pk_arr);
end loop;

у тебя путаница. "For rec" - это не индекс массива. В rec читается выборка полей указанная в селект части. В нашем случае - все. Далее ты обращаешься к полям через рекорд.
Т.е. у тебя есть таблица с 6 записями.
for rec in (select * from mssvs) loop
отработает 6 раз ибо нет условия в запросе. В переменную rec 6 раз запишется строка таблицы. Внутри лупа можно обратиться к полю через переменную.

Оффлайн Sata Автор темы

  • Ветеран форума
  • ******
  • Сообщений: 5195
  • Пиво
Re: PL/SQL, Oracle, IT
« Ответ #28 : Июня 03, 2016, 12:27:43 »
Внутри лупа можно обратиться к полю через переменную.
ну это будет то же самое что обратиться к массиву с этими записями?)

... и добавил:

indx_pk_arr не задекларирован говорит. пистец какойт, я все задекларировал
« Последнее редактирование: Июня 03, 2016, 12:42:00 от Sata »

Оффлайн SatanClaus

  • Опытный
  • ****
  • Сообщений: 696
Re: PL/SQL, Oracle, IT
« Ответ #29 : Июня 03, 2016, 12:53:37 »
ну это будет то же самое что обратиться к массиву с этими записями?)
Ну да. Можно и так и так. Можешь считать данные из таблицы в массив и пройтись по массиву. Вариант с неявным курсором просто меньше места в коде занимает.
В твоем изначальном коде была ошибка, что ты пытался соединить массив с курсором. В массив можно считать данные как select into, но не select. Тебе АнклВ уже писал.

Приложи последний код. Я на митинг, потом гляну.