Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / ошибка при получении структуры из хранимой процедуры Oracle / 8 сообщений из 8, страница 1 из 1
13.05.2015, 09:12
    #38957044
SergeyAKa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка при получении структуры из хранимой процедуры Oracle
Цель - нужно получить структуру с данными из Оракловой хранимой процедуры
Сервис работает под GlassFish 3.2.1
Используется пул коннектов встроенный в GlassFish

Что сделал

Создал объектный тип

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create or replace type HB_DPS_OBJ as object (number_  varchar2(50)
                                            , CloseOperationDate date          
                                            , DepositAccNumber   varchar2(20) 
                                            , OpeningRest        number        
                                            , CreditTurn         number        
                                            , DebitTurn          number        
                                            , ClosingRest        number        
                                            , TotalOperation     number       
                                            )




Сделал процедуру, которая возвращает этот объект

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
procedure getAccount(p#owner_id varchar2 , p#acc varchar2, p#dateStart date, p#dateEnd date, p#accData out HB_DPS_OBJ) 
is
r#acc acc%rowtype;
n number ;
begin 
  

   p#accData := HB_DPS_OBJ(
                           number_ => p#acc
                         , CloseOperationDate => '01.01.2015'
                         , DepositAccNumber => 12345789
                         , OpeningRest => 100
                         , CreditTurn => 1000
                         , DebitTurn => 500
                         , ClosingRest => 600
                         , TotalOperation => 3
                         );
                  

   
end;  



Сделал скрипт для проверки, который показал, что процедура работает

После этого сделал метод, который должен запросить данные из процедуры и передать сервису

Код: java
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.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
package ru.homebank.deposit.ws;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleTypes;
//import oracle.
import ru.homebank.tools.DataAccessFactory;
import ru.homebank.tools.JDBCUtils;
import oracle.sql.STRUCT;
import ru.homebank.tools.Tools;


public class DepositExctractInfo extends DepositExtract{
    org.apache.log4j.Logger logger =  org.apache.log4j.Logger.getLogger(this.getClass());
    static final JDBCUtils jdbcUtils = DataAccessFactory.getJDBCUtils();

    int retCode;
    String ownerID ;
    /******************************************************************
     * Конструктор
     * @param branchID
     * @param number
     * @param ownerID
     * @param dateStart
     * @param dateEnd
     * @param planOperFlag 
     */
    public DepositExctractInfo(java.lang.String branchID, java.lang.String number, java.lang.String ownerID, javax.xml.datatype.XMLGregorianCalendar dateStart, javax.xml.datatype.XMLGregorianCalendar dateEnd, java.lang.Boolean planOperFlag) throws Exception{
       this.setDateStart(dateStart);
       this.setDateEnd(dateEnd);
       this.setNumber(number);
       this.ownerID = ownerID;
       
       //запросить данные о счете
        Connection conn = null;
        PreparedStatement ps = null;
        CallableStatement stmt = null;
        ResultSet   res = null;

        retCode = 0;
        try {
            conn = jdbcUtils.getConnection();
        
            stmt =  conn.prepareCall("{ call hb_dps_lib.getAccount(?,?, ?, ?, ?) }");
            
            stmt.setString(1, ownerID);
            stmt.setString(2, number);
            stmt.setDate(3, Tools.convToSqlDate(dateStart));
            stmt.setDate(4, Tools.convToSqlDate(dateEnd));

            stmt.registerOutParameter(5, OracleTypes.STRUCT, "HB_DPS_OBJ");
            
            stmt.execute();

            STRUCT ora_record ;
            ora_record = ((OracleCallableStatement)stmt).getSTRUCT(5);

/*        
            for( Object attr: ora_record.getAttributes()){
                logger.info("attr=>"+attr);
            }
*/            
            
            
            
        }catch(SQLException oe){
            switch(oe.getErrorCode()) 
            {
                case -20002 : retCode = 2; break;   //не найден клиент
                case -20003 : retCode = 3; break;   //не найден депозит
                default : retCode = 999    ;
            }    
            logger.error(oe);
            
        }catch(Exception e){
            retCode =  999; 
            logger.error(e);
        } finally {
            if (!stmt.isClosed()) stmt.close();
            if (!conn.isClosed()) conn.close();
        }    
       
       
    }   
    
    /************************************************************
     * Вернуть код возврата
     * @return 
     */
    public Long getRetCode(){
        return new Long(retCode);
    }
}




В итоге получаю ошибку

java.lang.ClassCastException: com.sun.gjc.spi.jdbc40.CallableStatementWrapper40 cannot be cast to oracle.jdbc.OracleCallableStatement

Что-то видать не доделал. Но не могу понять, что именно.

Спасибо
...
Рейтинг: 0 / 0
13.05.2015, 09:21
    #38957049
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка при получении структуры из хранимой процедуры Oracle
JDBCUtils хорошо бы глянуть.
CallableStatementWrapper40 похож на сопли от GlassFish DataSource
Нужно вызвать его метод unwrap, чтобы получить внутренний CallableStatement, который предположительно должен быть OracleCallableStatement.
Ну, и по-хорошему вместо прямого кастинга к OracleCallableStatement хорошо бы использовать instanceof чтобы выкидывать более понятное исключение в случае если полученный объект другого типа.
...
Рейтинг: 0 / 0
13.05.2015, 09:24
    #38957052
SergeyAKa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка при получении структуры из хранимой процедуры Oracle
BlazkowiczJDBCUtils хорошо бы глянуть.

Код: java
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.
package ru.gpb.ekb.homebank.tools;

import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import org.apache.log4j.Logger;


/**
 *
 * @author ksa
 */
public class JDBCUtils {
    private static final Logger log = Logger.getLogger(JDBCUtils.class.getName());
    private DataSource dataSource;    
    
    public JDBCUtils(){
        
    }
    
    public void init(String dataSourceName) {
        try {
            InitialContext initContext = new InitialContext();
            dataSource = (DataSource) initContext.lookup(dataSourceName);
        } catch (NamingException e) {
            log.error("JNDIException: " + e.getMessage());
        }
    }
    
    
    public Connection getConnection() throws SQLException {
        if (dataSource == null) {
            throw new SQLException("DataSource is null.");
        }

        return dataSource.getConnection();
    }
    
    
    
}                
...
Рейтинг: 0 / 0
13.05.2015, 09:36
    #38957059
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка при получении структуры из хранимой процедуры Oracle
SergeyAKa
Код: plsql
1.
create or replace type HB_DPS_OBJ as object


нафиг тебе из БД тащить в таком формате?
У тебя там БЛ и JOIN на объектах?
...
Рейтинг: 0 / 0
13.05.2015, 09:37
    #38957060
0FD
0FD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка при получении структуры из хранимой процедуры Oracle
SergeyAKa,
Код: java
1.
2.
3.
4.
OracleCallableStatement ostmt=stmt.unwrap(OracleCallableStatement.class);
if(ostmt!=null){
 ora_record = ostmt.getSTRUCT(5);
}
...
Рейтинг: 0 / 0
13.05.2015, 09:38
    #38957064
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка при получении структуры из хранимой процедуры Oracle
...
Рейтинг: 0 / 0
13.05.2015, 10:02
    #38957080
0FD
0FD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка при получении структуры из хранимой процедуры Oracle
Blazkowicz,

Да, честно говоря пропустил ответ, не писал бы, но в драйверах 11g уже точно есть поддержка Wrapper.
...
Рейтинг: 0 / 0
13.05.2015, 10:29
    #38957106
SergeyAKa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка при получении структуры из хранимой процедуры Oracle
Все получилось!!!
Спасибо.
Правда пришлось еще добавить строчку

Код: java
1.
2.
3.
4.
5.
6.
7.
        Connection jconn = null;
        OracleConnection conn = null;

        retCode = 0;
        try {
            jconn = jdbcUtils.getConnection();
            conn = jconn.unwrap(OracleConnection.class);
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / ошибка при получении структуры из хранимой процедуры Oracle / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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