Сообщения без ответов | Активные темы Текущее время: 28 мар 2024, 15:44



Ответить на тему  [ Сообщений: 15 ] 
Вызов оракловых хранимих процедур из UCCX 
Автор Сообщение
Аватара пользователя

Зарегистрирован: 03 апр 2013, 16:21
Сообщения: 1525
Приветствую дядьки.
Кто-то умеет вызывать оракловые хранимые процедуры из UCCX, как это правильно делать? Пытаюсь вызвать через DB Read простейшую процедуру без параметров и возврата, test не ругается, а в reactive debug падает в ветку SQL error. Чо может быть?


02 июл 2019, 12:26
Профиль

Зарегистрирован: 07 сен 2014, 02:54
Сообщения: 548
Откуда: Msk
Про DB Read не скажу, но там есть возможность писать свои Java Steps.
Метод наверное более избыточный, но зато более универсальный.
На Java можно написать все, что угодно.

https://developer.cisco.com/docs/contac ... java-steps

_________________
Knowledge is Power


02 июл 2019, 14:36
Профиль
Аватара пользователя

Зарегистрирован: 03 апр 2013, 16:21
Сообщения: 1525
Такой вариант знаю, но он на крайний случай потому как я Java не умею.


02 июл 2019, 15:05
Профиль

Зарегистрирован: 07 сен 2014, 02:54
Сообщения: 548
Откуда: Msk
Да там все просто. В Сети полно примеров на любую тему.
Да и вам же не нужен проект на 100500 строк.
Пишется класс на пару экранов в Far-е, компилится в командной строке и готово.
Может еще в Jar нужно завернуть, уже не помню.
Если по-другому никак не получится и будет необходимость - дайте знать, попробую помочь.

_________________
Knowledge is Power


02 июл 2019, 15:35
Профиль
Аватара пользователя

Зарегистрирован: 03 апр 2013, 16:21
Сообщения: 1525
Мне в Java сама идеология написания кода не знакома, а учиться даже азам требует времени. У меня пока завелось с костылем в виде триггера.


02 июл 2019, 16:10
Профиль

Зарегистрирован: 07 сен 2014, 02:54
Сообщения: 548
Откуда: Msk
Bessmertniy писал(а):
Мне в Java сама идеология написания кода не знакома, а учиться даже азам требует времени.

Да необязательно, я могу рыбу сделать, а детали логики самим поправите.
Шесть типовых структур везде одинаковые.
Ну сами смотрите.

_________________
Knowledge is Power


02 июл 2019, 16:35
Профиль
Аватара пользователя

Зарегистрирован: 03 апр 2013, 16:21
Сообщения: 1525
Если не сложно положите пожалуйста пример, попробую понять.


02 июл 2019, 17:46
Профиль

Зарегистрирован: 07 сен 2014, 02:54
Сообщения: 548
Откуда: Msk
Код:
import java.io.*;
import java.net.*;

//
// DB_Read (DB_Read.java)
//

public class DB_Read {

// Internal Class Variables (Global for all Metods)

    private String DSN = "DSN for DB";
    private String Srv_HostName;
    private int    Srv_Port;
    private int    Socket_Timeout;
    private int    Read_Timeout;

    private String Srv_Result;
    private boolean Print_Debug;

// Constructors

    public DB_Read(String dsn, int read_to) {
        this.DSN = dsn;
        Read_Timeout = read_to;
    }

    public DB_Read(String dsn) {
        this.DSN = dsn;
        Read_Timeout = 10;
    }

//  Useful Metods

    public String Read_Data(String command) {
//     Local Metod Variables
        String IP_str, S_in, S_out;
        Srv_Result = "ERROR";

//      Do something
//      ...

        return Translated_Result();
// or return Srv_Result;
    }

// Private Metods for internal usage

    private String Translated_Result() {
        String Tr_Result = Srv_Result;

        if (Srv_Result == null)
            Tr_Result = "ERROR";

        if (Srv_Result.equalsIgnoreCase(""))
            Tr_Result = "ERROR";

        if (Srv_Result.startsWith("ERROR"))
            Tr_Result = "ERROR";

        return Tr_Result;
    }

}

_________________
Knowledge is Power


Последний раз редактировалось Silent_D 02 июл 2019, 18:53, всего редактировалось 1 раз.



02 июл 2019, 18:25
Профиль
Аватара пользователя

Зарегистрирован: 03 апр 2013, 16:21
Сообщения: 1525
Благодарю, попытаюсь применить.


02 июл 2019, 18:33
Профиль

Зарегистрирован: 07 сен 2014, 02:54
Сообщения: 548
Откуда: Msk
Немного пояснений:

1. Сохраняем в файл DB_Read.java (Имя файла=Имя Класса).

2. Конструкторы - Методы с именем Класса, вызываемые при его создании.
Их может быть несколько с разным набором параметров.

3. Read_Data - Метод, непосредственно делающий что-то полезное.
Их тоже может быть несколько.

4. В UCCX, насколько помню, было два шага, связанных с Java.
Один, создающий Java Объект (что-то типа Create).
И один, выполняющий методы (что-то типа Run).
Соответственно, в первом указывается один из конструкторов с параметрами.
А во втором один из методов, выполняющих что-либо.
Если не разберетесь, то залезу в скрипт, посмотрю поточнее.

5. Файл нужно скомпилить, получится DB_Read.class
И его нужно загрузить в UCCX, в раздел classpath.
То ли сам class, то ли его нужно завернуть в jar, сейчас не помню.
Но это должно быть в доке описано.
Если вы используете какие-то внешние библиотеки (.jar),
то их нужно тоже загрузить в classpath.

P.S. Просьба к Java-профи помидорами не кидаться. :-)
Делалось на коленке по необходимости.
P.S.S. И method, конечно же. Sorry.

_________________
Knowledge is Power


02 июл 2019, 18:50
Профиль

Зарегистрирован: 07 сен 2014, 02:54
Сообщения: 548
Откуда: Msk
Нужно скачать и поставить JDK и добавить в path C:\Program Files\Java\jdk1.8.0_211\bin;
В cmd должно выполняться:
java -version
javac -version

Краткое руководство по Java на одной странице. :-)

Полезный cmd файл для компиляции (и запуска): jc.cmd DB_Read.java

Код:
@echo off
if [%1]==[] goto End
setlocal
for %%F in (%1) do set "FN=%%~nF"
echo\
echo Compiling %FN%.java ...
javac -classpath .;commons-io-2.6.jar;commons-lang3-3.9.jar;tinylog-1.3.6.jar;minimal-json-0.9.5.jar %FN%.java
if errorlevel 1 goto End
echo OK
echo Starting %FN%.class ...
echo\
java -classpath .;commons-io-2.6.jar;commons-lang3-3.9.jar;tinylog-1.3.6.jar;minimal-json-0.9.5.jar -Xmx1024m %FN%
:End


Еще тонкий момент - нужно выяснить, какая версия Java стоит в UCCX.
Как правило не самая последняя. Могут быть проблемы с совместимостью.
Тогда нужно использовать более старую версию JDK.

_________________
Knowledge is Power


02 июл 2019, 19:32
Профиль

Зарегистрирован: 07 сен 2014, 02:54
Сообщения: 548
Откуда: Msk
Да, и прежде, чем прикручивать свой class к UCCX, нужно убедиться,
что он работает и делает что нужно.

Код:
DB_Read.class
DB_Read.java
DB_Read_Test.class
DB_Read_Test.java
jc.cmd

Код:
//
// DB_Read_Test (DB_Read_Test.java)
//

public class DB_Read_Test {

    public static void main(String args[]) {

        String DSN = "Oracle DSN";

        DB_Read DBReader = new DB_Read(DSN, 10);
        String res = DBReader.Read_Data("DB Read Command");

        System.out.println();
        System.out.println("Result: " + res);
        System.out.println();
    }

}


Код:
C:\TEMP\_DB_Read> jc DB_Read_Test.java

Compiling DB_Read_Test.java ...
OK
Starting DB_Read_Test.class ...

Result: ERROR

C:\TEMP\_DB_Read>

Class method Read_Data работает и возвращает строку "ERROR", как и должен.

Целый HowTo по интеграции UCCX с внешними системами получился. :-)
Может кому-нибудь пригодится.

_________________
Knowledge is Power


02 июл 2019, 20:45
Профиль

Зарегистрирован: 07 сен 2014, 02:54
Сообщения: 548
Откуда: Msk
Ну и, если вернуться к началу, т.е. к тому, ради чего все это затевалось:

Google: java call oracle stored procedure with output parameter

http://www.java2s.com/Code/Java/Databas ... meters.htm

https://www.mkyong.com/jdbc/jdbc-callab ... r-example/

https://stackoverflow.com/questions/149 ... e-database

_________________
Knowledge is Power


03 июл 2019, 04:21
Профиль

Зарегистрирован: 07 сен 2014, 02:54
Сообщения: 548
Откуда: Msk
Oracle Database JDBC drivers
https://www.oracle.com/technetwork/data ... index.html

ojdbc8.jar - Certified with JDK8
http://download.oracle.com/otn/utilitie ... ojdbc8.jar

JDBC Driver (.jar) нужно подключать через Class.forName(), а не через import (см. первый пример в пред. посте):

https://stackoverflow.com/questions/196 ... me-in-java

_________________
Knowledge is Power


03 июл 2019, 04:23
Профиль

Зарегистрирован: 07 сен 2014, 02:54
Сообщения: 548
Откуда: Msk
По первой ссылке практически готовый вариант.
Только обработку исключений я бы сделал.
Если входные/выходные параметры не нужны, то их можно убрать.
Connection оставить только один - getOracleConnection().

Silent_D писал(а):
Ну и, если вернуться к началу, т.е. к тому, ради чего все это затевалось:

http://www.java2s.com/Code/Java/Databas ... meters.htm

https://www.mkyong.com/jdbc/jdbc-callab ... r-example/

https://stackoverflow.com/questions/149 ... e-database

I hope this helps. :-)

_________________
Knowledge is Power


03 июл 2019, 16:30
Профиль
Показать сообщения за:  Поле сортировки  
Ответить на тему   [ Сообщений: 15 ] 

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 41


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Designed by ST Software for PTF.
Русская поддержка phpBB