Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / помогите поймать баг / 5 сообщений из 5, страница 1 из 1
27.04.2007, 16:35
    #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
28.04.2007, 07:27
    #34494373
Serik Akhmetov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите поймать баг
Код: plaintext
TADODataSet
делает commit ?
...
Рейтинг: 0 / 0
28.04.2007, 08:44
    #34494432
Кифирчик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите поймать баг
нет... честно говоря как-то не приходилось применять эту команду...
другие аналогичные функции работают нормально...
у меня и в предыдущем проекте аналогичный глюк был...
пришлось делать подстановкой данных (не параметрический запрос)
аля... "SELECT ..." + IntToStr(_obj_id)+" AND.... " так работало
...
Рейтинг: 0 / 0
28.04.2007, 14:34
    #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
28.04.2007, 14:58
    #34495744
Кифирчик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите поймать баг
BlackDan - вы просто волшебник!
проследил чего там передаётся...
похоже морда БД не те циферки (net_dev_id) передаёт, обновляются другие поля чем я проверяю :)
Огромное спасибо!
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / помогите поймать баг / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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