Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > CallableStatement


Автор: Bandit 1.3.2009, 13:05
Доброго времени суток.
Есть таблица(БД Oracle 10g Express Edition):
Код

CREATE TABLE Users 
(
    id_user NUMBER(5) NOT NULL PRIMARY KEY,
    nickname VARCHAR2(30),
  password VARCHAR2(30),
    e_mail VARCHAR2(30),
  birthday DATE,
  bank NUMBER
);


Есть функция:
Код


create or replace
PACKAGE myTypes
AS
    TYPE ref_cursor IS REF CURSOR;
END;

CREATE OR REPLACE FUNCTION FUNC_GET_ALL_USERS RETURN myTypes.ref_cursor 
AS
  user_cursor myTypes.ref_cursor;
BEGIN
  OPEN user_cursor FOR
      SELECT * FROM USERS;
  RETURN user_cursor;
END;



Код

Connection connect = null;
        CallableStatement callableStatement = null;
        try{
            connect = connectionPool.getConnection();
            try{
                
                //begin ? := FUNC_GET_ALL_USERS(); end;
                //{CALL ? := FUNC_GET_ALL_USERS()}
                
                callableStatement = connect.prepareCall("{CALL ? := FUNC_GET_ALL_USERS()}");
                callableStatement.registerOutParameter(1, OracleTypes.CURSOR);
                callableStatement.execute();//---------------------------------ошибка вылетает при выполнении
                ResultSet rs = callableStatement.getResultSet();
                while(rs.next()){
                    System.out.println(rs.getString("nickname"));
                }
            }finally{
                connect.close();
            }
        }catch(SQLException e){
            System.out.println(e);
        }


java.sql.SQLException: Нарушение протокола

В чем может быть проблема? Кто-нибудь сталкивался? Или я что-то не так делаю? 

Автор: _sten_ 1.3.2009, 14:08
Попробуй так:
callableStatement = connect.prepareCall("{?=call FUNC_GET_ALL_USERS()}");

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

callableStatement = connect.prepareCall("{?=call mypackage.FUNC_GET_ALL_USERS()}");

Автор: Bandit 1.3.2009, 14:36
_sten_,  спасибо за внимание к моей проблеме... но у меня функция не в пакте... в пакете я объявил свой новый тип:TYPE ref_cursor IS REF CURSOR;
который использую далее... в том числе и в свой функции... но все-равно спасибо smile

просто банально не могу понять что это за ошибка: java.sql.SQLException: Нарушение протокола... и чем она вызвана... :(

StackTrace ошибки

java.sql.SQLException: Нарушение протокола
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:162)
    at oracle.jdbc.driver.DatabaseError.check_error(DatabaseError.java:885)
    at oracle.jdbc.driver.T4C7Ocommoncall.receive(T4C7Ocommoncall.java:133)
    at oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:385)
    at oracle.jdbc.driver.PhysicalConnection.close(PhysicalConnection.java:1036)
    at by.bsuir.db.jdbs.JDBCUserDAO.getAllUsers(JDBCUserDAO.java:40)
    at by.bsuir.jsf.manager.ManagerJsfBean.login(ManagerJsfBean.java:34)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.sun.el.parser.AstValue.invoke(Unknown Source)

Автор: _sten_ 1.3.2009, 15:39
ошибка либо сдесь 
callableStatement = connect.prepareCall("{CALL ? := FUNC_GET_ALL_USERS()}");
либо на стороне оракла

кста не {CALL ? := FUNC_GET_ALL_USERS()} а {?=call FUNC_GET_ALL_USERS()}

Автор: Bandit 1.3.2009, 15:56
_sten_, кста не {CALL ? := FUNC_GET_ALL_USERS()} а {?=call FUNC_GET_ALL_USERS()}


 http://www.enterprisedt.com/publications/oracle/result_set.html   ...   делаю все в соответствии только не передаю параметр в функцию.

Автор: _sten_ 1.3.2009, 16:53
вот всегда делал так:
Код

 DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
        Connection connect = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "test", "test");
        try {

            CallableStatement st = connect.prepareCall("{?=call FUNC_GET_ALL_USERS()}");
            st.registerOutParameter(1, OracleTypes.CURSOR);
            st.execute();
            ResultSet rs = (ResultSet) st.getObject(1);
            while (rs.next()) {
                System.out.println(rs.getString(0));
            }
        } finally {
            connect.close();
        }



проверил работает

Автор: Bandit 1.3.2009, 17:26
взял твой код... та же проблема... без изменений... 

Код

java.sql.SQLException: Нарушение протокола
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:162)
    at oracle.jdbc.driver.DatabaseError.check_error(DatabaseError.java:885)
    at oracle.jdbc.driver.T4C7Ocommoncall.receive(T4C7Ocommoncall.java:133)
    at oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:385)
    at oracle.jdbc.driver.PhysicalConnection.close(PhysicalConnection.java:1036)
    at by.bsuir.db.jdbs.JDBCUserDAO.getAllUsers(JDBCUserDAO.java:61)
    at by.bsuir.jsf.manager.ManagerJsfBean.login(ManagerJsfBean.java:34)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.sun.el.parser.AstValue.invoke(Unknown Source)
    at com.sun.el.MethodExpressionImpl.invoke(Unknown Source)
    at com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68)
    at com.sun.facelets.el.LegacyMethodBinding.invoke(LegacyMethodBinding.java:69)
    at org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:61)
    at javax.faces.component.UICommand.broadcast(UICommand.java:141)
    at javax.faces.component.UIViewRoot._broadcastForPhase(UIViewRoot.java:115)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:191)
    at org.apache.myfaces.lifecycle.InvokeApplicationExecutor.execute(InvokeApplicationExecutor.java:32)
    at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:105)
    at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:80)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:143)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:301)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Unknown Source)



_sten_,  спасибо огромное в любом случае... если есть идеи в чем может быть проблема, то готов выслушать smile))

Автор: _sten_ 1.3.2009, 23:37
может  хранимка либо пакет не откомпилен?

Автор: mbasil 4.3.2009, 12:05
Попробуйте так:
Код

ResultSet rs = ((OracleCallableStatement)callableStatement).getCursor(1);


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)