简体   繁体   English

使用jdbc从Web应用程序连接到Oracle 11g时出现SQL异常

[英]SQL Exception while connecting to oracle 11g from web application using jdbc

I am getting SQL Exception. 我正在获取SQL异常。

The following is my code, 以下是我的代码,

 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());
    }

    }

And the following is the stacktrace - 以下是stacktrace-

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

ORA-06512: at "SYSTEM.LOGIN", line 10 ORA-06512: at line 1 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)

The following is my PL/SQL function login - 以下是我的PL / SQL函数登录-

CREATE OR REPLACE FUNCTION login(p_uname IN varchar2, p_pword 

IN varchar2) RETURN String AS IN varchar2)返回字符串AS

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

BEGIN 开始

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;

END login; 结束登录; / /

As mentioned by skaffman, the Oracle JDBC driver doesn't support PL/SQL boolean type. 如skaffman所述,Oracle JDBC驱动程序不支持PL / SQL布尔类型。 So I changed the return type to varchar. 所以我将返回类型更改为varchar。 One more critical thing missing in my PL/SQL code was the exception handling in case of 0 rows returned ie NO_DATA_FOUND 我的PL / SQL代码中缺少的另一件重要的事情是在返回0行的情况下的异常处理,即NO_DATA_FOUND

Added that exception in the PL/SQL function login and changed the location of Returning 'False' to exception section as IF NO_DATA_FOUND THEN Return 'False'; 在PL / SQL函数登录中添加了该异常,并将将“ False”返回到异常部分的位置更改为IF NO_DATA_FOUND THEN返回“ False”;

You have a mis-match between the parameter types as declared by the login PL/SQL function, and the types you're setting in the Java. login PL / SQL函数声明的参数类型与Java中设置的参数类型不匹配。 The boolean seems like the most likely candidate. boolean似乎是最有可能的候选者。 Make sure the return type of login is really compatible with java booleans. 确保login的返回类型确实与java布尔值兼容。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 使用JDBC在本地主机中连接Oracle 11G时出错 - Error in connecting oracle 11G in localhost using JDBC 在没有JDBC的情况下将Android应用程序与远程Oracle数据库10g或11g连接 - Connecting Android application with Remote oracle database 10g or 11g without JDBC 如何使用JDBC从Oracle 11g获取注释? - How to fetch Comments from a Oracle 11g using JDBC? java.sql.SQLException:Io异常:在与oracle 11g进行JDBC连接期间,从读取调用中减去了一个 - java.sql.SQLException: Io exception: Got minus one from a read call during JDBC connection with oracle 11g 无法使用jdbc连接到Oracle 11g - Unable to connect to Oracle 11g using jdbc 使用JDBC获取Oracle 11g的最后一个插入ID - Get last insert id with Oracle 11g using JDBC 使用JDBC从Oracle 11g删除记录 - Deleting records from Oracle 11g with JDBC 如何使用Dataflow的jdbc to Bigquery模板将数据从Oracle 11g第2版传输到Bigquery? - How to transfer data from Oracle 11g release 2 to Bigquery using Dataflow's jdbc to Bigquery template? Oracle 11g:使用简单的 jdbc 调用将数组作为输入参数传递给 oracle 存储过程 - Oracle 11g: Pass array as input parameter to an oracle stored procedure using simple jdbc call 无法使用JDBC连接到Oracle 11g - 指定了无效的oracle URL - Unable connect to Oracle 11g using JDBC - Invalid oracle URL specified
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM