Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Первая процедура / 15 сообщений из 15, страница 1 из 1
30.05.2018, 15:49
    #39652628
GroMoZeKazzz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первая процедура
Доброго времени суток!
Пока разработчики перегружены, процедуры приходится пробовать писать самому.
Необходима была процедура для записи результата в лог-таблицу. Покурил интернеты, набросал
процедуру[SRC
PLSQL]CREATE OR REPLACE PACKAGE pkg_log IS
PROCEDURE p_log_write(SysId p_log.sysid%TYPE,
SysNum p_log.sysnum%TYPE,
Dtime p_log.dtime%TYPE,
icount p_log.icount%TYPE,
istate p_log.istate%TYPE,
icall p_log.icall%TYPE,
ddate p_log.idate%TYPE,
res p_log.result%TYPE) as
pragma autonomous_transaction;

begin
insert into p_log
(SysId, SysNum, Dtime, icount, istate, icall, ddate, res)
values
(SysId, SysNum, Dtime, icount, istate, icall, sysdate, res);
commit;
end p_log_write;
END pkg_log;[/SRC]

При компиляции валятся ошибки:
Error: PLS-00103: Encountered the symbol "PRAGMA" when expecting one of the following: language
Line: 10
Text: pragma autonomous_transaction;
и
ругается на последнюю строку пакета
Error: PLS-00103: Encountered the symbol "PKG_LOG" when expecting one of the following: ;
Line: 19
Text: END pkg_log;

В чем проблема? Руки не из того места?
...
Рейтинг: 0 / 0
30.05.2018, 15:52
    #39652631
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первая процедура
GroMoZeKazzz Руки не из того места?
Да.
В package размещают декларацию.
Реализация в package body.
...
Рейтинг: 0 / 0
30.05.2018, 16:05
    #39652646
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первая процедура
GroMoZeKazzz,

Не называйте переменные теми-же именами что и поля в таблице. Это потенциальный выстрел в ногу.
...
Рейтинг: 0 / 0
30.05.2018, 16:07
    #39652651
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первая процедура
MaximaXXLНе называйте переменные теми-же именами что и поля в таблице. Это потенциальный выстрел в ногу.
Не потенциальный.
Вполне себе реальный и прицельный.
...
Рейтинг: 0 / 0
30.05.2018, 16:26
    #39652671
GroMoZeKazzz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первая процедура
andrey_anonymous , так лучше (не в плане одинаковости названий полей и переменных)?
?CREATE OR REPLACE PACKAGE pkg_log IS
PROCEDURE p_log_write(SysId p_log.sysid%TYPE,
SysNum p_log.sysnum%TYPE,
Dtime p_log.dtime%TYPE,
icount p_log.icount%TYPE,
istate p_log.istate%TYPE,
icall p_log.icall%TYPE,
ddate p_log.idate%TYPE,
res p_log.result%TYPE);
end pkg_log;

CREATE OR REPLACE PACKAGE BODY pkg_log IS
PROCEDURE p_log_write(SysId p_log.sysid%TYPE,
SysNum p_log.sysnum%TYPE,
Dtime p_log.dtime%TYPE,
icount p_log.icount%TYPE,
istate p_log.istate%TYPE,
icall p_log.icall%TYPE,
ddate p_log.idate%TYPE,
res p_log.result%TYPE) as
pragma autonomous_transaction;

begin
insert into p_log
(SysId, SysNum, Dtime, icount, istate, icall, ddate, res)
values
(SysId, SysNum, Dtime, icount, istate, icall, sysdate, res);
commit;
end p_log_write;
end pkg_log;
...
Рейтинг: 0 / 0
30.05.2018, 16:32
    #39652678
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первая процедура
andrey_anonymousприцельный.Не. Прицельный выстрел в тех, кто наивно полагается на незыблемость преикса П_, это вьюха dba_cube_dependencies.
...
Рейтинг: 0 / 0
30.05.2018, 16:43
    #39652683
GroMoZeKazzz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первая процедура
-2- , буду в курсе за префиес П. Но от этого легче не станет - таблица называется p_log, названа так давно и не мной
...
Рейтинг: 0 / 0
30.05.2018, 16:49
    #39652684
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первая процедура
GroMoZeKazzz -2- , буду в курсе за префиес П. Но от этого легче не станет - таблица называется p_log, названа так давно и не мной
Не то.
...
Рейтинг: 0 / 0
30.05.2018, 17:00
    #39652691
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первая процедура
GroMoZeKazzz,

параметры без p_
...
values
(PKG_LOG.SysId, PKG_LOG.SysNum, PKG_LOG.Dtime, PKG_LOG.icount, PKG_LOG.istate, PKG_LOG.icall, sysdate, PKG_LOG.res);
...

параметры c p_
...
values
(PKG_LOG.p_SysId, PKG_LOG.p_SysNum, PKG_LOG.p_Dtime, PKG_LOG.p_icount, PKG_LOG.p_istate, PKG_LOG.p_icall, sysdate, PKG_LOG.p_res);
...


.....
stax
...
Рейтинг: 0 / 0
30.05.2018, 17:06
    #39652697
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первая процедура
Код: 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.
> create table dropme_t(id number, val varchar2(100 char))

table DROPME_T created.

> create or replace procedure dropme_p_ins(id dropme_t.id%type, val dropme_t.val%type) as
begin
  insert into dropme_t(id, val) values (id, val);
end;

PROCEDURE DROPME_P_INS compiled

> exec dropme_p_ins(1,'ins1');dropme_p_ins(2,'ins2')
anonymous block completed

> select * from dropme_t
        ID VAL                                                                                                
---------- ----------------------------------------------------------------------------------------------------
         1 ins1                                                                                                 
         2 ins2                                                                                                 

-- So far so good, but...

> create or replace procedure dropme_p_upd(id dropme_t.id%type, val dropme_t.val%type) as
begin
  update dropme_t set val=val where id=id;
end;

PROCEDURE DROPME_P_UPD compiled


> exec dropme_p_upd(1,'upd')
anonymous block completed

> select * from dropme_t
        ID VAL                                                                                                
---------- ----------------------------------------------------------------------------------------------------
         1 ins1                                                                                                 
         2 ins2                                                                                                 

-- Казалось бы, ничего не произошло... как бы не так - ВСЕ строки заапдейтились сами на себя 
-- Проверку этого незамысловатого факта оставлю на самостоятельное изучение :)


--Solution1: prefixes
> create or replace procedure dropme_p_upd(i_id in dropme_t.id%type, i_val in dropme_t.val%type) as
begin
  update dropme_t set val=i_val where id=i_id;
end;

PROCEDURE DROPME_P_UPD compiled

> exec dropme_p_upd(1,'Sol1')
anonymous block completed

> select * from dropme_t
        ID VAL                                                                                                
---------- ----------------------------------------------------------------------------------------------------
         1 Sol1                                                                                                 
         2 ins2                                                                                                 

-- Solution2: явное разыменование переменной именем pl/sql блока
> create or replace procedure dropme_p_upd(id in dropme_t.id%type, val in dropme_t.val%type) as
begin
  update dropme_t set val=dropme_p_upd.val where id=dropme_p_upd.id;
end;

PROCEDURE DROPME_P_UPD compiled

> exec dropme_p_upd(2,'Sol2')

anonymous block completed

> select * from dropme_t
        ID VAL                                                                                                
---------- ----------------------------------------------------------------------------------------------------
         1 Sol1                                                                                                 
         2 Sol2                                                                                                 
...
Рейтинг: 0 / 0
30.05.2018, 17:32
    #39652718
GroMoZeKazzz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первая процедура
andrey_anonymous , мне надо через автономную транзакцию - текущий вариант логирования не работает. Причина простая - сначала идет запись в лог, после проверка на результат, который пришел из вне, если там не 0, то rollback и никакой записи в лог.
...
Рейтинг: 0 / 0
30.05.2018, 17:33
    #39652721
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первая процедура
GroMoZeKazzz andrey_anonymous , мне надо через автономную транзакцию
И в чем сложность?
...
Рейтинг: 0 / 0
30.05.2018, 18:34
    #39652771
GroMoZeKazzz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первая процедура
andrey_anonymous , сложность в том, что я не разработчик. Есть задача, хочу решить ее сам, курю интернеты и форумы и пытаюсь что-то запилить. Такое решение 21454632 тоже не взлетает.
...
Рейтинг: 0 / 0
30.05.2018, 18:48
    #39652780
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первая процедура
GroMoZeKazzzТакое решение 21454632 тоже не взлетает.
А где прагма в декларации-то?
...
Рейтинг: 0 / 0
30.05.2018, 19:39
    #39652798
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первая процедура
andrey_anonymousGroMoZeKazzzТакое решение 21454632 тоже не взлетает.
А где прагма в декларации-то?
Блин, форматируте пожалуйста тегом SRC - нифига ж не видно...
И это... синтаксические ошибки можно и без форума выловить:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
...
PROCEDURE p_log_write(SysId p_log.sysid%TYPE,
...
res p_log.result%TYPE);
...
begin
insert into p_log
(SysId, SysNum, Dtime, icount, istate, icall, ddate, res) -- либо крестик снимите, либо трусы оденьте. Как поле в таблице называется?
values
(SysId, SysNum, Dtime, icount, istate, icall, sysdate, res);
...
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Первая процедура / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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