powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / помогите поймать баг
5 сообщений из 5, страница 1 из 1
помогите поймать баг
    #34493567
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть таблица
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE TABLE "net_dev"."dev_list" (
  "net_dev_id" BIGSERIAL, 
  "obj_id" BIGINT, 
  "as_active" BOOLEAN DEFAULT true, 
  "mac_name" MACADDR DEFAULT '00:00:00:00:00:00'::macaddr, 
  "view_type_id" BIGINT, 
  "x1" INTEGER DEFAULT  0 , 
  "y1" INTEGER DEFAULT  0 , 
  "x2" INTEGER DEFAULT  0 , 
  "y2" INTEGER DEFAULT  0 , 
  "dev_ip" VARCHAR( 16 ) DEFAULT '0.0.0.0'::character varying, 
  "dev_ip_mask" VARCHAR( 16 ) DEFAULT '255.255.255.0'::character varying, 
  "dev_alias" VARCHAR( 255 ), 
  CONSTRAINT "dev_list_pkey" PRIMARY KEY("net_dev_id"), 
  CONSTRAINT "dev_list_fk" FOREIGN KEY ("obj_id")
    REFERENCES "obj_tree"."objects"("obj_id")
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
    NOT DEFERRABLE
) WITHOUT OIDS;
есть функция для обновления этой таблички
Код: plaintext
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.
CREATE OR REPLACE FUNCTION "net_dev"."net_dev_update" (_net_dev_id integer, _obj_id bigint, _alias varchar, _as_active boolean, _mac varchar, _ip varchar, _mask varchar, _x integer, _y integer, _view_type_id integer) RETURNS integer AS
$body$
/* Òåëî íîâîé ôóíêöèè */
DECLARE result INTEGER;
DECLARE mac    macaddr;
BEGIN
     result := - 1 ;
     mac    := _mac::macaddr;

     /* âñòàâëÿåì ñåòåâîé îáúåêò */
     UPDATE net_dev.dev_list
     SET  obj_id       =  _obj_id,
          mac_name     =   mac,
          dev_IP       =  _ip,
          dev_IP_mask  =  _mask,
          dev_alias    =  _alias,
          as_active    =  _as_active,
          x1           =  _x,
          y1           =  _y,
          view_type_id = _view_type_id
     WHERE net_dev_id =  _net_dev_id;

     result :=_net_dev_id;
     return result;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY DEFINER;
в SQL редакторе выполняю код
Код: plaintext
1.
SELECT * FROM net_dev.net_dev_update(
 10 , 52 ,'depo',true,'12:12:12:12:12:12','0.0.0.0','0.0.0.0', 200 , 1100 , 1 );
выполняется, и данные отлично обновляются
на булдере пишу такое
Код: plaintext
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.
    TADODataSet *ds = DataModuleADO->ADODataSet1;
    if( ds->Active )ds->Close();
    ds->CommandText = "SELECT * FROM net_dev.net_dev_update("
                      " :net_dev_id, "
                      " :obj_id,     "
                      " :dev_alias,      "
                      " :as_active,  "
                      " :mac,        "
                      " :ip,         "
                      " :ip_mask,    "
                      " :x, :y, :view_type_id) AS F";

    ds->Parameters->ParamByName("net_dev_id"  )->DataType = ftInteger;
    ds->Parameters->ParamByName("obj_id"      )->DataType = ftInteger;
    ds->Parameters->ParamByName("dev_alias"   )->DataType = ftString;
    ds->Parameters->ParamByName("as_active"   )->DataType = ftBoolean;
    ds->Parameters->ParamByName("mac"         )->DataType = ftString ;
    ds->Parameters->ParamByName("ip"          )->DataType = ftString ;
    ds->Parameters->ParamByName("ip_mask"     )->DataType = ftString ;
    ds->Parameters->ParamByName("x"           )->DataType = ftInteger;
    ds->Parameters->ParamByName("y"           )->DataType = ftInteger;
    ds->Parameters->ParamByName("view_type_id")->DataType = ftInteger;

    ds->Parameters->ParamByName("net_dev_id"  )->Value = _net_dev_id;
    ds->Parameters->ParamByName("obj_id"      )->Value = _obj_id;
    ds->Parameters->ParamByName("dev_alias"   )->Value = _alias;
    ds->Parameters->ParamByName("as_active"   )->Value = _as_active;
    ds->Parameters->ParamByName("mac"         )->Value = _mac ;
    ds->Parameters->ParamByName("ip"          )->Value = _ip ;
    ds->Parameters->ParamByName("ip_mask"     )->Value = _ip_mask ;
    ds->Parameters->ParamByName("x"           )->Value = _x;
    ds->Parameters->ParamByName("y"           )->Value = _y;
    ds->Parameters->ParamByName("view_type_id")->Value = _view_type_id;
    ds->Open();
    net_dev_id = ds->FieldByName("F")->AsInteger;
    ds->Close();
проверяю дебагером - в переменных _net_dev_id..._alias... данные верные
Ошибок не вылетает, но обновления БД не происходит...
подскажите что я сделал не так?
...
Рейтинг: 0 / 0
помогите поймать баг
    #34494373
Serik Akhmetov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
TADODataSet
делает commit ?
...
Рейтинг: 0 / 0
помогите поймать баг
    #34494432
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет... честно говоря как-то не приходилось применять эту команду...
другие аналогичные функции работают нормально...
у меня и в предыдущем проекте аналогичный глюк был...
пришлось делать подстановкой данных (не параметрический запрос)
аля... "SELECT ..." + IntToStr(_obj_id)+" AND.... " так работало
...
Рейтинг: 0 / 0
помогите поймать баг
    #34495637
BlackDan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добавить RAISE LOG '_net_dev_id: %, _obj_id: %', _net_dev_id, _obj_id; в тело функции, исполнить её через билдер. посмотереть в логе, исполнилась ли функции. Если исполнилась, то проверить, правильные ли параметры ей были переданы.
+ проверить, действительно ли атрибут CALLED ON NULL INPUT у функции установлен

Код: plaintext
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.
CREATE OR REPLACE FUNCTION "net_dev"."net_dev_update" (_net_dev_id integer, _obj_id bigint, _alias varchar, _as_active boolean, _mac varchar, _ip varchar, _mask varchar, _x integer, _y integer, _view_type_id integer) RETURNS integer AS
$body$
/* Òåëî íîâîé ôóíêöèè */
DECLARE result INTEGER;
DECLARE mac    macaddr;
BEGIN
    RAISE LOG '_net_dev_id: %, _obj_id: %', _net_dev_id, _obj_id;
     result := - 1 ;
     mac    := _mac::macaddr;

     /* âñòàâëÿåì ñåòåâîé îáúåêò */
     UPDATE net_dev.dev_list
     SET  obj_id       =  _obj_id,
          mac_name     =   mac,
          dev_IP       =  _ip,
          dev_IP_mask  =  _mask,
          dev_alias    =  _alias,
          as_active    =  _as_active,
          x1           =  _x,
          y1           =  _y,
          view_type_id = _view_type_id
     WHERE net_dev_id =  _net_dev_id;

     result :=_net_dev_id;
     return result;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY DEFINER;
...
Рейтинг: 0 / 0
помогите поймать баг
    #34495744
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlackDan - вы просто волшебник!
проследил чего там передаётся...
похоже морда БД не те циферки (net_dev_id) передаёт, обновляются другие поля чем я проверяю :)
Огромное спасибо!
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / помогите поймать баг
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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