powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / DB и Си
25 сообщений из 31, страница 1 из 2
DB и Си
    #33146123
divp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Следуя вашим советам решил попробовать написать хп на Си. Сразу возникли вопросы:
1) У меня есть скомпиленная библиотека, куда ее класть?
2) Нужно ли регистрировать? Если да то как?
3) Как вызвать из UDF или SP?

Зарание спасибо за ответ.
...
Рейтинг: 0 / 0
DB и Си
    #33146152
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
db2a2e81.pdf Application Development Guide: Programming Server Applications
db2axe81.pdf Application Development Guide: Building and Running Applications
db2s1e81.pdf SQL Reference Volume 1
db2s2e81.pdf SQL Reference Volume 2

примеры в SQLLIB\samples\c
...
Рейтинг: 0 / 0
DB и Си
    #33146157
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В примерах в SQLLIB\samples\c есть достаточно информации для старта - как компилировать, куда класть.

Лично я UDF и SP на C не пишу, у меня даже компилятор не установлен. Это (программирование на C) скорее для людей, бьющихся за производительность, причем не факт, что её можно существенно повысить таким путем ;-).
...
Рейтинг: 0 / 0
DB и Си
    #33146172
divp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
может я чего не понимаю... однако мне просто нужно написать свою функцию
Код: plaintext
1.
2.
Myfunc
bla-bla-bla

скомпелить длл mydll.dll

и вызвать ее из UDF

такое возможно?
...
Рейтинг: 0 / 0
DB и Си
    #33146185
ak@
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ak@
Гость
Во, я тоже хотел бы написать без использования Си (уж очень заказчик настаивает). Но несколько напрягает отсутствие аналогов битовых операторов (Виктор, спасибо за подсказку), аналогов ISNUMERIC (спасибо КукБуку) и ISDATE (сейчас запнулся на нем, родимом). Ну и отсутствие опыта, конечно :).
Не знаю как сделать в UDF аналог MS SQL-ной TEMPORARY VARIABLE TABLE. Т.е. UDF SplitText возвращает таблицу, а вторая (вызывающая) функция идет по записям этой таблицы, строка за строкой. Попробовал FOR, ругается.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
wloop:
FOR list_emails (txt) AS
        SELECT txt FROM DB2ADMIN.FSPLIT(v_emails, ';');
DO
	IF DB2ADMIN.FISEMAILVALID(txt) <>  1  THEN
         		SET v_ret =  0 ;
                          LEAVE wloop;
	END IF;
	SET v_cnt = v_cnt + 1 ;
END FOR;  
...
Рейтинг: 0 / 0
DB и Си
    #33146320
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
divpможет я чего не понимаю... однако мне просто нужно написать свою функцию
скомпелить длл mydll.dll
и вызвать ее из UDF
такое возможно?
UDF - это функция. Вызвать одну (написанную на произвольном языке - C, Java etc) UDF из другой (SQL) UDF вы вполне можете. Написать UDF на C, вызывающую другую функцию на C - тоже.
...
Рейтинг: 0 / 0
DB и Си
    #33146335
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ak@Не знаю как сделать в UDF аналог MS SQL-ной TEMPORARY VARIABLE TABLE. Т.е. UDF SplitText возвращает таблицу, а вторая (вызывающая) функция идет по записям этой таблицы, строка за строкой. Попробовал FOR, ругается.

Что такое "TEMPORARY VARIABLE TABLE"?
С синтаксисом FOR у вас минимум три проблемы (это то, что сразу бросается в глаза):

1. FOR list_emails (txt) AS
2,3. SELECT txt FROM DB2ADMIN.FSPLIT(v_emails, ';');

настоятельно рекомендую перечитать синтаксис FOR
и как делать выборку из табличных функций.

И - если бы не SET v_cnt = v_cnt +1, вместо той конструкции можно было использовать

Код: plaintext
1.
2.
3.
4.
SET v_ret = (
  SELECT  1  FROM TABLE(DB2ADMIN.FSPLIT(v_emails, ';')) as x
  WHERE DB2ADMIN.FISEMAILVALID(txt) <>  1 
  FETCH FIRST  1  ROW ONLY);

Кстати, явное указание схемы в коде (DB2ADMIN. ) приведет к неудобствам - вы лишаетесь возможности держать несколько копий данных и кода в одной базе (что полезно при отладке). Если будете пользоваться неявной - не забудьте кроме ceuurent schema задать current function path.
...
Рейтинг: 0 / 0
DB и Си
    #33146337
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
current schema, конечно
...
Рейтинг: 0 / 0
DB и Си
    #33146339
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
SET v_ret = (
  SELECT  0  FROM TABLE(DB2ADMIN.FSPLIT(v_emails, ';')) as x
  WHERE DB2ADMIN.FISEMAILVALID(txt) <>  1 
  FETCH FIRST  1  ROW ONLY);
Этому форуму не хватает функции редактирования,.
...
Рейтинг: 0 / 0
DB и Си
    #33146567
ak@
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ak@
Гость
Да, этот конкретный пример я и пытался сделать так, как Вы сказали. Только не знал про ключевое слово TABLE в FROM clause.
А VARIABLE TABLE - это таблица-переменная. То же самое, что и временная таблица, но находится целиком в памяти, а не в tempdb. Ну и соответственно область видимости - текущая процедура. Использовать временные таблицы в UDF в MSSQL нельзя, но таблицы-переменные можно. Точно не помню, но их, по-моему, нельзя индексировать, хотя во многих случаях они увеличивают скорость работы за счет отсутсвия операций чтения-записи.

Описание таблицы-переменной
DECLARE @v_table TABLE (i int identity(1, 1) PRIMARY KEY, somefield int, ....)

А дальше используется как обычная таблица. Например
SELECT COUNT(*) FROM @v_table WHERE somefield = 123

А по поводу указания схемы - я ее никогда и не указывал. Тут она в качестве эксперимента.

Виктор, спасибо за помощь.
...
Рейтинг: 0 / 0
DB и Си
    #33146617
ak@
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ak@
Гость
Блин, не понос, так золотуха. Не билдится функция. Кто знает, как с этим бороться?

Когда нет MODIFIES SQL DATA, пишет:
DB2ADMIN.FAREEMAILSVALID: 22: [IBM][CLI Driver][DB2/NT] SQL0374N The "MODIFIES SQL DATA" clause has not been specified in the CREATE FUNCTION statement for LANGUAGE SQL function "DB2ADMIN.FAREEMAILSVALID" but an examination of the function body reveals that it should be specified. LINE NUMBER=22. SQLSTATE=428C2

Когда есть:
DB2ADMIN.FAREEMAILSVALID: 3: [IBM][CLI Driver][DB2/NT] SQL0628N Multiple or conflicting keywords involving the "NO/CONTAINS/READS/MODIFIES SQL DATA" clause are present. LINE NUMBER=3. SQLSTATE=42613


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE FUNCTION DB2ADMIN.FAREEMAILSVALID( v_emails VARCHAR( 1024 ) )
    RETURNS INTEGER
    SPECIFIC FAREEMAILSVALID
    LANGUAGE SQL
--    MODIFIES SQL DATA -- insert available
    DETERMINISTIC
BEGIN ATOMIC
DECLARE v_ret INTEGER DEFAULT  0 ;
SET v_ret = (
    SELECT  0  FROM TABLE(FSPLITTEXT(v_emails, ';')) as x
    WHERE FISEMAILVALID(txt) <>  1 
    FETCH FIRST  1  ROW ONLY
);

RETURN v_ret;
END
...
Рейтинг: 0 / 0
DB и Си
    #33146684
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ak@Да, этот конкретный пример я и пытался сделать так, как Вы сказали. Только не знал про ключевое слово TABLE в FROM clause.
А еще две синтаксические ошибки?
...
Рейтинг: 0 / 0
DB и Си
    #33146685
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ak@Блин, не понос, так золотуха. Не билдится функция. Кто знает, как с этим бороться?
Код: 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.
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.
CONNECT TO TICKPROC 

   Информация соединения с базой данных

 Сервер баз данных           = DB2/NT  8 . 2 . 2 
 ID авторизации SQL          = ADMINIST...
 Алиас локальной базы данных = TICKPROC


DROP FUNCTION FAREEMAILSVALID( VARCHAR( 1024 ) ) 
DB20000I  Команда SQL выполнена успешно.

DROP FUNCTION FSPLITTEXT(VARCHAR( 1024 ), VARCHAR( 1 )) 
DB20000I  Команда SQL выполнена успешно.

DROP FUNCTION FISEMAILVALID(VARCHAR( 1024 )) 
DB20000I  Команда SQL выполнена успешно.

CREATE FUNCTION FISEMAILVALID(txt VARCHAR( 1024 ))
RETURNS INTEGER
LANGUAGE SQL
CONTAINS SQL
NO EXTERNAL ACTION
DETERMINISTIC
RETURN 
  CASE 
    WHEN LOCATE('@', txt)> 0  THEN  1  
    ELSE  0  
  END

DB20000I  Команда SQL выполнена успешно.

CREATE FUNCTION FSPLITTEXT(txt VARCHAR( 1024 ), delimiter VARCHAR( 1 ) )
RETURNS TABLE (numid INTEGER, data VARCHAR( 1024 ))
LANGUAGE SQL
CONTAINS SQL
-- MODIFIES SQL DATA -- insert available
NO EXTERNAL ACTION
DETERMINISTIC
BEGIN ATOMIC
  RETURN
  WITH
    temp1 (id, data) AS
      (VALUES ( 1 , txt)
    ),
    temp2 (id, word#, word, data_left) AS
    (SELECT id
      ,SMALLINT( 1 )
      ,SUBSTR(data,  1 ,
      CASE LOCATE(delimiter, data)
        WHEN  0  THEN LENGTH(data)
        WHEN  1  THEN  0 
        ELSE LOCATE(delimiter, data) -  1 
      END)
      ,LTRIM(SUBSTR(data,
      CASE LOCATE(delimiter, data)
        WHEN  0  THEN LENGTH(data) +  1 
        ELSE LOCATE(delimiter, data) +  1 
      END))
    FROM temp1
    WHERE data <> ''
    UNION ALL
    SELECT id
      ,word# +  1 
      ,SUBSTR(data_left,  1 ,
      CASE LOCATE(delimiter, data_left)
        WHEN  0  THEN LENGTH(data_left)
        WHEN  1  THEN  0 
        ELSE LOCATE(delimiter, data_left) -  1 
      END)
      ,LTRIM(SUBSTR(data_left,
        CASE LOCATE(delimiter, data_left)
          WHEN  0  THEN LENGTH(data_left) +  1 
          ELSE LOCATE(delimiter, data_left) +  1 
        END))
      FROM temp2
      WHERE data_left <> ''
    )
  SELECT ROW_NUMBER() OVER(), word data
  FROM temp2
  WHERE word <> ''
  ORDER BY  1 ,  2 ;
END 

SQL0347W  Рекурсивное общее табличное выражение "ADMINISTRATOR.TEMP2", 
возможно, содержит бесконечный цикл.  SQLSTATE= 01605 

CREATE FUNCTION FAREEMAILSVALID( v_emails VARCHAR( 1024 ) )
  RETURNS INTEGER
  LANGUAGE SQL
  CONTAINS SQL
--    MODIFIES SQL DATA -- insert available
  DETERMINISTIC
  NO EXTERNAL ACTION
BEGIN ATOMIC
  DECLARE v_ret INTEGER;
  SET v_ret = (
    SELECT  0  FROM TABLE(FSPLITTEXT(v_emails, ';')) as x
    WHERE FISEMAILVALID(data) <>  1 
    FETCH FIRST  1  ROW ONLY
  );
  RETURN v_ret;
END 

DB20000I  Команда SQL выполнена успешно.
...
Рейтинг: 0 / 0
DB и Си
    #33146713
ak@
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ak@
Гость
Спасибо, Виктор, но все та же ерунда с MODIFIES SQL DATA. Видимо Development Center чего-то кривит.
...
Рейтинг: 0 / 0
DB и Си
    #33146756
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что, именно на том (немодифицированном) скрипте, который привел я???
...
Рейтинг: 0 / 0
DB и Си
    #33146763
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Development Center не может ничего кривить (в данном контексте). Внимательнее относитесь к разнице между READS SQL DATA, CONTAINS SQL и MODIFIES SQL DATA.

Так,
CREATE FUNCTION FSPLITTEXT(txt VARCHAR(1024), delimiter VARCHAR(1) )
не обращается ни к каким таблицам вообще, поэтому напрашивается CONTAINS SQL (хотя READS SQL DATA, быть может, подойдет). А если бы делала SELECT из "физической" таблицы (напрямую или в конечном счете через цепочку функций и view), то должно подойти READS SQL DATA. Ну, а если внутри INSERT/UPDATE/DELETE - тогда MODIFIES SQL DATA.

Если функция F1 вызывает F2, а F2 - MODIFIES SQL DATA, то тогда F1 просто обязана быть MODIFIES SQL DATA. (Если F2 может модифицировать данные, а F1 вызывает F2, то F1 может модифицировать данные).
Если F2 - READS SQL DATA, то F1 должна быть READS SQL DATA или MODIFIES SQL DATA.

Аналогично с DETERMINISTIC и EXTERNAL ACTION.

Вот что за глюк с [IBM][CLI Driver][DB2/NT] SQL0628N Multiple or conflicting keywords involving the "NO/CONTAINS/READS/MODIFIES SQL DATA" clause are present. LINE NUMBER=3. SQLSTATE=42613
мне непонятно.
...
Рейтинг: 0 / 0
DB и Си
    #33146767
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понятно, что MODIFIES SQL DATA и DETERMINISTIC противоречат друг другу, но это еще не всё.
...
Рейтинг: 0 / 0
DB и Си
    #33146780
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Складывается впечатление (явного указания в документации я не нашел), что только табличные функции могут быть MODIFIES SQL DATA!
...
Рейтинг: 0 / 0
DB и Си
    #33146789
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По диаграмке в кулинарной книжке так и выходит, хотя в официальной документации не сказано.
...
Рейтинг: 0 / 0
DB и Си
    #33146790
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, тогда ошибка и в кулинарной книжке. Наверное, пора гуглить англоязычные ньюсгруппы и спрашивать Ibm'еров.
...
Рейтинг: 0 / 0
DB и Си
    #33146819
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://groups.google.com/groups?hl=ru&lr=&threadm=39c3crF5v7oioU1%40individual.net&rnum=1&prev=/groups%3Fq%3DSQL0628N%26hl%3Dru%26lr%3D%26sa%3DN%26scoring%3Dd

Т.е. в официальной документации это всё-таки есть - но нарисовано так уродливо, что я не обратил внимание на сноску.

Полагаю, теперь вопрос кристально ясен.
...
Рейтинг: 0 / 0
DB и Си
    #33146903
ak@
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ak@
Гость
Спасибо, Виктор. Четко и прозрачно. Огромное спасибо.
...
Рейтинг: 0 / 0
DB и Си
    #33147346
nkulikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Табличные ф-ции на SQL не могут содержать IUD операторы. Кстати в таких функциях можно вызвать SP, правда только те которые READ SQL DATA.
...
Рейтинг: 0 / 0
DB и Си
    #33147478
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да нет, наоборот, табличные могут, нетабличные не могут.
...
Рейтинг: 0 / 0
DB и Си
    #33154926
nkulikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да ступил.
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / DB и Си
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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