проблема при выполнении процедуры Sybase из JDBC - PullRequest
1 голос
/ 14 апреля 2020

При выполнении процедуры Sybase из JDB C, я получаю сообщение об ошибке ниже:

Объявлен курсор выполнения для процедуры, которая содержит условие SELECT или SELECT с предложением COMPUTE. для того чтобы объявление этого курсора было допустимым, оно должно иметь один оператор выбора без условия вычисления

Я использую JCONN4 sybase jar. Есть ли у sybase такие ограничения на процедуру, чтобы не было оператора select с предложением compute?

Также я искал в документации Sybase, но не смог получить правильный ответ.

http://infocenter.sybase.com/help/index.jsp?topic= / com .sybase.39996_1250 / html / svrtsg / svrtsg348.htm

Я не могу опубликовать процедуру здесь, но я могу опубликовать образец

create proc sample (@value_date datetime = null) as
begin 
if @value_date is null 
  select @value_date  = some_column from some_table

select a,b,c,d into #ad
from 
 table_a where a='something'

select a,b,c,d case when a=0 then 0 else b/a
from #ad

end

Вышеупомянутая процедура вызывается с использованием sybStatemt Функция .executeQuery

Похоже, это ошибка Sybase. шаги по воспроизведению проблемы

  1. Создайте процедуру, используя select с предложением compute, как описано выше

  2. напишите программу jdb c и используйте belew method Statement.setFetchSize (1000);

  3. Запустите программу, и вы увидите ошибку

Теперь вопрос в том, действительно ли Sybase имеет эти какие-то ограничения или это указывается c только для их драйвера, и мы можем сказать, что проблема с драйвером?

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Запустите ваш sp из командной строки sybase. Если он дает результат, он должен работать с драйвером sybase. Я использовал драйвер ado. net в c#, он может выполнять похожие запросы https://marketplace.visualstudio.com/items?itemName=CDATASOFTWARE.SybaseADONETProvider

Ваш Sp выглядит просто. Но я думаю, что у вашего sp была какая-то проблема во время выполнения.

Я думаю, что эта строка

if @value_date is null 
  select @value_date  = some_column from some_table

должна быть

if @value_date is null 
  select @value_date  = some_column from some_table where col1='kkk' so that only 

одно значение приходит

0 голосов
/ 19 апреля 2020

Вы должны использовать CallableStatement при вызове хранимой процедуры

Если вы выполняете хранимую процедуру в объекте CallableStatement, который представляет значения параметров в виде вопросительных знаков, вы получаете лучшую производительность, чем если бы вы используете как вопросительные знаки, так и буквальные значения для параметров. Кроме того, если вы смешиваете литералы и вопросительные знаки, вы не можете использовать выходные параметры с хранимой процедурой.

В следующем примере sp_stmt создается как объект CallableStatement для выполнения хранимой процедуры MyPro c:

CallableStatement sp_stmt = conn.prepareCall(   "{call MyProc(?,?)}");

Два параметра в MyPro c представлены в виде вопросительных знаков. Вы можете зарегистрировать один или оба из них в качестве выходных параметров, используя методы registerOutParameter в интерфейсе CallableStatement.

В следующем примере sp_stmt2 является объектом CallableStatement для выполнения хранимой процедуры MyProc2.

 CallableStatement sp_stmt2 = conn.prepareCall(   {"call MyProc2(?,'javelin')}");
...