powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Вызов процедуры (проблемка)
12 сообщений из 12, страница 1 из 1
Вызов процедуры (проблемка)
    #32294974
Lefan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветсвую всех!!!

Проблема с вызовом процедуры, пример взял из DB2, немного переделал, убрал:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
import java.sql.*;                   // Классы JDBC

public class MyExamples
{
    public static void HelloWorld(String[] result) 
                       throws SQLException, Exception
    {
       result[ 0 ] =  "Hello World!!!" ;
    }
}


Откомпилировал, переместил куда надо в DB2, создаем процедуру:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE PROCEDURE sav.HelloWorld(OUT result CHAR( 25 ))
SPECIFIC sav.helloworld
DYNAMIC RESULT SETS  0 
LANGUAGE JAVA
PARAMETER STYLE JAVA
NO DBINFO
FENCED
MODIFIES SQL DATA
PROGRAM TYPE SUB
EXTERNAL NAME 'MyExamples.HelloWorld';

Вызываем:
Код: plaintext
1.
call sav.helloworld;
call sav.helloworld();

И так и сяк выдает ошибку:
Код: 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.
SQL0440N  Не найдено авторизованной подпрограммы  "SAV.HELLOWORLD"  
типа  "PROCEDURE                                              "  
с совместимыми аргументами.

Объяснение: 

Для заданной подпрограммы  "<имя-подпрограммы>"  менеджер баз 
данных не может найти подпрограмму, которые можно использовать для 
реализации этой ссылки. Это может произойти по различным 
причинам: 

o   Имя  "<имя-подпрограммы>"  задано неверно или такая функция не  
    существует в базе данных.  

o   Использовано имя со спецификаторами, но спецификаторы заданы  
    неправильно.  

o   Использовано имя без спецификаторов, а пользовательский путь  
    SQL не содержит схему, в которой находится нужная функция или 
    метод.  

o   Задано неверное число аргументов.  

o   В ссылке на функцию или метод задано правильное число         
    аргументов, но один или несколько аргументов имеют неверный   
    тип данных.  

o   В базе данных нет подпрограммы с ID функции, который          
    использовался при связывании пакета (этот вариант относится к 
    статическим операторам).  

o   Не удается найти метод мутатора, соответствующий назначению   
    используемого в операторе UPDATE атрибута.  Тип данных нового 
    значения не совпадает с типом данных атрибута и не       
    преобразуется в него.  

o   Вызывающий подпрограмму не имеет полномочий на ее 
    выполнение.  

 

Действия пользователя: 

Исправьте ошибку и повторите операцию.  Может потребоваться 
задание правильного доступа к каталогу, изменение оператора, 
предоставление привилегий выполнения вызывающему подпрограмму, 
добавление новых функций и/или изменение пути SQL.  

 sqlcode :  - 440  

 sqlstate :   42884  

Оригиналы DB2 тоже не работают, вызываются с такой же ошибкой...
Исходники:
Код: 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.
...
public class SpServer
{

  public static void outLanguage(String[] outLang) throws Exception
  {
    try
    {
      String procName;

      // Initialize variables
      procName =  "OUT_LANGUAGE" ;

      // Get caller's connection to the database
      Connection con =
        DriverManager.getConnection( "jdbc:default:connection" );

      String query =  "SELECT language FROM syscat.procedures " 
                     +  "WHERE procname = ? " ;
      PreparedStatement stmt = con.prepareStatement(query);
      stmt.setString( 1 , procName);
      ResultSet rs = stmt.executeQuery();

      // move to first row of result set
      rs.next();

      // set value for the output parameter
      outLang[ 0 ] = rs.getString( 1 );

      // clean up resources
      rs.close();
      stmt.close();
      con.close();
    }
    catch (Exception e)
    {
      throw e;
    }
  }
...
}


Создание процедуры:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATE PROCEDURE OUT_LANGUAGE (OUT LANGUAGE CHAR( 8 ))
DYNAMIC RESULT SETS  0 
LANGUAGE JAVA
PARAMETER STYLE JAVA
NO DBINFO
FENCED
MODIFIES SQL DATA
PROGRAM TYPE SUB
EXTERNAL NAME 'SpServer.outLanguage';


Что можно сделать в этой ситуации? или как ее решить?
другая процедура, которой я передаю имя таблицы, а она мне содержимое, работает...

Заранее благодарен.
С уважение Алексей.
...
Рейтинг: 0 / 0
Вызов процедуры (проблемка)
    #32295003
q
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
q
Гость
>call sav.helloworld;
>call sav.helloworld();

нужно задать параметр процедуры. параметр -> OUT result CHAR(25))
...
Рейтинг: 0 / 0
Вызов процедуры (проблемка)
    #32295008
q
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
q
Гость
т.е. вызвать процедуру можно только с параметром, как она объявлена
...
Рейтинг: 0 / 0
Вызов процедуры (проблемка)
    #32295069
Lefan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
call sav.Helloworld(OUT result CHAR(25));
Код: 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.
SQL0104N  Обнаружен неправильный элемент  "result"  после текста  "l 
SAV.Helloworld(OUT" .  Список правильных элементов:  "+           
                              " .

Объяснение: 

Обнаружена синтаксическая ошибка в операторе SQL, где указанный 
элемент следует после текста  "<текст>" .  В поле  "<текст>"  
показаны  20  символов оператора SQL непосредственно перед неверным 
элементом.  

 В качестве подсказки программисту поле SQLERRM области SQLCA 
содержит частичный список правильных элементов в виде 
 "<список-элементов>" .  При составлении этого списка 
подразумевается, что предыдущая часть оператора не содержит 
ошибок.  

 Оператор невозможно обработать.  

Действия пользователя: 

Проверьте и исправьте оператор в области указанного элемента.  

 sqlcode :  - 104  

 sqlstate :   42601  
call sav.Helloworld(OUT RESULT);
Код: 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.
SQL0104N  Обнаружен неправильный элемент  "RESULT"  после текста  "l 
SAV.Helloworld(OUT" .  Список правильных элементов:  "<space>     
                              " .

Объяснение: 

Обнаружена синтаксическая ошибка в операторе SQL, где указанный 
элемент следует после текста  "<текст>" .  В поле  "<текст>"  
показаны  20  символов оператора SQL непосредственно перед неверным 
элементом.  

 В качестве подсказки программисту поле SQLERRM области SQLCA 
содержит частичный список правильных элементов в виде 
 "<список-элементов>" .  При составлении этого списка 
подразумевается, что предыдущая часть оператора не содержит 
ошибок.  

 Оператор невозможно обработать.  

Действия пользователя: 

Проверьте и исправьте оператор в области указанного элемента.  

 sqlcode :  - 104  

 sqlstate :   42601  
call sav.Helloworld(OUT);
Код: 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.
SQL0206N   "OUT                                                    
               "  недопустимо в контексте, где оно используется.

Объяснение: 

Эта ошибка может возникнуть в следующих случаях: 

o   Данное имя столбца в операторе INSERT или UPDATE не является  
    именем столбца таблицы, которая задана в качестве объекта для 
    операции вставки или модификации.  

o   Данное имя столбца в операторе SELECT или DELETE не является  
    именем столбца в какой-либо из таблиц, указанных в условии    
    FROM этого оператора.  

o   Данное имя столбца в условии ORDER BY - неразрешенная         
    внутриоператорная ссылка на столбец в подвыборке.  

o   Для оператора CREATE TRIGGER, CREATE METHOD или CREATE   
    FUNCTION: 

    -   Ссылка  "<имя>"  не разрешается в имя столбца, локальной        
        переменной или передаваемой переменной.  

    -   Условное имя  "<имя>" , определенное в операторе SIGNAL, не     
        было объявлено.  

o   В операторе CREATE TRIGGER: 

    -   Имя указывает на столбец рабочей таблицы, не используя        
        внутриоператорное имя OLD или NEW.  

    -   В левой части присваивания в операторе SET, входящем в        
        область действия триггера и задающем значения временных   
        переменных, задана старая временная переменная, в то      
        время как допустима только новая временная переменная.  

o   Для оператора CREATE FUNCTION с условием PREDICATES: 

    -   В операторе RETURN функции SQL использована переменная,       
        которая не является ни параметром, ни другой переменной в 
        области действия оператора RETURN.  

    -   В условии FILTER USING использована переменная, которая не    
        является ни именем параметра, ни именем выражения в     
        условии WHEN.  

    -   Назначение поиска в правиле применения индекса не совпадает   
        ни с одним из имен параметров создаваемой функции.  

    -   Аргумент поиска в правиле применения индекса не совпадает ни  
        с именем выражения в условии EXPRESSION AS, ни с именем   
        параметра создаваемой функции.  

o   Для оператора CREATE INDEX EXTENSION в условии RANGE THROUGH  
    или в условии FILTER USING использована переменная, которая   
    не является именем допустимого в этом условии параметра.  

 

 Оператор невозможно обработать.  

Действия пользователя: 

Убедитесь, что имена в этом операторе SQL заданы правильно.  Для 
оператора SELECT убедитесь, что все необходимые таблицы указаны в 
условии FROM.  Для подвыборки в условии ORDER BY убедитесь, что 
не используются внутриоператорные ссылки на столбцы.  Если для 
таблицы используются внутриоператорное имя, убедитесь, что 
последующие ссылки используют это внутриоператорное имя и не 
используют имя таблицы.  

 Для оператора CREATE TRIGGER убедитесь, что в левой части 
присваивания в операторе SET, задающем значения временных 
переменных, заданы только новые временные переменные и что для 
всех ссылок на столбцы рабочей таблицы задано внутриоператорное 
имя.  

 sqlcode :  - 206  

 sqlstate :   42703  
call sav.Helloworld(CHAR(25));
Код: 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.
SQL0469N  Режим параметра (IN, OUT или INOUT) недопустим для 
параметра в процедуре  "HELLOWORLD"  с уникальным именем 
 "HELLOWORLD"  (номер параметра  "0 ", имя  "RESULT                  
                      " ).

Объяснение: 

 Возникла одна из следующих ошибок: 

o   параметр в процедуре SQL объявлен как OUT, а используется в   
    теле процедуры как входной.  

o   параметр в процедуре SQL объявлен как IN, но изменяется в     
    теле процедуры.  

 

Действия пользователя: 

 Измените атрибут параметра на INOUT или измените использование 
параметра в процедуре.  

 sqlcode :  - 469  

 sqlstate :   42886  
call sav.Helloworld(CHAR(25) RESULT);
call sav.Helloworld(RESULT);

Все ругается... :(
можно примерчик вызова?
...
Рейтинг: 0 / 0
Вызов процедуры (проблемка)
    #32295102
Lefan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
из CommanCenter
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
call sav.Helloworld(?);

SQL4306N  Хранимая процедура или определенная пользователем 
функция Java  "SAV.HELLOWORLD" , уникальное имя  "HELLOWORLD"  не 
могут вызвать метод Java  "HelloWorld" , сигнатура 
 "([Ljava/lang/String;)V           " .

Объяснение: 

Не найден метод Java, заданный в условии EXTERNAL NAME оператора 
CREATE PROCEDURE или CREATE FUNCTION.  Возможно, его список 
объявленных аргументов не соответствует тому, что ожидает база 
данных, или же метод не объявлен как  "public" .  

Действия пользователя: 

Убедитесь, что метод Java существует, имеет флаг  "public"  и его 
список аргументов соответствует вызову.  

 sqlcode :  - 4306  

 sqlstate :  42724  


из сонсли DB2
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
db2 => call sav.helloworld(?)

  Значение выходных параметров
   --------------------------
 
  Имя параметра   : RESULT
  Значение парам. : Hello World!!!

  Статус возврата =  0 


Мне надо чтоб из Комманд Центра тоже шло, а то в классах тож не идет... :(

С уважение Алексей.
...
Рейтинг: 0 / 0
Вызов процедуры (проблемка)
    #32295108
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lefan, это даже не смешно.

попробуй сначала разобраться, что такое 'параметр', который ты передаешь процедуре. и что означеют атрибуты параметра IN, OUT, INOUT
...
Рейтинг: 0 / 0
Вызов процедуры (проблемка)
    #32295158
Lefan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>попробуй сначала разобраться, что такое 'параметр', который ты передаешь
>процедуре. и что означеют атрибуты параметра IN, OUT, INOUT

Да я ничего не передаю процедуре, я только хочу получить от нее...

С атрибутами проблем нет:
IN - параметер входной
OUT - выходной (нужен мене)
INOUT - параметер является входным и выходным

Неужели никто не даст примера вызова процедуры?

У меня есть рабочие, но они все возвращают ResultSet, процедуры с параметрами и есть без параметров (всмысле входных, на выходе у всех ReultSet)
А сейчас мне надо возвратить просто строчку...

С уважение Алексей.
...
Рейтинг: 0 / 0
Вызов процедуры (проблемка)
    #32295179
Lefan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я сделал пример на основе примеров DB2....

С уважение Алексей.
...
Рейтинг: 0 / 0
Вызов процедуры (проблемка)
    #32295238
Lefan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Люди, выручите пожайлуста, очень надо, работа стоит...
Начальство душит...

пример то маханький:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
import java.sql.*;                   // Классы JDBC

public class MyExamples
{
    public static void HelloWorld(String[] result) 
                       throws SQLException, Exception
    {
       result[ 0 ] =  "Hello World!!!" ;
    }
}


Компилировать класс:
Код: plaintext
C:\>javac MyExample.java


Класс скомпилированный положить в $DB2HOME/sqllib/FUNCTION
и компиляция в базе:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE PROCEDURE sav.HelloWorld(OUT result CHAR( 25 ))
SPECIFIC sav.helloworld
DYNAMIC RESULT SETS  0 
LANGUAGE JAVA
PARAMETER STYLE JAVA
NO DBINFO
FENCED
MODIFIES SQL DATA
PROGRAM TYPE SUB
EXTERNAL NAME 'MyExamples.HelloWorld';


удалить потом процедуру:
Код: plaintext
DROP PROCEDURE sav.HelloWorld;



Ну очень буду признателен , уж и не знаю где, что смотреть... :(
С уважение Алексей.
...
Рейтинг: 0 / 0
Вызов процедуры (проблемка)
    #32295247
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Да я ничего не передаю процедуре, я только хочу получить от нее...
:)

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

вызови свою процедуру из SPB...
...
Рейтинг: 0 / 0
Вызов процедуры (проблемка)
    #32295278
Lefan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а зачем тогда в примере у DB2 есть пример, где выводится название языка на котором писана процедура?
как мне потом использовать эту процедуру, если нельзя получить в запросе результат процедуры?
(пример см. первый топик вконце)
...
Рейтинг: 0 / 0
Вызов процедуры (проблемка)
    #32295311
Lefan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все тема закрыта...
всем спасибо... :)

С уважение Алексей.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Вызов процедуры (проблемка)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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