powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / ошибка при получении структуры из хранимой процедуры Oracle
8 сообщений из 8, страница 1 из 1
ошибка при получении структуры из хранимой процедуры Oracle
    #38957044
SergeyAKa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Цель - нужно получить структуру с данными из Оракловой хранимой процедуры
Сервис работает под 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
ошибка при получении структуры из хранимой процедуры Oracle
    #38957049
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDBCUtils хорошо бы глянуть.
CallableStatementWrapper40 похож на сопли от GlassFish DataSource
Нужно вызвать его метод unwrap, чтобы получить внутренний CallableStatement, который предположительно должен быть OracleCallableStatement.
Ну, и по-хорошему вместо прямого кастинга к OracleCallableStatement хорошо бы использовать instanceof чтобы выкидывать более понятное исключение в случае если полученный объект другого типа.
...
Рейтинг: 0 / 0
ошибка при получении структуры из хранимой процедуры Oracle
    #38957052
SergeyAKa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
ошибка при получении структуры из хранимой процедуры Oracle
    #38957059
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergeyAKa
Код: plsql
1.
create or replace type HB_DPS_OBJ as object


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

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

Код: 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
8 сообщений из 8, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / ошибка при получении структуры из хранимой процедуры Oracle
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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