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

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

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

  • Ветеран форума
  • ******
  • Сообщений: 5195
  • Пиво
PL/SQL, Oracle, IT
« : Июня 01, 2016, 15:11:29 »
Товарищи однополчане!
Ругается, мол таблицы нет, но переменная по типу объявлена(
В чем я прогляделся?
Спасибо.

Оффлайн Mishok

  • Эксперт
  • *****
  • Сообщений: 2470
  • ♠ ♣ ♥ ♦
Re: PL/SQL, Oracle, IT
« Ответ #1 : Июня 01, 2016, 15:23:08 »
Sata, я c pl не работал, только с transact.  ???
таблица mdr_arr есть в итоге? не пустая?

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

  • Ветеран форума
  • ******
  • Сообщений: 5195
  • Пиво
Re: PL/SQL, Oracle, IT
« Ответ #2 : Июня 01, 2016, 15:24:25 »
Sata, я c pl не работал, только с transact.  ???
таблица mdr_arr есть в итоге? не пустая?
ну переменная типа "таблица оф варчар2" раз объявлена - то пустая лежит уже, и он может на нее ссылаться
потом ниже в бегине она заполняется значениями

Оффлайн Mishok

  • Эксперт
  • *****
  • Сообщений: 2470
  • ♠ ♣ ♥ ♦
Re: PL/SQL, Oracle, IT
« Ответ #3 : Июня 01, 2016, 15:36:00 »
Sata, Я не совсем в теме, но чёто кажется, что сперва надо таблицы заполнить, а потом курсоры делать. ???

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

  • Ветеран форума
  • ******
  • Сообщений: 5195
  • Пиво
Re: PL/SQL, Oracle, IT
« Ответ #4 : Июня 01, 2016, 15:37:12 »
Sata, Я не совсем в теме, но чёто кажется, что сперва надо таблицы заполнить, а потом курсоры делать. ???
а таблицы заполнять в диклеере он вообще не дает

Оффлайн Uncle_V

  • Эксперт
  • *****
  • Сообщений: 1095
Re: PL/SQL, Oracle, IT
« Ответ #5 : Июня 01, 2016, 15:38:33 »
Что-то непонятное, может спец.символ в тексте. У меня все работает.


declare
  type arr_type is table of varchar2(128) index by binary_integer;
  mdl_arr arr_type;
begin
  mdl_arr(1) := 'Все работает';
  raise_application_error (-20001, mdl_arr(1));
end;





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

Из этих таблиц селекты делать нельзя. К ним можно обращаться только в цикле и по индексу, как описано выше. Это не таблицы, это коллекции.
« Последнее редактирование: Июня 01, 2016, 15:41:28 от Uncle_V »

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

  • Ветеран форума
  • ******
  • Сообщений: 5195
  • Пиво
Re: PL/SQL, Oracle, IT
« Ответ #6 : Июня 01, 2016, 15:43:42 »
Что-то непонятное, может спец.символ в тексте. У меня все работает.


declare
  type arr_type is table of varchar2(128) index by binary_integer;
  mdl_arr arr_type;
begin
  mdl_arr(1) := 'Все работает';
  raise_application_error (-20001, mdl_arr(1));
end;





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

Из этих таблиц селекты делать нельзя. К ним можно обращаться только в цикле и по индексу, как описано выше. Это не таблицы, это коллекции.
хм. да вроде нет спец. символов((
да, далее в создании секвенции и инсертах я к ним и обращаюсь.

Оффлайн Uncle_V

  • Эксперт
  • *****
  • Сообщений: 1095
Re: PL/SQL, Oracle, IT
« Ответ #7 : Июня 01, 2016, 15:45:20 »
Вот этот раздел доки курим

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 можно обойтись, но в селекте должно стоять одно поле соответсвующего типа.

« Последнее редактирование: Июня 01, 2016, 15:50:10 от Uncle_V »

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

  • Ветеран форума
  • ******
  • Сообщений: 5195
  • Пиво
Re: PL/SQL, Oracle, IT
« Ответ #8 : Июня 01, 2016, 15:52:19 »
Uncle_V, то есть для каждого инсерта с курсора мне нужно создать такую процедуру?

Оффлайн Uncle_V

  • Эксперт
  • *****
  • Сообщений: 1095
Re: PL/SQL, Oracle, IT
« Ответ #9 : Июня 01, 2016, 15:53:59 »
Sata, объясни задачу.

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

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

Оффлайн Uncle_V

  • Эксперт
  • *****
  • Сообщений: 1095
Re: PL/SQL, Oracle, IT
« Ответ #11 : Июня 01, 2016, 16:10:14 »
Лабораторная по программированию?

я в таких случаях объявляю переменную типа Rowtype таблицы в которую буду вставлять записи, затем организую обычный цикл For по Select-у, заполняю поля переменной типа Rowtype в зависимости от условий и делаю

Insert into [заполняемая таблица] values [переменная Rowtype]




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

  • Ветеран форума
  • ******
  • Сообщений: 5195
  • Пиво
Re: PL/SQL, Oracle, IT
« Ответ #12 : Июня 01, 2016, 16:18:58 »
Лабораторная по программированию?

я в таких случаях объявляю переменную типа Rowtype таблицы в которую буду вставлять записи, затем организую обычный цикл For по Select-у, заполняю поля переменной типа Rowtype в зависимости от условий и делаю

Insert into [заполняемая таблица] values [переменная Rowtype]




нет, на работе нужно, а схему так, от фонаря - гитарки, заводы, мастера, заказчики
а в инсерте ссылка на роутайп?

Оффлайн Uncle_V

  • Эксперт
  • *****
  • Сообщений: 1095
Re: PL/SQL, Oracle, IT
« Ответ #13 : Июня 01, 2016, 16:50:05 »
а в инсерте ссылка на роутайп?

Да, это удобная конструкция, чтобы поля не перечислять, а сам переменная Rowtype это рекорд, который заведомо совпадает со структурой таблицы - удобный "контейнер" для данных. Тем более, что если в таблицу добавить поле, то после перекомпиляции процедуры или пакета это поле в роутайпе тоже появится - не надо будет делать объявление переменных в куче мест.

Так что цикл по селекту, заполняй роутайп и инсерт. Более того, если придерживаться стиля программирования, то переменную типа роутайп можно передавать между несколкими процедурами/функциями как in out параметр и каждая из них будет заполнять только поля из конкретного смыслового источника длинных, если их несколько и в которую вместе с роутайпом будут передаваться входные параметры, имеющие смысл для этих источников данных (таблиц).

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

  • Ветеран форума
  • ******
  • Сообщений: 5195
  • Пиво
Re: PL/SQL, Oracle, IT
« Ответ #14 : Июня 01, 2016, 16:51:38 »
Uncle_V, спасибо большое) завтра буду пробовать)