Backend/Java

[JSP] 쿼리문 실행 오류

비비빅B 2020. 7. 9. 15:14

java.sql.SQLSyntaxErrorException: ORA-00900: SQL 문이 부적합합니다


  • SQL 문법오류에 여러가지 이유가 있지만
  • 이번 경우에는 툴 명령어와 SQL 조회문을 구분하지 못해서 생긴 문제
  • DESC<TABLE>는 SQL문이 아닌 SQLPLUS툴의 명령어
  • 따라서 SQL문이 부적합하다는 오류가 발생
DESC EMP		-- SQLPLUS 데이터 구조 조회 명령어

  • TABLE의 데이터를 조회하기 위해서는
  • USER_TABLES 테이블에서 필요한 컬럼을 추출해야함
SELECT COLUMN_NAME,
		DATA_TYPE,
       DATA_LENGTH,
       NULLABLE
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME='EMP'
ORDER BY COLUMN_ID

<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.SQLException"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
	<%
	String id = "scott";
	String password = "tiger";
	String url = "jdbc:oracle:thin:@localhost:1521:ORCL";
	String query = "SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH, NULLABLE FROM USER_TAB_COLUMNS WHERE TABLE_NAME='" + request.getParameter("table") + "' ORDER BY COLUMN_ID";
	
	Connection conn = null;
	Statement stmt = null;
	ResultSet rs = null;
	%>
	<table>
		<thead>
			<tr>
				<th>컬럼명</th>
				<th>컬럼형식</th>
				<th>컬럼길이</th>
				<th>널값여부</th>
			</tr>
		</thead>
		<tbody>
	<%
		try{
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection(url, id, password);
			stmt = conn.createStatement();
			rs = stmt.executeQuery(query);

			while (rs.next()) {
	%>
			<tr>
				<td><%= rs.getString(1) %></td>
				<td><%= rs.getString(2) %></td>
				<td><%= rs.getString(3) %></td>
				<td><%= rs.getString(4) %></td>
			</tr>
	<%
		}} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			if (rs != null) rs.close();
			if (stmt != null) stmt.close();
			if (conn != null) conn.close();
		}
	%>
		</tbody>
	</table>
</body>
</html>
  • 참고로 JSP에서 SQL문을 쓸 때 세미콜론은 적지 않음
  • 세미콜론 적으면 똑같이 오류뜸
	<%
	String query = "SELECT * FROM EMP";		// 맞는 표현
	String query = "SELECT * FROM EMP;";		// 틀린 표현
	%>

https://okky.kr/article/98050