【问题标题】:Wrong result in executing oracle query from servlet从 servlet 执行 oracle 查询的错误结果
【发布时间】:2013-01-02 03:08:51
【问题描述】:

我正在使用以下代码来执行查询。我想通过使用 lpad 命令和连接将结果显示为“B010025”。(25 和 B01 作为输入值给出)。但它只显示 B0125。当我从 SQL*Plus 执行它时,它显示了正确的结果。但在 servlet 中却没有。我无法理解这一点。谁能帮我得到预期的结果。

public class PickOfferNo extends HttpServlet {


protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    try {
         //TODO output your page here
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Servlet PickOfferNo</title>");  
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Servlet PickOfferNo at " + request.getContextPath () + "</h1>");
        out.println("</body>");
        out.println("</html>");

    } finally {            
        out.close();
    }
}

// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    //processRequest(request, response);

    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    try
    {
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Servlet PickOfferNo</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Servlet PickOfferNo at " + request.getContextPath () + "</h1>");
        doPost(request,response);
        out.println("</body>");
        out.println("</html>");
    }
    finally
    {
       out.close(); 
    }
}


@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    //processRequest(request, response);
    String ofrn=null;
    //String cd=null;
    //String no=null;
    String cd="B01";
    String no="25";
    JSONObject obj = new JSONObject();
    //cd=request.getParameter("sec_code");
    PrintWriter out=response.getWriter();
    try
    {
        Class.forName("oracle.jdbc.driver.OracleDriver");
        java.sql.Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.200:1521:pdsm", "test", "test");
             Statement stmt=conn.createStatement();
                 conn.setAutoCommit(true);
                 //ResultSet rs=stmt.executeQuery("select to_char(nvl(max(substr(offerno,4,4)),0)+1) into '"+no+"' from offer1 where div_sec='"+cd+"'");
                 ResultSet rs1=stmt.executeQuery("select lpad(ltrim(rtrim('"+no+"')),4,'0') from dual");
                 //while(rs1.next())
                 ofrn=cd+no;

                 //obj.put("offrn", ofrn);
                 out.println(ofrn);
    }
    catch(Exception e)
    {
        out.println(e.getMessage());
    }
}


@Override
public String getServletInfo() {
    return "Short description";
}// </editor-fold>
}

提前致谢

【问题讨论】:

  • 您没有对查询产生的ResultSet 做任何事情。顺便说一句:您为什么要为此使用查询:只需在 Java 本身中执行,这比访问数据库为您执行此操作要快得多。
  • 我正在从数据库中使用它。我刚刚检查了这个查询。没有别的

标签: java sql-server oracle servlets sqlplus


【解决方案1】:

这是因为你没有选择数据库返回的值。 执行

"select lpad(ltrim(rtrim('"+no+"')),4,'0') from dual"

不会改变“no”或“cd”的值。

您应该获取结果集并对其进行处理以访问结果集返回的第一行中的第一列。

以下代码应完成分配。 (未测试。)

ResultSet rs1=stmt.executeQuery("select lpad(ltrim(rtrim('"+no+"')),4,'0') from dual");
if(rs1.next()){
no = rs1.getString(1);
}

【讨论】:

  • 如何访问第一行的第一列?
  • @user1954492 查看帖子。我对其进行了编辑以回答您的问题。
  • @user1954492 我想知道你为什么要这样做。您可以使用 java String 函数来格式化这样的字符串。这只是为了学习JDBC吗?
  • 我需要在 android 应用程序中使用它。这就是我使用它的原因
  • 我会在 2 分钟内发布另一个问题。我期待这样的答案请留下来
【解决方案2】:

仅:

String cd="B01";
String no="25";

和:

ofrn=cd+no;

对输出结果做出贡献:

out.println(ofrn);

所以,没有什么意外发生!

【讨论】:

  • 我现在明白了,但是在执行查询之后如何获得我的预期输出
  • 作为一种选择,您可以遍历结果集并按名称或索引获取列值。
  • 例如:System.out.println("ID: " + rs.getInt("id") + " Name: " + rs.getString("Name") + " Registered on: " + rs.getDate("date"));
【解决方案3】:

您从未为cdno 赋值。

    ResultSet rs1=stmt.executeQuery("select lpad(ltrim(rtrim('"+no+"')),4,'0') from dual");
    //while(rs1.next())
    ofrn=cd+no;

    //obj.put("offrn", ofrn);
    out.println(ofrn);

【讨论】:

  • 仔细看。我已经分配了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
  • 2018-08-27
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多