【问题标题】:SQL Exception while connecting to oracle 11g from web application using jdbc使用 jdbc 从 Web 应用程序连接到 oracle 11g 时出现 SQL 异常
【发布时间】:2011-08-08 02:55:38
【问题描述】:

我收到 SQL 异常。

以下是我的代码,

 public DBConnect()
    {
      try {
            // Load the Oracle JDBC driver
            DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());

            // connect through driver
             conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","system","system123");
           //  conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:XE","system","system123");


            // create a statement object

             CallableStatement cstmt = null;
             String auth;

             try {
                 cstmt = conn.prepareCall("{? = call login(?,?)}");
                 cstmt.registerOutParameter(1, java.sql.Types.BOOLEAN);
                 cstmt.setString(2, "aniket");
                 cstmt.setString(3, "aniket");
                 cstmt.execute();
                 auth = cstmt.getString(1);
                 cstmt.close();

                 System.out.println(auth);

             } catch (SQLException e) {

                 e.printStackTrace();

             }

        } catch (SQLException ex) {
            Logger.getLogger(DBConnect.class.getName()).log(Level.SEVERE, null, ex);
        }
    catch(Exception e)
    {
        //system.out.println(e.printStackTrace());
    }

    }

以下是堆栈跟踪 -

java.sql.SQLException: ORA-01403: no data found

ORA-06512:在“SYSTEM.LOGIN”,第 10 行 ORA-06512: 在第 1 行

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:113)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:754)
at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:218)
at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:971)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1192)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3415)
at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3521)
at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4612)
at com.me.db.DBConnect.<init>(DBConnect.java:57)
at com.me.controller.PreLoginController.handleRequestInternal(PreLoginController.java:25)
at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153)
at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:809)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:203)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:558)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:379)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:242)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:259)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:281)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)

以下是我的PL/SQL函数登录-

CREATE OR REPLACE FUNCTION login(p_uname IN varchar2, p_pword 

IN varchar2) 返回字符串 作为

v_uname varchar2(30); v_pword varchar2(30);

开始

SELECT uname, pword INTO v_uname, v_pword
FROM user_account
WHERE uname = p_uname AND  pword = p_pword;

IF (v_uname IS NULL OR v_pword IS NULL) THEN

    return 'Failed';

ELSE

    return 'Success';

END IF;

结束登录; /

【问题讨论】:

    标签: java jdbc oracle11g


    【解决方案1】:

    正如 skaffman 所述,Oracle JDBC 驱动程序不支持 PL/SQL 布尔类型。 所以我把返回类型改成了varchar。 我的 PL/SQL 代码中缺少的另一件事是在返回 0 行时的异常处理,即 NO_DATA_FOUND

    在 PL/SQL 函数登录中添加了该异常,并将 Returning 'False' 到异常部分的位置更改为 如果 NO_DATA_FOUND 那么 返回“假”;

    【讨论】:

      【解决方案2】:

      login PL/SQL 函数声明的参数类型与您在 Java 中设置的类型不匹配。 boolean 似乎是最有可能的候选人。确保login 的返回类型确实与java booleans 兼容。

      【讨论】:

      • 在检查了堆栈跟踪之后,我也这么认为,但是函数返回一个布尔值
      • @acoolguy:啊,好的。我似乎记得 Oracle 的 JDBC 驱动程序实际上并不支持 PL/SQL BOOLEAN 类型。您的错误表明他们仍未解决此问题。
      • 现在我已经更改了我的 login.sql 现在它返回一个字符串,我将编辑上面的文件。现在错误不同了,虽然我在 user_account 表中插入了一行,但错误是找不到数据
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 2019-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多