CftClub.ru
Клуб специалистов ЦФТ-Банк

Маленькие ошибки с большими ... - про «массивы и процед

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
oradba81
Гость



СообщениеЧт Дек 09, 2010 18:52   Маленькие ошибки с большими ... - про «массивы и процед Ответить с цитатой
Полезность: Нет оценки
цикл тем о том "КАК НЕ надо Делать".

в контексте:
http://www.cftclub.ru/viewtopic.php?t=1752

про "массивы и процедуры"

Код:
create table z#acc
(
  id number
  , c_main_number varchar2(20)
  , c_client_name_id number
  , c_date_open date
  , c_date_close date
  , c_user_open_id number
  , c_user_close_id number
  , c_branch_id number
  , c_depart_id number
  , c_saldo number
  , c_saldo_rur number
  , c_currency_id number
);

create or replace package body pack_acc is
 
-- запись
type rec is record
(
  main_number ::[acc].[main_number]%type
  , client_name_id  ::[acc].[client_name_id]%type
  , date_open  ::[acc].[date_open]%type
  , date_close  ::[acc].[date_close]%type
  , user_open_id  ::[acc].[user_open_id]%type
  , user_close_id  ::[acc].[user_close_id]%type
  , branch_id  ::[acc].[branch_id]%type
  , depart_id  ::[acc].[depart_id]%type
  , saldo  ::[acc].[saldo]%type
  , saldo_rur  ::[acc].[saldo_rur]%type
  , currency_id  ::[acc].[currency_id]%type
);

-- таблица
type tab is table of rec;

-- Процедура выборки строки
procedure get_row(vnumb varchar2, r in out rec, indx out number) 
is 
begin
  select n
  (
    n.[main_number]
  , n.[client_name_id]
  , n.[date_open]
  , n.[date_close]
  , n.[user_open_id]
  , n.[user_close_id]
  , n.[branch_id]
  , n.[depart_id]
  , n.[saldo]
  , n.[saldo_rur]
  , n.[currency_id]   
  ) in ::[acc]
  where n.[main_number] = vnumb
  into rec;
 
  indx:=tab.count;
  tab(indx):=rec;
end;

-- Процедура Update строки
procedure set_row(r rec)
is
begin
  update n
  (
    n.[main_number] == r.main_number
  , n.[client_name_id] == r.client_name_id
  , n.[date_open] == r.date_open
  , n.[date_close] == r.date_close
  , n.[user_open_id] == r.user_open_id
  , n.[user_close_id] == r.user_close_id
  , n.[branch_id] == r.branch_id
  , n.[depart_id] == r.depart_id
  , n.[saldo] == r.saldo
  , n.[saldo_rur] == r.saldo_rur
  , n.[currency_id]   == r.currency_id]
  ) in ::[acc] all
  where n%id = nid;
end;

--А вот теперь: ...
procedure Hard
is
  tr rec;
  n number;
begin
  for
  (
    select c
    (
      c.[main_number]: numb
    ) in :[acc]
    where c.[date_open] = pdt
  )
  loop
    get_row(c.[numb], tr, n);
    tr.[branch_id]:=pBranch;
    tr.[date_close]:=pDate;
    set_row(tr);
  end loop;
end;

end;


All rights ® oradba81@mail.ru
Admin
Site Admin


Вступление в Клуб: 09.06.2007
СообщениеЧт Дек 09, 2010 23:00    Ответить с цитатой
Полезность: Нет оценки
Здесь вообще не понял, на что намёк.

Очень дурацкий способ решить простую задачу.

Но зачем городить такой масштабный код для иллюстрации дурацкого способа усложнить жизнь? Или изюминка в другом?
oradba81
Гость



СообщениеПт Дек 10, 2010 11:05    Ответить с цитатой
Полезность: Нет оценки
Admin пишет:
Здесь вообще не понял, на что намёк.

Очень дурацкий способ решить простую задачу.

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


А теперь представь что объявление ассоциативного массива вынесено в отдельную операцию или библиотеку.
Процедуры set_row и get_row вынесены тоже в отдельный пакет.
А затем во всех остальных операциях начинают их активно использовать.
Ничего не напоминает?
Alexsey
Эксперт


Вступление в Клуб: 06.09.2007
СообщениеПт Дек 10, 2010 14:50    Ответить с цитатой
Полезность: Нет оценки
oradba81 пишет:
Admin пишет:
Здесь вообще не понял, на что намёк.

Очень дурацкий способ решить простую задачу.

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


А теперь представь что объявление ассоциативного массива вынесено в отдельную операцию или библиотеку.
Процедуры set_row и get_row вынесены тоже в отдельный пакет.
А затем во всех остальных операциях начинают их активно использовать.
Ничего не напоминает?


вот ты мне объясни популярно, нафига мне прописывать полный путь к локальной процедуре или функции, если она у меня работает в рамках одной библиотеки, пакета, операции?

А если оно будет вынесено в отдельный пакет, так они там и будут объявлены как глобальные, чтобы к ним можно было обратиться
_________________
всегда есть как минимум 2 выхода
oradba81
Гость



СообщениеПт Дек 10, 2010 15:02    Ответить с цитатой
Полезность: Нет оценки
Alexsey пишет:

вот ты мне объясни популярно, нафига мне прописывать полный путь к локальной процедуре или функции, если ОНА у МЕНЯработает в рамках одной библиотеки, пакета, операции?


Ну это же у тебя в ТВОЕМ коде см [quote выше] такое происходит Smile
За него отвечать не могу Smile

Да и кто говорил про полный путь? Это откуда взял? Smile


Alexsey пишет:
А если оно будет вынесено в отдельный пакет, так они там и будут объявлены как глобальные, чтобы к ним можно было обратиться


Ежу понятно что без спецификации доступа не будет
oradba81
Гость



СообщениеПн Дек 13, 2010 12:41    Ответить с цитатой
Полезность: Нет оценки
Подсказка:
см. Подсказка "в яблочко" в топике:
http://www.cftclub.ru/viewtopic.php?t=1752
oradba81
Гость



СообщениеПн Дек 13, 2010 16:58    Ответить с цитатой
Полезность: Нет оценки
Две темы были связаны и зная ответ можно было решить обе легко

Прошла неделя активности нет, итак привожу ответ:

Кусок кода:

Цитата:

-- запись
type rec is record
(
main_number ::[acc].[main_number]%type
, client_name_id ::[acc].[client_name_id]%type
, date_open ::[acc].[date_open]%type
, date_close ::[acc].[date_close]%type
, user_open_id ::[acc].[user_open_id]%type
, user_close_id ::[acc].[user_close_id]%type
, branch_id ::[acc].[branch_id]%type
, depart_id ::[acc].[depart_id]%type
, saldo ::[acc].[saldo]%type
, saldo_rur ::[acc].[saldo_rur]%type
, currency_id ::[acc].[currency_id]%type
);

-- таблица
type tab is table of rec;


Преобразуется в:
Цитата:

type tab is table of z#acc%rowtype


Однако это не самый лучший путь, потому что кк далее видно запись используется в процедурах.

Более красивый вариант это кешировать только ID

Цитата:

type tab is table of number


Ну вот теперь чувствуется начнется всякий флуд типа это давно извесно и т.п. , смех всякий и прочее. А главное что за неделю ответа правильного не было. Зато было много хамства, насчет моего обращения на "Ты". Вот иммено поэтому я закрыл тему про обучение и не давал сразу ответов на вопросы - чтобы думали и писали свои ответы. Окрестили троллем. Ну да ладно. Так что давайте ждемс.... издевки в студию

P/S>
Мы живем на отцовской земле
Внуки сварога, славные дети
dnk_dz
Эксперт


Вступление в Клуб: 19.09.2007
СообщениеСб Дек 18, 2010 00:44   Re: Маленькие ошибки с большими ... - про «массивы и пр Ответить с цитатой
Полезность: Нет оценки
oradba81 пишет:
цикл тем о том "КАК НЕ надо Делать".


Бред...
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru