powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Вызов хранимой процедуры DB2 из Java
30 сообщений из 30, показаны все 2 страниц
Вызов хранимой процедуры DB2 из Java
    #33747264
power-baa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делаю вызов: select * from ba_death_pen('08.05.2004','08.05.2004')
Ругается:
COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver][DB2/NT] SQL0104N Обнаружен неправильный элемент "(" после текста "* from ba_death_pen". Список правильных элементов: "WHERE". SQLSTATE=42601

Вызываю процедуру без параметров:
select * from ba_death_pen
Ругается:
COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver][DB2/NT] SQL0204N Имя "PD190439.BA_DEATH_PEN" не было определено. SQLSTATE=42704

Такие же ошибки выдаёт программа DB2 SQL
В чём причина ?
...
Рейтинг: 0 / 0
Вызов хранимой процедуры DB2 из Java
    #33747324
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В DB2 вы не можете делать селект из хранимой процедуры.
Если вы хотите ее вызвать, используйте
Код: plaintext
call ba_death_pen('08.05.2004','08.05.2004');
...
Рейтинг: 0 / 0
Вызов хранимой процедуры DB2 из Java
    #33747478
power-baa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinВ DB2 вы не можете делать селект из хранимой процедуры.
Если вы хотите ее вызвать, используйте
Код: plaintext
call ba_death_pen('08.05.2004','08.05.2004');


Сделал ! И вот что пишет :

COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver][DB2/NT] SQL0444N Подпрограмма "ba_death_pen" (с уникальным именем "SQL060524111300500") реализуется при помощи кода функции "ba_death_pen", находящегося в библиотеке или в пути "\ba_death_pen". Этот код функции недоступен. Код причины: "4". SQLSTATE=42724
...
Рейтинг: 0 / 0
Вызов хранимой процедуры DB2 из Java
    #33747546
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На каком языке процедура написана?
Скрипт создания?
...
Рейтинг: 0 / 0
Вызов хранимой процедуры DB2 из Java
    #33747693
power-baa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinНа каком языке процедура написана?
Скрипт создания?

SQL Судя по коду ошибки, надо прописать путь в переменной окруженя
path. Но вот какой путь ?
...
Рейтинг: 0 / 0
Вызов хранимой процедуры DB2 из Java
    #33747707
power-baa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CREATE PROCEDURE PD190439.BA_DEATH_PEN ( IN i_n_date DATE,
IN i_k_date DATE,
OUT o_family VARCHAR(40),
OUT o_name VARCHAR(40),
OUT o_father VARCHAR(40),
OUT o_d_rogd DATE,
OUT o_d_smer DATE,
OUT o_adres VARCHAR(200),
OUT o_pers_nomert VARCHAR(11) )
SPECIFIC PD190439.xb
DYNAMIC RESULT SETS 1
------------------------------------------------------------------------
-- SQL Хранимая процедура
-- o_family
-- o_name
-- o_father
-- o_d_rogd
-- o_d_smer
-- o_adres
-- o_pers_nomert
------------------------------------------------------------------------
P1: BEGIN
-- Объявить переменные
-- DECLARE o_family_TMP VARCHAR(40) DEFAULT ' ';
-- DECLARE o_name_TMP VARCHAR(40) DEFAULT ' ';
-- DECLARE o_father_TMP VARCHAR(40) DEFAULT ' ';
-- DECLARE o_d_rogd_TMP DATE DEFAULT '2004-05-08';
-- DECLARE o_d_smer_TMP DATE DEFAULT '2004-05-08';
-- DECLARE o_adres_TMP VARCHAR(200) DEFAULT ' ';
-- DECLARE o_pers_nomert_TMP VARCHAR(11) DEFAULT ' ';

-- Объявить указатель
DECLARE cursor1 CURSOR WITH RETURN FOR
SELECT DEATH.FAMILY , DEATH.NAME_L , DEATH.FATHER , DEATH.D_ROGD , DEATH.D_SMER , DEATH.ADRES , DEATH.L_SCHET
FROM DEATH AS DEATH
WHERE DEATH.D_SMER >= BA_DEATH_PEN.i_n_date AND DEATH.D_SMER <= BA_DEATH_PEN.i_k_date;

-- Указатель оставлен открытым для программы клиента
OPEN cursor1;

-- SET o_family = o_family_TMP;
-- SET o_name = o_name_TMP;
-- SET o_father = o_father_TMP;
-- SET o_d_rogd = o_d_rogd_TMP;
-- SET o_d_smer = o_d_smer_TMP;
-- SET o_adres = o_adres_TMP;
-- SET o_pers_nomert = o_pers_nomert_TMP;


-- Fetch cursor1
-- into o_family, o_name, o_father, o_d_rogd, o_d_smer, o_adres, o_pers_nomert;
END P1
...
Рейтинг: 0 / 0
Вызов хранимой процедуры DB2 из Java
    #33747767
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А так?
Код: plaintext
call PD190439.ba_death_pen('08.05.2004','08.05.2004', ?, ?, ?, ?, ?, ?, ?);
...
Рейтинг: 0 / 0
Вызов хранимой процедуры DB2 из Java
    #33748110
power-baa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinА так?
Код: plaintext
call PD190439.ba_death_pen('08.05.2004','08.05.2004', ?, ?, ?, ?, ?, ?, ?);

Пишет, что неправильное количество параметров.
А если параметры убираю, выдаёт предыдущую ошибку.
Явно какого - то пути в path не хватает.
...
Рейтинг: 0 / 0
Вызов хранимой процедуры DB2 из Java
    #33748252
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
Пишет, что неправильное количество параметров.
А если параметры убираю, выдаёт предыдущую ошибку.
Явно какого - то пути в path не хватает.

Символы "?", соответствующие выходным параметрам, убирать нельзя.
Пути здесь ни при чем.
Проверьте еще раз, соответствует ли количество параметров в процедуре тому, как вы ее вызываете?
У вас одно процедура с таким именем, или есть еще с этим именем, но в другой схеме?
А то вы, я вижу, создаете и вызываете процедуру без указания схемы...
...
Рейтинг: 0 / 0
Вызов хранимой процедуры DB2 из Java
    #33748269
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinА так?
Код: plaintext
call PD190439.ba_death_pen('08.05.2004','08.05.2004', ?, ?, ?, ?, ?, ?, ?);

Почему так? Это же не Oracle.

Надо указать типы параметров, наподобие:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
call PD190439.ba_death_pen(
  cast('08.05.2004' as date),
  cast('08.05.2004' as date), 
  cast(? as VARCHAR( 40 )),
  cast(? as VARCHAR( 40 )),
  cast(? as VARCHAR( 40 )),
  cast(? as DATE),
  cast(? as DATE),
  cast(? as VARCHAR( 200 )),
  cast(? as VARCHAR( 11 ))
);
(не уверен в точности, как должны быть описаны OUT-параметры, но скорее всего так, ибо DB2 всегда желает знать типы параметров, поскольку возможны разные одноимённые процедуры и функции, различающиеся только типами параметров).
...
Рейтинг: 0 / 0
Вызов хранимой процедуры DB2 из Java
    #33748336
power-baa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein
Код: plaintext
1.
2.
Пишет, что неправильное количество параметров.
А если параметры убираю, выдаёт предыдущую ошибку.
Явно какого - то пути в path не хватает.

Символы "?", соответствующие выходным параметрам, убирать нельзя.
Пути здесь ни при чем.
Проверьте еще раз, соответствует ли количество параметров в процедуре тому, как вы ее вызываете?
У вас одно процедура с таким именем, или есть еще с этим именем, но в другой схеме?
А то вы, я вижу, создаете и вызываете процедуру без указания схемы...

Количество параметров соответствует. Процедура уникальная.
Почему тогда в руководстве по ошибкам написано, что не все пути прописаны
в переменных окружения ?
...
Рейтинг: 0 / 0
Вызов хранимой процедуры DB2 из Java
    #33748345
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Victor Metelitsa
Почему так? Это же не Oracle.
...
(не уверен в точности, как должны быть описаны OUT-параметры, но скорее всего так, ибо DB2 всегда желает знать типы параметров, поскольку возможны разные одноимённые процедуры и функции, различающиеся только типами параметров).
Речь идет о процедурах, а не о функциях.
Вы не создадите 2-х процедур типа
Код: plaintext
1.
CREATE PROCEDURE TEST(IN DT DATE, OUT I INT) BEGIN END@
CREATE PROCEDURE TEST(IN DT DATE, OUT C CHAR) BEGIN END@
А так можно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE FUNCTION TEST(DT DATE, I INT) 
RETURNS INT 
BEGIN ATOMIC 
RETURN  1 ;
END@

CREATE FUNCTION TEST(DT DATE, C CHAR) 
RETURNS INT 
BEGIN ATOMIC 
RETURN  1 ;
END@
Поэтому, при вызове функции мы обязаны явно указывать тип, а в процедурах не надо приводить тип выходных параметров.
...
Рейтинг: 0 / 0
Вызов хранимой процедуры DB2 из Java
    #33748354
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, приведённый пример кода SP наглядно показывает, какая же гадость SP в таких применениях, в противоположность SQL-функциям, возвращающим резалт сет. Не говоря о том, что в данном примере мне даже и SQL-функция кажется лишней.
...
Рейтинг: 0 / 0
Вызов хранимой процедуры DB2 из Java
    #33748366
db2java
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кусок java-кода с вызовом выложите
...
Рейтинг: 0 / 0
Вызов хранимой процедуры DB2 из Java
    #33748398
db2java
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Victor Metelitsa
Надо указать типы параметров, наподобие:

при вызове из java тип парметра задается при его регистрации , например:
Код: plaintext
1.
2.
3.
4.
CallableStatement cStm = "CALL MyProc(?,?)";
cStm.registerOutParameter( 1 , java.sql.Types.INTEGER);
cStm.registerOutParameter( 2 , java.sql.Types.INTEGER);
cStm.execute();
...
Рейтинг: 0 / 0
Вызов хранимой процедуры DB2 из Java
    #33748471
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю, как в жабе, а в CLI, насколько я помню, указание типов параметров в духе
Код: plaintext
1.
2.
cStm.registerOutParameter( 1 , java.sql.Types.INTEGER);
cStm.registerOutParameter( 2 , java.sql.Types.INTEGER);
недостаточно. Мне кажется, что и в жабе не должно быть достаточно, хотя специально я этим не интересовался. В самом деле, параметр процедуры может быть датой, а вы передадите строку, например. Нет гарантии, что типы передаваемых при вызове параметров совпадут с типами параметров той процедуры или функции, которую вы хотите вызвать. Только CAST гарантирует.
...
Рейтинг: 0 / 0
Вызов хранимой процедуры DB2 из Java
    #33748488
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, нет, я это позабыл (Smalltalk меня избавляет от таких подробностей).
Код: plaintext
1.
2.
cStm.registerOutParameter( 1 , java.sql.Types.INTEGER);
cStm.registerOutParameter( 2 , java.sql.Types.INTEGER);
Наверное, такого достаточно. Но параметры должны быть перечислены все, "по умолчанию" не бывает.
...
Рейтинг: 0 / 0
Вызов хранимой процедуры DB2 из Java
    #33748530
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот это да!

Код: plaintext
1.
2.
CREATE PROCEDURE TEST(IN DT DATE, OUT I INT) BEGIN END@
CREATE PROCEDURE TEST(IN DT DATE, OUT C CHAR) BEGIN END@
Проверил. Да, совсем я заглючил...
...
Рейтинг: 0 / 0
Вызов хранимой процедуры DB2 из Java
    #33748574
db2java
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Victor MetelitsaКстати, приведённый пример кода SP наглядно показывает, какая же гадость SP в таких применениях, в противоположность SQL-функциям, возвращающим резалт сет. Не говоря о том, что в данном примере мне даже и SQL-функция кажется лишней.

почему-же?
на жаве,Срр,паскале(дельфе) достаточно просто вытаксивать resultset из ХП.
...
Рейтинг: 0 / 0
Вызов хранимой процедуры DB2 из Java
    #33749026
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
db2java Victor MetelitsaКстати, приведённый пример кода SP наглядно показывает, какая же гадость SP в таких применениях, в противоположность SQL-функциям, возвращающим резалт сет. Не говоря о том, что в данном примере мне даже и SQL-функция кажется лишней.
почему-же?
на жаве,Срр,паскале(дельфе) достаточно просто вытаксивать resultset из ХП.
Что, если вы хотите не все строчки из этого резалтсета, или не все колонки, или сджойнить его с какой-то другой таблицей? Вы этой возможности лишились. Что приобрели взамен?
...
Рейтинг: 0 / 0
Вызов хранимой процедуры DB2 из Java
    #33749122
db2java
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Victor Metelitsa
тут разница таже, что и static vs dynamic sql (при использовании функции inline)
...
Рейтинг: 0 / 0
Вызов хранимой процедуры DB2 из Java
    #33750144
power-baa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо ! Я разобрался.
Но остался ещё один вопрос.
При выполнении опубликованного выше кода,
в ResultSet попадает только одна строка. Почему
при выполнении :

Fetch cursor1
into o_family, o_name, o_father, o_d_rogd, o_d_smer, o_adres, o_pers_nomert;

возвращается из ХП только одна строка. Как вернуть все строки ?
...
Рейтинг: 0 / 0
Вызов хранимой процедуры DB2 из Java
    #33750243
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если вы хотите вернуть все строки, не делайте fetch.
Последним оператором по работе с курсором должен быть open.
Когда вы делаете fetch, наружу будут отдаваться только "неот-fetch-енные" строки курсора.
...
Рейтинг: 0 / 0
Вызов хранимой процедуры DB2 из Java
    #33750246
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
db2java Victor Metelitsa
тут разница таже, что и static vs dynamic sql (при использовании функции inline)
С SP в том примере у вас всегда будет static. C аналогичной UDF у вас есть выбор - static (если вызовете select .. from .. через SQLJ) или dynamic.
...
Рейтинг: 0 / 0
Вызов хранимой процедуры DB2 из Java
    #33750705
power-baa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinЕсли вы хотите вернуть все строки, не делайте fetch.
Последним оператором по работе с курсором должен быть open.
Когда вы делаете fetch, наружу будут отдаваться только "неот-fetch-енные" строки курсора.

А фрагмент кода можно . Я fetch убираю и у меня вообще процедура
не компилится. Кстати, в набор данных попадают все записи, кроме первой.
Первая почему-то теряется.
...
Рейтинг: 0 / 0
Вызов хранимой процедуры DB2 из Java
    #33750775
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE PROCEDURE TEST(IN C VARCHAR( 20 )) 
DYNAMIC RESULT SETS  1 
BEGIN 
 DECLARE TN VARCHAR( 50 );
 DECLARE C1 CURSOR WITH HOLD WITH RETURN FOR
 SELECT SUBSTR(TABNAME,  1 ,  50 ) AS TABNAME
 FROM SYSCAT.TABLES
 WHERE TABSCHEMA='SYSCAT' AND TABNAME LIKE TEST.C;
 OPEN C1;
 --FETCH C1 INTO TN;
END@
Сделайте
Код: plaintext
call test('%TABLE%')
Раскомментируйте
Код: plaintext
FETCH C1 INTO TN
Пересоздайте процедуру, сделайте тот же вызов и сравните результаты.
...
Рейтинг: 0 / 0
Вызов хранимой процедуры DB2 из Java
    #33751107
power-baa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE PROCEDURE TEST(IN C VARCHAR( 20 )) 
DYNAMIC RESULT SETS  1 
BEGIN 
 DECLARE TN VARCHAR( 50 );
 DECLARE C1 CURSOR WITH HOLD WITH RETURN FOR
 SELECT SUBSTR(TABNAME,  1 ,  50 ) AS TABNAME
 FROM SYSCAT.TABLES
 WHERE TABSCHEMA='SYSCAT' AND TABNAME LIKE TEST.C;
 OPEN C1;
 --FETCH C1 INTO TN;
END@
Сделайте
Код: plaintext
call test('%TABLE%')
Раскомментируйте
Код: plaintext
FETCH C1 INTO TN
Пересоздайте процедуру, сделайте тот же вызов и сравните результаты.

А зачем тогда нужны выходные параметры, если и так весь набор данных на
клиента передаётся ?
...
Рейтинг: 0 / 0
Вызов хранимой процедуры DB2 из Java
    #33751135
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
power-baaА зачем тогда нужны выходные параметры, если и так весь набор данных на
клиента передаётся ?

Если ваша задача - вернуть только набор данных клиенту, то - они вам не нужны вообще.
...
Рейтинг: 0 / 0
Вызов хранимой процедуры DB2 из Java
    #33751177
power-baa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein power-baaА зачем тогда нужны выходные параметры, если и так весь набор данных на
клиента передаётся ?

Если ваша задача - вернуть только набор данных клиенту, то - они вам не нужны вообще.

Я раньше работал с InterBase. Так там выходные параметры для того и предназначались, чтоб клиенту набор данных вернуть.
А в DB2 они для чего ?
...
Рейтинг: 0 / 0
Вызов хранимой процедуры DB2 из Java
    #33751299
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
power-baaЯ раньше работал с InterBase. Так там выходные параметры для того и предназначались, чтоб клиенту набор данных вернуть.
А в DB2 они для чего ?
Для возврата скалярных (одиночных) значений.
Наборы данных (если надо) возвращаются отдельно.
Их максимальное кол-во указывается в предложении
Код: plaintext
dynamic result sets n
И чтобы вернуть набор, надо сделать open курсору, не закрывая его и не делая fetch из него, если, конечно, это не требование задачи - вернуть не все строки набора клиенту.
...
Рейтинг: 0 / 0
30 сообщений из 30, показаны все 2 страниц
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Вызов хранимой процедуры DB2 из Java
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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