Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Что улучшить или изменить в процедуре? / 10 сообщений из 10, страница 1 из 1
18.12.2019, 13:40
    #39904738
takini23
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что улучшить или изменить в процедуре?
Добрый день!
Есть процедура,возможно кто-то сможет сказать какие ошибки допустил?

По первости вижу что
1.Нет Commit
2.Нет обработки Exception
3.Для case я бы добавил условие Else
4.Почему-то не используются pID_REPORTPERIOD и pID_PROVIDER,хотя они объявлены ?



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
create or replace procedure saveAutoSales(pID_REPORTPERIOD in number,
                        pID_PROVIDER     in number,
                        Cur_at          in sys_refcursor,
                        pAuto_id         in number,
                        pN_ROW_NUMBER    in out number) is
  i number;
  type t_col_auto_rec is record(
    v_number           VARCHAR2(70),
    v_number_i         VARCHAR2(70),
    v_number_k         VARCHAR2(70),
    v_number_ik        VARCHAR2(70),
    v_client_name      VARCHAR2(100),
    v_VIN          VARCHAR2(70),
    v_agent_name       VARCHAR2(70),
    v_agent_inn_kpp    VARCHAR2(70),
    v_doc_number       VARCHAR2(70),
    v_currency         VARCHAR2(10),
    n_row_num          NUMBER(9),
    id_repperiod       NUMBER(9),
    id_provider        NUMBER(9),
    dt_period_stop     TIMESTAMP(0) WITH LOCAL TIME ZONE,
    id_contract_inst   NUMBER(9),
    v_n_sf_type        VARCHAR2(3),
    n_summa_gross_curr NUMBER,
    n_summa_gross_rub  NUMBER,
    n_summa_net_1      NUMBER,
    n_summa_net_2      NUMBER,
    n_summa_net_3      NUMBER,
    n_tax_summa_1      NUMBER,
    n_tax_summa_2      NUMBER,
    n_summa_taxfree    NUMBER,
    n_tax_rate         number,
    id_invoice_inst    NUMBER(9),
    id_reportperiod    NUMBER(9));
  type t_col_auto is table of t_col_auto_rec;
  col_auto t_col_auto;

begin
  i := pN_ROW_NUMBER;

  loop
    fetch Cur_at bulk collect
      into col_auto limit 500;
    for j in 1 .. col_auto.count loop
      i := i + 1;
      CASE pAUTO_ID

      --запись в основную книгу продаж
        WHEN pack_invoice.AUTO_SALE_BASIC then

          insert into fw_AUTO_sales_main
            ( v_n_sf_type,
             v_number,
             v_number_i,
             v_number_k,
             v_number_ik,
             v_client_name,
             v_VIN,
             v_agent_name,
             v_agent_inn_kpp,
             v_doc_number,
             v_currency,
             n_row_num,
             id_repperiod,
             id_provider,
             dt_period_stop,
             id_contract_inst,
             n_summa_gross_curr,
             n_summa_gross_rub,
             n_summa_net_1,
             n_summa_net_2,
             n_summa_net_3,
             n_tax_summa_1,
             n_tax_summa_2,
             n_summa_taxfree,
             id_invoice_inst,
             id_reportperiod,
             n_tax_rate)
          values
            (i,
             col_auto(j).id_repperiod,
             col_auto(j).id_provider,
             col_auto(j).dt_period_stop,
             col_auto(j).id_contract_inst,
             col_auto(j).v_n_sf_type,
             col_auto(j).v_number,
             col_auto(j).v_number_i,
             col_auto(j).v_number_k,
             col_auto(j).v_number_ik,
             col_auto(j).v_client_name,
             col_auto(j).v_VIN,
             col_auto(j).v_agent_name,
             col_auto(j).v_agent_inn_kpp,
             col_auto(j).v_doc_number,
             col_auto(j).v_currency,
             col_auto(j).n_summa_gross_curr,
             col_auto(j).n_summa_gross_rub,
             col_auto(j).n_summa_net_1,
             col_auto(j).n_summa_net_2,
             col_auto(j).n_summa_net_3,
             col_auto(j).n_tax_summa_1,
             col_auto(j).n_tax_summa_2,
             col_auto(j).n_summa_taxfree,
             col_auto(j).id_invoice_inst,
             col_auto(j).id_reportperiod,
             col_auto(j).n_tax_rate);
          --запись в дополнительную книгу продаж
        WHEN pack_invoice.AUTO_TYPE_SALE_ADDIT then
          insert into fw_AUTO_sales_add
            (n_row_num,
             id_repperiod,
             id_provider,
             dt_period_stop,
             id_contract_inst,
             v_n_sf_type,
             v_number,
             v_number_i,
             v_number_k,
             v_number_ik,
             v_client_name,
             v_VIN,
             v_agent_name,
             v_agent_inn_kpp,
             v_doc_number,
             v_currency,
             n_summa_gross_curr,
             n_summa_gross_rub,
             n_summa_net_1,
             n_summa_net_2,
             n_summa_net_3,
             n_tax_summa_1,
             n_tax_summa_2,
             n_summa_taxfree,
             id_invoice_inst,
             id_reportperiod,
             n_tax_rate)
          values
            (i,
             col_auto(j).id_repperiod,
             col_auto(j).id_provider,
             col_auto(j).dt_period_stop,
             col_auto(j).id_contract_inst,
             col_auto(j).v_n_sf_type,
             col_auto(j).v_number,
             col_auto(j).v_number_i,
             col_auto(j).v_number_k,
             col_auto(j).v_number_ik,
             col_auto(j).v_client_name,
             col_auto(j).v_VIN,
             col_auto(j).v_agent_name,
             col_auto(j).v_agent_inn_kpp,
             col_auto(j).v_doc_number,
             col_auto(j).v_currency,
             col_auto(j).n_summa_gross_curr,
             col_auto(j).n_summa_gross_rub,
             col_auto(j).n_summa_net_1,
             col_auto(j).n_summa_net_2,
             col_auto(j).n_summa_net_3,
             col_auto(j).n_tax_summa_1,
             col_auto(j).n_tax_summa_2,
             col_auto(j).n_summa_taxfree,
             col_auto(j).id_invoice_inst,
             col_auto(j).id_reportperiod,
             col_auto(j).n_tax_rate);
      END CASE;
    end loop;
    exit when Cur_at%notfound;
  end loop;

  pN_ROW_NUMBER := i;
end saveAutoSales ;
...
Рейтинг: 0 / 0
18.12.2019, 13:47
    #39904752
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что улучшить или изменить в процедуре?
takini23Есть процедура,возможно кто-то сможет сказать какие ошибки допустил?

Первая ошибка в том, что ты создал процедуру там, где можно было обойтись одним запросом.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.12.2019, 13:57
    #39904766
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что улучшить или изменить в процедуре?
takini23
1.Нет Commit
2.Нет обработки Exception
3.Для case я бы добавил условие Else
Подобная "инициатива" только вредна.
...
Рейтинг: 0 / 0
18.12.2019, 14:33
    #39904794
takini23
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что улучшить или изменить в процедуре?
Elic,по п.3 согласен он не нужен,в случае с null оператор неявно выдаст case_nof_found

Но чем плохи п.1 и п.2 ?
...
Рейтинг: 0 / 0
18.12.2019, 14:37
    #39904798
takini23
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что улучшить или изменить в процедуре?
Dimitry Sibiryakov,
Не совсем понял как это можно сделать
т.е
:
insert into fw_AUTO_sales_main (select * from Cur_at where pAuto_id = pack_invoice.AUTO_SALE_BASIC )
...
Рейтинг: 0 / 0
18.12.2019, 14:47
    #39904808
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что улучшить или изменить в процедуре?
takini23
Но чем плохи п.1
Границы транзакции определяет вызывающий.
...
Рейтинг: 0 / 0
18.12.2019, 14:49
    #39904813
oragraf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что улучшить или изменить в процедуре?
takini23
Но чем плохи п.1 и п.2 ?
Без постановки/понимания - зачем? они бессмысленны и вредны.
...
Рейтинг: 0 / 0
18.12.2019, 14:50
    #39904815
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что улучшить или изменить в процедуре?
takini23,

читаете bulk-ом, почему б не вставить forall insert?

.....
stax
...
Рейтинг: 0 / 0
18.12.2019, 15:07
    #39904837
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что улучшить или изменить в процедуре?
Вместо курсорной переменной и цикла по ней влепить multitable insert.
...
Рейтинг: 0 / 0
18.12.2019, 16:05
    #39904904
takini23
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что улучшить или изменить в процедуре?
Спасибо всем за помощь!
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Что улучшить или изменить в процедуре? / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]