2
我使用預處理sql 使用JDBC驅動程序版本9.2.0.8.0(classes12.jar)時沒有錯誤但是,只有在稍後升級到版本9.2.0.8.0後纔會發生此錯誤。 錯誤代碼是在索引缺少IN或OUT參數索引錯誤時缺少IN或OUT參數
以下是我的代碼。
BEGIN
SELECT sysdate
INTO :today
FROM dual;
BEGIN
SELECT sysdate
INTO :today2
FROM dual;
EXCEPTION
WHEN OTHERS THEN
:today2 := NULL;
END;
SELECT sysdate
INTO :today4
FROM dual;
END;
我的問題是,不能使用EXCEPTION,sql?還是有其他解決方案可用於A?
我的JSP文件
<%@ page contentType="text/html; charset=euc-kr"%>
<%@ page import="java.util.*, java.io.*, java.sql.*"%><%!private Connection conn;
private PreparedStatement stmt;
private DatabaseMetaData meta;
//*********************************************************************************
// 여기에 DB정보를 적어 주십시오.
public static final String URL = "jdbc:oracle:thin:@192.168.10.38:1521:ora920";
public static final String DRIVER_NAME = "oracle.jdbc.driver.OracleDriver";
public static final String ID = "scott";
public static final String PW = "tiger";
//*********************************************************************************
public void jspInit()
{
try
{
Class.forName(DRIVER_NAME);
conn = DriverManager.getConnection(URL, ID, PW);
}
catch(ClassNotFoundException ce)
{
//getServletContext().log("Error: Database Driver Class : " + DB_CLASS_NMAE);
ce.printStackTrace();
}
catch(SQLException ioe)
{
ioe.printStackTrace();
//getServletContext().log("Error: DB Connection Error : " + ioe);
}
}
public void jspDestroy()
{
try
{
if(conn != null)
conn.close();
}
catch(SQLException ioe)
{
ioe.printStackTrace();
//getServletContext().log("Error: Server Write Exception : " + ioe);
}
}%>
<%
conn = DriverManager.getConnection(URL, ID, PW);
ResultSet empCursor = null;
try
{
//pstmt = rdconn.prepareStatement(query);
//stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
meta = conn.getMetaData();
out.println("JDBC Driver Information<br>");
out.println("---------------------------------<br>");
out.println("version; " + meta.getDriverVersion() + "<br>");
out.println("<br>");
out.println("Database Information<br>");
out.println("---------------------------------<br>");
out.println("database name; " + meta.getDatabaseProductName() + "<br>");
out.println("version; " + meta.getDatabaseProductVersion() + "<br>");
out.println("<br>");
}
catch(Exception e)
{
out.println(toHangle("Error occurred<br>") + toHangle(e.toString()));
}
finally
{
}
out.println("---------------------------------<br>");
out.println("Pretreatment test<br>");
out.println("---------------------------------<br>");
// 전처리 테스트
StringBuilder plsql = new StringBuilder();
plsql.append("BEGIN\n");
plsql.append(" SELECT sysdate\n");
plsql.append(" INTO :today1\n"); // 첫 번째 Parameter
plsql.append(" FROM dual;\n");
plsql.append(" BEGIN\n");
plsql.append(" SELECT sysdate\n");
plsql.append(" INTO :today2\n"); // 두 번째 Parameter
plsql.append(" FROM dual;\n");
// 에러 발생 원인은 EXCEPTION 안 parameter를 사용하는 경우
plsql.append(" EXCEPTION\n");
plsql.append(" WHEN OTHERS THEN\n");
plsql.append(" :today2 := NULL;\n"); // 두 번째 Parameter
//
plsql.append(" END;\n");
plsql.append(" SELECT sysdate\n");
plsql.append(" INTO :today3\n"); // 세 번째 Parameter
plsql.append(" FROM dual;\n");
plsql.append("END;\n");
out.println("<pre>" + plsql.toString() + "</pre>");
try
{
out.println("CallableStatement cstmt = conn.prepareCall()<br>");
CallableStatement cstmt = conn.prepareCall(plsql.toString());
// today1~3 갯수에 맞게 3개의 OutParameter를 등록
for(int j = 1; j <= 3; j++)
{
out.println("cstmt.registerOutParameter(" + j + ", " + Types.CHAR + ")<br>");
cstmt.registerOutParameter(j, Types.CHAR);
}
// 최신 Oracle JDBC Driver에서 에러 발생
out.println("// 최신 Oracle JDBC Driver에서 에러 발생<br>");
out.println("cstmt.execute()<br>");
cstmt.execute();
out.println("<font color=blue>전처리 실행 성공!!</font>");
}
catch(Exception e)
{
out.println("<font color=red>전처리 실행 실패!!</font>");
out.println("<br>---------------------------------<br>");
out.println("Exection<br>");
out.println("<pre>");
e.printStackTrace(new PrintWriter(out));
out.println("</pre>");
}
%>
<%!private String toHangle(String oldString) throws UnsupportedEncodingException
{
if(oldString != null)
{
return new String(oldString.getBytes("KSC5601"), "8859_1");
}
else
{
return oldString;
}
}%>
你可以附上你的Java代碼? –
@GustiArya感謝上傳我的jsp代碼 –
爲什麼你使用這樣一個過時的驅動程序版本?你真的**還在使用Java 1.2嗎? –