Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Новый топик    Ответить
 Хранимые процедуры  [new]
oleg_e
Member

Откуда: Владикавказ
Сообщений: 365
Может кто нибудь объяснить по шагам как создать SP в DB2 7.2 EE.
Например:
Таблица A(a1 int)
Хранимая процедура должна вернуть количество строк, в которых поле а1
равно какому-то параметру.

Если можно расскажите разные варианты: SQL, C, Java. Что лучше?

Спасибо!
17 мар 03, 09:51    [148727]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
golsa
Member

Откуда: Красноярск
Сообщений: 789
С+ - + вся мощь WinAPI и DB2 API. Все в твоих руках - оптимизация, запуск параллельных процессов, управление памятью и т. д.
- исходники хранятся отдельно от БД, т.е. некоторые проблемы с backup/restore
SQL - + простой, но мощный процедурный язык. Фирменный построитель с возможностью отладки.
- отсутствие доступа к WinAPI , ограниченный DB2 API (только работа с таблицами)
JAVA - + фирменный построитель с возможностью отладки.
- некоторая тормознутость и ресурсопрожорливость по сравнению с C+ и SQL.
На счет WinAPI и DB2 API точно не знаю. Но возможностей никак не меньше чем у SQL.
В v 7.2 допускаются вложенные ХП, но только если они одного типа. В v 8 это уже побеждено.
17 мар 03, 12:17    [148884]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
oleg_e
Member

Откуда: Владикавказ
Сообщений: 365
Если можно, примеры!

А, что такое "Фирменный построитель с возможностью отладки" для SQL, где его взять?

Спасибо!
17 мар 03, 16:03    [149244]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
golsa
Member

Откуда: Красноярск
Сообщений: 789
IBM DB2 Store Procedure Builder идет в комплекте поставки DB2 v 7.1 и выше в v 8 переименован в центр разработки. Верно по крайней мере для WorkGroup for Win и Personal Edition.
Вот пример SQL ХП: принимает целое положительное число, создает временную таблицу и записывает туда числа - степени 2, сумма которых дает исходное число. Возвращает на клиент открытый курсор на созданную таблицу.

CREATE PROCEDURE DB2ADMIN.Proc1 ( IN P_ID INTEGER )
RESULT SETS 1
LANGUAGE SQL
------------------------------------------------------------------------
-- SQL Stored Procedure
------------------------------------------------------------------------
P1: BEGIN
DECLARE L_MD INTEGER;
DECLARE L_MS INTEGER;
DECLARE GLOBAL TEMPORARY TABLE SESSION.ID (
ID INTEGER)
WITH REPLACE ON COMMIT PRESERVE ROWS NOT LOGGED;

WHILE P_ID > 0 DO
SET L_MD = MOD(P_ID,2);
SET P_ID = P_ID / 2;
SET L_MS = VALUE(L_MS + L_MS,1);
IF L_MD = 1 THEN
INSERT INTO SESSION.ID VALUES L_MS;
END IF;
END WHILE;

P2: BEGIN
-- Declare cursor
DECLARE cursor1 CURSOR WITH RETURN FOR
SELECT * FROM SESSION.ID;

-- Cursor left open for client application
OPEN cursor1;
END P2;
END P1
18 мар 03, 07:07    [149635]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
gardenman
Member

Откуда: С-Петербург
Сообщений: 2347
Брат! Уточни - у тебя какой сервер под Линуксами или под Виндой?
18 мар 03, 10:39    [149828]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
oleg_e
Member

Откуда: Владикавказ
Сообщений: 365
gardenman << DB2 v 7.2 и Windows 2000, клиент Windows 2000

Я пытаюсь выполнить на клиенте, в "Командном центре" следующее:

CREATE PROCEDURE COUNT_FROM_A (IN S_A1 INTEGER, OUT A_COUNT INTEGER)
LANGUAGE SQL
BEGIN
SELECT COUNT(*) INTO A_COUNT FROM A WHERE A1 = S_A1;
END

На что получаю:

SQL0104N Обнаружен неправильный элемент "END-OF-STATEMENT" после текста "OM A WHERE A1 = S_A1". Список правильных элементов: "<psm_semicolon>". LINE NUMBER=6. SQLSTATE=42601

и

SQL0104N Обнаружен неправильный элемент "END-OF-STATEMENT" после текста "END". Список правильных элементов: "JOIN <joined_table>". SQLSTATE=42601

В чем ошибки?
18 мар 03, 12:22    [150015]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
golsa
Member

Откуда: Красноярск
Сообщений: 789
Прошу прошения. Речь шла о DB2 for Win. Но пример ХП SQL - межплатформенный :).
18 мар 03, 12:27    [150025]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
golsa
Member

Откуда: Красноярск
Сообщений: 789
Прошу прошения. Речь шла о DB2 for Win. Но пример ХП SQL - межплатформенный :).
2 oleg_e
метка перед begin и после end см. пример
18 мар 03, 12:31    [150030]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
Roman Pankov
Member

Откуда: Moscow
Сообщений: 79
Не обязательно. Если честно, даже не вижу, откуда там могла взяться ошибка, кроме как с типами (какого типа A.A1?) может быть что-то напутано или в синтаксисе ошибки...
18 мар 03, 13:10    [150110]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
NewYear
Member

Откуда: Большой адронный коллайдер
Сообщений: 2203
ошибка там, ошибка :)
проблема заклюсчается в том, что один и тот же разделитеть ";" используется и в spl, и в командном центре
18 мар 03, 13:19    [150131]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
Roman Pankov
Member

Откуда: Moscow
Сообщений: 79
Ага!... ;) Вот она где собака порылась... ;) Я-то пользуюсь в основном Command Line Processor... Да и с типами все понятно, это я первое сообщение не разглядел...

> oleg_e

SQL:
create procedure PROC_SQL (in inA1 int, out outCount int)

language sql
begin
select count(*) into outCount from A where A1 = inA1;
end


Java (JDBC):
import java.sql.*;


public class Proc_jdbc
{
public static void proc_jdbc (
int inA1,
int[] outCount)
throws
SQLException,
Exception
{
Connection conn = DriverManager.getConnection("jdbc:default:connection");
ResultSet rs = conn.createStatement().executeQuery(
"select count(*) from A where A1 = " + inA1);
while (rs.next()) outCount[0] = rs.getInt(1);
if (rs != null) rs.close();
if (conn != null) conn.close();
}
}


Java (SQLJ)
import java.sql.*;


public class Proc_sqlj
{
public static void proc_sqlj (
int inA1,
int[] outCount)
throws
SQLException,
Exception
{
#sql {select count(*) into :(outCount[0]) from A where A1 = :inA1};
}
}


Текст SQL-процедур сначала переводится в C, потом уж процедура билдится и подлинковывается... В случае выбора Java - JDBC гибче, но SQLJ эффективней и проще... Так как можно их смешивать, то лучше писать по возможности используя SQLJ, а если прижмет надобность - тогда уж JDBC...
18 мар 03, 14:19    [150218]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
oleg_e
Member

Откуда: Владикавказ
Сообщений: 365
С этим вопросом разобрались, БОЛШОЙ-БОЛШОЙ спасиба!
Если писать без переносов строки, то работает, но ошибка в другом:
Не удалось загрузить указанную библиотеку DLL
"С:\PROGRA~1\SQLLIB\function\db2udp.dll"


А, скажите пожалуйста, что дальше делать с текстом на C или Java, их нужно транслировать, компиллировать и т.п. или что? :-[
18 мар 03, 15:52    [150344]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
NewYear
Member

Откуда: Большой адронный коллайдер
Сообщений: 2203
нет, распечатать и в рамку!
у тебя ж dll-ка не собралась. вот и смотри в лог, почему она не собралась.
18 мар 03, 16:19    [150392]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
oleg_e
Member

Откуда: Владикавказ
Сообщений: 365
распечатать и в рамку! - полчаса смеялся :)).
Но я действительно не знаю что делать.
Кто-нибудь может, если не лень, объяснить по шагам как, все таки, создать хранимую процедуру с начала - до конца?
Если лень, то может скажете где прочитать?
:)
Спасибо!
19 мар 03, 11:16    [151005]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
gardenman
Member

Откуда: С-Петербург
Сообщений: 2347
как нибудь выложу makefile-ы, шаблоны и скрипты для создания ХП под виндйи и линуксами. Некогда щас.
20 мар 03, 00:42    [151800]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
oleg_e
Member

Откуда: Владикавказ
Сообщений: 365
Спасибо ВСЕМ!

Поставили Store Procedure Builder, кое-как заработала!
Надо почитать Java!

На SQL и С не получилось, наверное потому, что нету С-компиллятора!
:-)

Пока всё!
20 мар 03, 18:57    [152922]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
Roman Pankov
Member

Откуда: Moscow
Сообщений: 79
На SQL и С не получилось, наверное потому, что нету С-компиллятора

Текст SQL-процедур сначала переводится в C, а потом уж билдится - т.е., таки да, нужен С-компилер какой-нибудь... ;) У нас стоит MS VC++ 6.0...

Для Java в стандартную поставку входит JDK (SQLLIB\java\jdk), старенький, правда, но это не так уж и критично, и ставить дополнительно ничего не надо... Теоретически, даже SPB не нужен, но с ним проще... ;)
21 мар 03, 10:40    [153222]     Ответить | Цитировать Сообщить модератору
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Ответить