Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Почему: return was of type java.sql.Types=-5 however type java.sql.Types=0 was registered? / 14 сообщений из 14, страница 1 из 1
10.05.2006, 12:27
    #33717325
J-Pro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему: return was of type java.sql.Types=-5 however type java.sql.Types=0 was registered?
Народ, и снова я ;) В очередной раз прошу прощения за, может быть, глупый вопрос для кого-то, но сам не разобрался, а в форуме по запросу "however java.sql.Types" ничего не нашёл.

Проблема в экзепшне, который вылетает при попытке получить от ф-ции out-параметр типа java.sql.Types.BIGINT функцией JDBC CallableStatement.getLong(int).

Приведу фрагменты кода:

Ф-ция в базе:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE OR REPLACE FUNCTION "public"."AddNewElement" (name varchar, out newelementid bigint) RETURNS bigint AS
$body$
BEGIN

    INSERT INTO "Elements" ("Name")
    VALUES(name);
    
    SELECT INTO newelementid currval('"public"."elements_elementid_seq"');
    
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

Таблица Elements:

Код: plaintext
1.
2.
3.
4.
5.
CREATE TABLE "public"."Elements" (
  "ElementID" BIGINT DEFAULT nextval(('"public"."elements_elementid_seq"'::text)::regclass) NOT NULL, 
  "Name" VARCHAR( 50 ), 
  CONSTRAINT "Elements_pkey" PRIMARY KEY("ElementID")
) WITHOUT OIDS;

Фрагмент ф-ции, использующей JDBC:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
              cst = localConnection.prepareCall("{ call \"AddNewElement\"(?, ?) }");

              String elName = "newElement";

              cst.setString( 1 ,  elName);
              cst.registerOutParameter( 2 , java.sql.Types.BIGINT);

              cst.execute();
              ret = cst.getLong( 2 );
              cst.close();

При выполнении кода получаю Exception:

Код: plaintext
1.
org.postgresql.util.PSQLException: A CallableStatement function was executed and the return was of type java.sql.Types=- 5  however type java.sql.Types= 0  was registered.

Вроде, в ф-ции CallableStatement.GetLong написано:

SunRetrieves the value of the designated JDBC BIGINT parameter as a long in the Java programming language.

А все типы у меня проставлены правильно и out-параметр тоже зарегестрирован верно. Не пойму, в чём проблема. К тому же, если выполнять хранимую процедуру в базе, в простом запросе, то ответ получаю нормальный:

Код: plaintext
1.
2.
Query OK ( 0 . 05  sec)
Return Value:  21 

Кто встречался с этим, подскажите, а? Подозреваю, что дело в записи "nextval(('"public"."elements_elementid_seq"'::text)::regclass)", но она сформировалась автоматом после того, как я проставил тип SERIAL у этого поля.

Заранее большое спасибо! И простите, если вопрос действительно глупый. Я с postgre только перехожу на "Ты" :)
...
Рейтинг: 0 / 0
10.05.2006, 12:35
    #33717358
wbear
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему: return was of type java.sql.Types=-5 however type java.sql.Types=0 was registered?
1.в посгре нету out параметров

2.
Код: plaintext
1.
2.
3.
4.
CREATE OR REPLACE FUNCTION .... RETURNS bigint AS
...
    SELECT INTO newelementid currval('"public"."elements_elementid_seq"');    
END;
$body$

return забыл.
...
Рейтинг: 0 / 0
10.05.2006, 12:41
    #33717392
J-Pro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему: return was of type java.sql.Types=-5 however type java.sql.Types=0 was registered?
wbear1.в посгре нету out параметров
Как это нету? А как же я определил ф-цию с параметрами "(name varchar, out newelementid bigint)"? И почему везде пишут, что out-параметры есть в PostgreSQL? Не понятно...


wbear2.
Код: plaintext
1.
2.
3.
4.
CREATE OR REPLACE FUNCTION .... RETURNS bigint AS
...
    SELECT INTO newelementid currval('"public"."elements_elementid_seq"');    
END;
$body$

return забыл.

Если добавить RETURN - exception всё равно вылетает. Все симптомы остаются такими же. RETURN после SELECT'a ничего не меняет.

Хочу ещё добавить, что хранимая процедура выполняется, то есть новая записть добавляется. Но при считывании out-параметра вылетает exception и получить этот параметр невозможно. :(

Какие ещё мнения?
...
Рейтинг: 0 / 0
10.05.2006, 16:59
    #33718401
J-Pro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему: return was of type java.sql.Types=-5 however type java.sql.Types=0 was registered?
Поискал тут в нете, нашёл где описываются константы типов SQL, вот тут весь файл Types.java.

Я поискал у себя по дискам, такого файла нет нигде... Искал так же все файлы (*.*), содержащие public static final int BIGINT - тоже нет... Странно, как тогда JBuilder компилит и не ругается на java.sql.Types.BIGINT? Откуда же он берёт эту константу тогда? Может, я чего-то не знаю?

По идее, экзепшн я разобрал - смысл в том, что регистрирую я null (public static final int NULL = 0;) , а ф-ция из БД возвращает BIGINT. Но в коде выше вы сами видели, что я не регистрирую NULL, а регистрирую как положено BIGINT...

В общем, чудеса, да и только. Может, эти размышления навели кого-то на мысль, которая мне поможет? Высказывайтесь, пожалуйста!

Спасибо заранее!
...
Рейтинг: 0 / 0
10.05.2006, 17:10
    #33718442
J-Pro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему: return was of type java.sql.Types=-5 however type java.sql.Types=0 was registered?
Нашёл java.sql.Types в архиве rt.jar дистрибутива явы (C:\j2sdk1.4.2_04\jre\lib\). Нашёл исходники в архиве. В файле Types.java так и определено: public final static int BIGINT = -5; С этим понятно. Но почему не та константа регистрируется, а 0 - ума не приложу...

Жду помощи...
...
Рейтинг: 0 / 0
10.05.2006, 17:42
    #33718557
wbear
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему: return was of type java.sql.Types=-5 however type java.sql.Types=0 was registered?
да реально есть out.. чет я отстал от жизнни..


поаробуй так:


CREATE OR REPLACE FUNCTION "public"."AddNewElement" (name varchar) RETURNS bigint AS
$body$
BEGIN

INSERT INTO "Elements" ("Name")
VALUES(name);

return currval('"public"."elements_elementid_seq"');

END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

а вызывай:

select * from "public"."AddNewElement" ('xxx');
...
Рейтинг: 0 / 0
10.05.2006, 17:43
    #33718561
wbear
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему: return was of type java.sql.Types=-5 however type java.sql.Types=0 was registered?
либо

select "public"."AddNewElement" ('xxx')::bigint;
...
Рейтинг: 0 / 0
10.05.2006, 18:21
    #33718665
J-Pro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему: return was of type java.sql.Types=-5 however type java.sql.Types=0 was registered?
Уважаемый wbear , так оно, ессно, работает, так как все ф-ции, работающие с простым ResultSet'ом у меня работают нормально. Тут нет проблем. Только что собрал, проверил - пашет.

Мне, вот, интересно, что теперь надо переделывать все ф-ции Add*** c out-параметров на обычный возврат? Неужели, оно так и не будет работать? Ведь, если ф-цию с out-параметром вызвать просто из SQL-Editor'a, то она работает и даже пишет что возвращает! Значит, проблема в JDBC? Обходов нет? Странно, что так мало ответов, неужели, никто не использует больше out-параметры?


Спасибо, wbear , остальным заранее спасибо за ответы.
...
Рейтинг: 0 / 0
11.05.2006, 15:17
    #33720663
J-Pro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему: return was of type java.sql.Types=-5 however type java.sql.Types=0 was registered?
Ребят? Больше никто из здесь зарегистрированных не использует out-параметры в ф-циях PostgreSQL? Значит, если вам необходимо вернуть всего одно значение, вы возвращаете его селектом? А если это простая ф-ция, от которой вы ждёте либо 0, либо 1, вы тоже прибегаете к селекту? Народ, отзовитесь, а?

Мне нужно понять на чём остановиться и плюнуть ли на out-параметры из-за глюклв в JDBC.
...
Рейтинг: 0 / 0
11.05.2006, 15:25
    #33720692
wbear
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему: return was of type java.sql.Types=-5 however type java.sql.Types=0 was registered?
в посгресе все функции селектом вызываются..
а аут параматрами видимо реально никто не пользуется.. потому как это неудобно.. покрайней мере мне..
...
Рейтинг: 0 / 0
11.05.2006, 20:07
    #33721455
J-Pro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему: return was of type java.sql.Types=-5 however type java.sql.Types=0 was registered?
wbearв посгресе все функции селектом вызываются..
а аут параматрами видимо реально никто не пользуется.. потому как это неудобно.. покрайней мере мне..

Я имел в виду не вызывать селектом, а возвращать значение. Ведь, можно по-разному: либо присвоить аут-параметру значение, либо RETURN SELECT ....;

В общем, понятно. Странная тенденция... в MS SQL успешно пользовался такими параметрами... и не я один. А тут такая тишина.


Ладно, в любом случае, спасибо, хоть альтернатива есть, не совсем без выхода.
...
Рейтинг: 0 / 0
12.05.2006, 16:24
    #33723515
st_serg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему: return was of type java.sql.Types=-5 however type java.sql.Types=0 was registered?
по-моему так как ты хочешь сделать не получится (насколько я понял из "32.4.3. Functions with Output Parameters"). в этом мне не сшиком нравится реализация out параметров в пг. какието они не очень понятные что ли, и для чего их сделали такими не совсем понятно (что б были?)

вот так по идее должно сработать
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
st = localConnection.prepareStatement("select * from \"AddNewElement\"(?)");
String elName = "newElement";
st.setString( 1 ,  elName);
ResultSet rs = cst.executeQuery();
ret = cst.getLong( 1 );
// or
// ret = cst.getLong("newelementid");
cst.close();
...
Рейтинг: 0 / 0
12.05.2006, 16:28
    #33723525
st_serg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему: return was of type java.sql.Types=-5 however type java.sql.Types=0 was registered?
Код: plaintext
1.
2.
3.
if(rs.next()) {
  ret = rs.getLong(...);
}

лажанулся чуть )
...
Рейтинг: 0 / 0
12.05.2006, 17:46
    #33723808
J-Pro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему: return was of type java.sql.Types=-5 however type java.sql.Types=0 was registered?
st_serg
Код: plaintext
1.
2.
3.
if(rs.next()) {
  ret = rs.getLong(...);
}

лажанулся чуть )

Правильно, это так, как говорил wbear . А в яве я именно так и делаю. Через ResultSet:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
              ResultSet rs = cst.getResultSet();
              if(rs != null)
              {
                  while(rs.next())
                  {
                     ret = rs.getLong( 1 );
                  }
              }


Спасибо за идею. Но мне кажется, что тут действительно придётся везде возвращать результаты SELECT... С out-параметрами что-то не то... В самой-то базе они пашут, но в JDBC какой-то баг, всё-таки...
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Почему: return was of type java.sql.Types=-5 however type java.sql.Types=0 was registered? / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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