Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / execute statement... / 13 сообщений из 13, страница 1 из 1
27.09.2016, 09:13
    #39316023
Riss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
execute statement...
Добрый день господа )))

Fierbird 2.1

Создал UDF ping
Проверил - работает
Код: sql
1.
select ping("10.168.49.204",20) from rdb$database


загнал выражение в поле таблицы
Пытаюсь выполнить через ...
Код: sql
1.
2.
3.
4.
5.
6.
  declare variable  vk varchar(500);
  ...
  for select pl from tbl into :vk do begin
    execute statement(:vk)  into :zn;
    ...
  end


Выдает ошибку - не существует колонка 10.168.49.204
...
Рейтинг: 0 / 0
27.09.2016, 09:20
    #39316026
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
execute statement...
Riss, попробуй одинарные кавычки.
...
Рейтинг: 0 / 0
27.09.2016, 09:25
    #39316029
Riss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
execute statement...
Спасибо ))) 2 часа траха и не догадаться )))
...
Рейтинг: 0 / 0
27.09.2016, 09:29
    #39316032
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
execute statement...
RissСпасибо ))) 2 часа траха и не догадаться )))
Судя по идее засунуть ping в udf - это твое любимое занятие.
...
Рейтинг: 0 / 0
27.09.2016, 09:33
    #39316034
Riss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
execute statement...
Спасибо)) Изврат - это класс - поверь красиво получилось )))
...
Рейтинг: 0 / 0
27.09.2016, 10:07
    #39316056
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
execute statement...
Riss, посылать буфер нужной длины и содержания твоя UDF умеет, чтобы будить компы через icmp redirect?
...
Рейтинг: 0 / 0
27.09.2016, 10:22
    #39316066
Riss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
execute statement...
rdb_dev.
Прочитал про ICMP - хороший механизм. Через него будет правильнее - по возможности изучу поглубже.
Спасибо за инфу
...
Рейтинг: 0 / 0
27.09.2016, 10:35
    #39316073
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
execute statement...
Riss, так ping всегда работает на ICMP... ICMP, это родной протокол утилиты ping. И вообще я бы передавал адрес хоста в UDF через INTEGER с порядком байт BE.
Конвертер:
Код: 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.
SET TERM ^ ;
CREATE OR ALTER PROCEDURE "IPv4ToLong"
  (
    "IPv4" VARCHAR(15) CHARACTER SET ASCII DEFAULT NULL
  )
  RETURNS
  (
    "Long" INTEGER
  )
AS
  DECLARE VARIABLE dot1 SMALLINT DEFAULT 0;
  DECLARE VARIABLE dot2 SMALLINT DEFAULT 0;
  DECLARE VARIABLE dot3 SMALLINT DEFAULT 0;
  DECLARE VARIABLE oct0 SMALLINT DEFAULT 0;
  DECLARE VARIABLE oct1 SMALLINT DEFAULT 0;
  DECLARE VARIABLE oct2 SMALLINT DEFAULT 0;
  DECLARE VARIABLE oct3 SMALLINT DEFAULT 0;
BEGIN
  "Long" = NULL;
  IF ("IPv4" IS NOT NULL) THEN
    BEGIN
      dot1 = Position('.', "IPv4");
      IF (dot1 > 0) THEN dot2 = Position('.', "IPv4", dot1 + 1);
      IF (dot2 > 0) THEN dot3 = Position('.', "IPv4", dot2 + 1);
      IF (dot3 > 0) THEN
        BEGIN
          oct0 = Cast(Substring("IPv4" FROM 1 FOR dot1 - 1) AS SMALLINT);
          oct1 = Cast(Substring("IPv4" FROM dot1 + 1 FOR dot2 - dot1 - 1) AS SMALLINT);
          oct2 = Cast(Substring("IPv4" FROM dot2 + 1 FOR dot3 - dot2 - 1) AS SMALLINT);
          oct3 = Cast(Substring("IPv4" FROM dot3 + 1) AS SMALLINT);
          "Long" = oct0;
          "Long" = Bin_Or("Long", Bin_Shl(oct1, 8));
          "Long" = Bin_Or("Long", Bin_Shl(oct2, 16));
          IF (oct3 > 127) THEN
            "Long" = Bin_Or("Long", Bin_Shl(oct3 - 256, 24));
          ELSE
            "Long" = Bin_Or("Long", Bin_Shl(oct3, 24));
        END
    END
  SUSPEND;
END^
SET TERM ; ^

Еще рекомендую добавить в эту библиотеку UDF функционал на подобии nslookup для резолва IP адресов хостов по имени.
...
Рейтинг: 0 / 0
27.09.2016, 10:49
    #39316086
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
execute statement...
Код: 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.
CREATE DOMAIN IPV4_PLAIN AS VARCHAR(15) CHARACTER SET ASCII;

SET TERM ^ ;
CREATE OR ALTER PROCEDURE "LongToIPv4"
  (
    "Long" INTEGER DEFAULT NULL
  )
  RETURNS 
  (
    "IPv4" IPV4_PLAIN
  )
AS
BEGIN
  IF ("Long" IS NOT NULL) THEN
    BEGIN
      "IPv4" = Cast(Bin_And("Long", 255) AS IPV4_PLAIN)
          || '.'
          || Cast(Bin_And(Bin_Shr("Long", 8), 255) AS IPV4_PLAIN)
          || '.'
          || Cast(Bin_And(Bin_Shr("Long", 16), 255) AS IPV4_PLAIN)
          || '.'
          || Cast(Bin_And(Bin_Shr("Long", 24), 255) AS IPV4_PLAIN);
    END
  ELSE
    "IPv4" = NULL;
  SUSPEND;
END^
SET TERM ; ^
...
Рейтинг: 0 / 0
27.09.2016, 10:56
    #39316090
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
execute statement...
маразм
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
27.09.2016, 11:05
    #39316095
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
execute statement...
Мимопроходящий, ну почему сразу "маразм"? В некоторых случаях очень удобно иметь такой функционал (ping, nslookup) на сервере FirebirdSQL, если, к примеру, реализуешь какую-нибудь БД для удаленного АйТи обслуживания по SLA, чтобы не писать отдельную службу сервера для реализации этого функционала и использовать этот функционал через UDF.
...
Рейтинг: 0 / 0
27.09.2016, 11:17
    #39316106
Riss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
execute statement...
Век живи, век учись ... и все равно ....
Спасибо rdb_dev )))
...
Рейтинг: 0 / 0
27.09.2016, 14:09
    #39316251
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
execute statement...
Riss, вдруг пригодится:
Код: plsql
1.
2.
3.
4.
5.
6.
CREATE DOMAIN IPV4_PLAIN VARCHAR(15) CHARACTER SET ASCII
  CHECK(VALUE SIMILAR TO
  '((25[0-5]|2[0-4][0-9]|1?[0-9]{1,2}).){3}(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})');
CREATE DOMAIN FQDN VARCHAR(255) CHARACTER SET ASCII
  CHECK(VALUE SIMILAR TO
  '(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]).)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9]).?');
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / execute statement... / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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