jsp와 java, html의 퓨전으로 성적 계산 처리하는 예제

안녕하세요

이번에는 이클립스 환경에서

jsp, java, html 각각의 소스로 성적 계산을 하는 예제를 올려봅니다.


옛날에 html, javascript 를 블로그에도 조금 올리고 다루었지만

1달 정도 안했더니 이게 완전 리셋된것처럼 적응이 안되네요 ㅜ

역시 프로그래밍 언어는 하루에 조금씩이라도 계속 손을 대야 녹슬지 않고 유지되는것 같습니다.


자 어쨋든 예제 소스 코드 올려봅니다.

파일 구성은 jsp 파일 두개입니다.

데이터를 입력 받는 클래스와 그 결과를 처리하는 클래스 두개입니답~!!



==========================================================

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<!doctype html>
<html>
   <head><title>::성적 계산::</title>
   <link rel="stylesheet" type="text/css" href="../css/memo.css">
   <script type="text/javascript">
   //유효성 체크하는 함수 만들기
   var send=function(){
      //학번 체크
   
      //var n = getElementById('num');
      if(!f.num.value){
         alert('학번을 입력하세요.');
         f.num.focus();
         return;
      }
      if(isNaN(f.java.value)){
         alert('자바점수가 숫자가 아니에요');
         f.java.select();
         return;
      }
      if(isNaN(f.db.value)){
         alert('DB점수가 숫자가 아니에요');
         f.db.select();
         return;
      }
      if(isNaN(f.jsp.value)){
         alert('JSP점수가 숫자가 아니에요');
         f.jsp.select();
         return;
      }
      f.submit();
   }
 
   </script>
 
</head>
   <body>
   <h1>성적입력</h1>
   <form name="f" action="Result.jsp" method="post">
   <table border=1>
      <tr>
         <td colspan="2">학번</td>
         <td>
         <input type="text" name="num" id="stuNum">
         </td>
      </tr>
      <tr>
         <td rowspan="3">과목</td>
         <td>Java</td>
         <td>
         <input type="text" name="java" >
         </td>
      </tr>
      <tr>
         <td>Database</td>
         <td>
         <input type="text" name="db" >
         </td>
      </tr>
      <tr>
         <td>JSP</td>
         <td>
         <input type="text" name="jsp" >
         </td>
      </tr>
      <tr>
         <td colspan="3">
         <button type="button" onclick="send()">전송</button>
         </td>
      </tr>
   </table>
   </form>
   </body>

</html>


==========================================================

위 소스 코드를 실행하면..




위와 같은 창 화면이 빈 텍스트 창에 값을 입력하면

Result.jsp로 이동하면서 결과 화면이 출력됩니다.






Result.jsp 소스 코드는 바로 아래 올려드립니다.


==========================================================

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<!doctype html>
<html>
<head><title>::성적 계산::</title>
<link rel="stylesheet" type="text/css" href="../css/memo.css">
<script type="text/javascript">

<%
//1. 사용자가 입력한 값 받기(num, java, db, jsp)
//내장객체 : request. HttpServletRequest 타입 : response. HttpServletResponse 타입
String num=request.getParameter("num");
String jav=request.getParameter("java");
String db=request.getParameter("db");
String jsp=request.getParameter("jsp");
out.println("학번 : "+num+", java="+jav+", db="+db+", jsp="+jsp);
// 유효성 체크 널 체크 => 요청 경로가 잘못된 경우
if(num==null||jav==null||db==null||jsp==null){
//response.sendRedirect("ex06.jsp");
%>
//자바스크립트 처리방식
<script type="text/javascript">
alert('잘못 들어온 경로입니다');
location.href='ex06.jsp';
</script>
<%
return;
}
//3. 빈문자열로 넘어올 경우 0점 처리 
if(jav.trim().isEmpty()){
jav="0";
}
if(db.trim().isEmpty()){
db="0";
}
if(jsp.trim().isEmpty()){
jsp="0";
}
int javInt=Integer.parseInt(jav.trim());
int dbInt=Integer.parseInt(db.trim());
int jspInt=Integer.parseInt(jsp.trim());
int sum=javInt+dbInt+jspInt;
float avg=sum/3.0f;

%>

<br> sum: <%=sum %>
<br> avg: <%=avg %>
</script>

<table border='1'>
<tr>
<td colspan="2">학번</td>
<td>
<b><%=num%></b>
</td>
</tr>
<tr>
<td rowspan="3">과목</td>
<td>Java</td>
<td>
<b><%=javInt%></b>
</td>
</tr>
<tr>
<td>Database</td>
<td>
<b><%=dbInt%></b>
</td>
</tr>
<tr>
<td>JSP</td>
<td>
<b><%=jspInt %></b>
</td>
</tr>
<tr>
<td colspan="2">평균점수</td>
<td style="color:red">
<b><%=avg%></b>
</td>
</tr>
<tr>
<td colspan="3">
<button type="button" onclick="history.back()">입력화면</button>
</td>
</tr>
</table>
</html>

==========================================================

page 지시어를 이용한 예외 처리 페이지 지정

안녕하세요

이번 시간에는 오라클 DB에 접근하는데 접근 권한 거부나 계정 정보가 불일치하여

접근이 안되는 예외 상황이 발생하면 PAGE 지시어를 이용하여 예외 처리 페이지를

지정하는 예제를 올려봅니다.


저번에는 스샷을 안 찍었는데, 이번에는 스샷 찍겠습니답!!


일단 먼저 오라클 db에 접근하는 소스를 올려봅니다.

==========================================================

<%@ page contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.sql.*"%>

<%@ page errorPage="error.jsp" %>
<%-- 이 페이지에서 예외가 발생하면 error.jsp에서 처리하겠다는 의미 --%>

<h1>page 지시어를 이용한 예외 처리 페이지 지정</h1>

<%
Class.forName("oracle.jdbc.driver.OracleDriver");
String url="jdbc:oracle:thin:@localhost:1521:ORCL";
String user="scottt", pwd="tiger";
Connection con=DriverManager.getConnection(url,user,pwd);
out.println("<h1>DB연결 성공</h1>");

String sql="SELECT * FROM TAB";
Statement st=con.createStatement();
ResultSet rs=st.executeQuery(sql);
%>

<h2 style="color:red"><%=user%>계정의 테이블 목록</h2>

<%
while(rs.next()){
String tname=rs.getString(1);
String type=rs.getString(2);
out.println("<li>"+tname+": "+type+"</li>");
}

if(rs!=null) rs.close();
if(st!=null) st.close();
if(con!=null) con.close();

//cmd->sqlplus -> purge recyclebin; 해서 scott 계정에 있는 찌거기 데이터 비우기 -> 출력 결과 깔끔하게 나옴
%>

=========================================================

위의 소스 코드를 실행하면 아래와 같은 화면이 출력됩니다.

scott 계정의 테이블 목록을 다 보여줍니다.



하지만 간혹..

'String user="scottt", pwd="tiger";' 와 같이

scott인 아이디에 't' 를 하나 붙여서 로그인을 실패하면

error.jsp 에서 예외가 발생된 상황에 대해 처리하는 소스를 기술해야 합니다.


자 그럼 바로 소스 올려봅니다.

딱히 별건 없습니답 ^^


=========================================================

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ page isErrorPage="true" %>
<%
response.setStatus(response.SC_OK);
//ie에서는 위 코드를 지정해야 에러 처리 페이지가 동작한다
%>

<%-- error.jsp 페이지에서는 page 지시어에 반드시 isErrorPage 라는 속성값으로 true를 주어야 한다.
그래야 exception 이라는 내장 객체를 사용할 수 있다. --%>

<!DOCTYPE html>
<html>
<head><title>error 처리 페이지</title></head>
<body>
<div align="center">
<table style="width:600px;height:400px;background-color:#efefef">
<tr>
<td style="color:red;text-align:center">
<%
if(exception instanceof java.sql.SQLException){
out.println("서버오류: "+exception.getMessage());
}else{
out.println("오류발생: "+exception.getMessage());
}
exception.printStackTrace(); // 스택 기록 찍기(서버 콘솔에)
%>
</td>
</tr>
</table>
</div>
</body>
</html>

=========================================================

위의 계정이 틀렸으면 저 소스 코드 페이지로 이동되어 처리됩니다.





jsp 스크립팅 요소 - jsp Scripting Element

안녕하세요

이번 시간에는 jsp 구성 요소 중 스크립팅 요소에 대해 글을 써보겠습니다.

아 jsp 뭔가 적응이 안되네요;;

자바가 이제 적응되려고 했는데, jsp를 새로 배워보니 음..

하지만

문을 계속 두드리면 좋은 결과가 있을 겁니다.


JSP의 스크립팅 요소에는 크게 3가지가 있습니다.

바로 선언문(declaration), 실행문(scriptlet), 출력식(expression) 입니다.



<1> 선언문(declaration)

선언문의 생김새는

<%! %> 입니다.

선언문의 용도는 멤버변수를 선언하거나 사용자 정의 메소드를 구성할 때 이곳에서 구성 하기 위해서 입니다.


<2> 실행문(scriptlet)

실행문의 생김새는

<% %> 입니다.

실행문에서 변수를 선언하면..

이 곳에서 작성된 코드는 모두 __jspService() 안에 들어갑니다.
또한 jsp 내장 객체들(out, request, response 등)도  __jspService() 메소드 안에 선언된 지역변수입니다.



확인 방법 (저는 루트가 MyJava 입니다. pc 마다 다르니 workspace부터 보면 될듯요 ^^)

C:\MyJava\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\MyWeb\org\apache\jsp\example

직접 들어가서 ex04.jsp를 들어가면 멤버변수, 지역변수의 위치가 다르다


<3> 출력문

출력문의 생김새는

<%=" "%> 입니다.

출력문의 용도는 말 그대로 어떤 변수에 담아 있는 값들을 출력하기 위해서 입니다.


이번 시간에는 개념적인 요소만 이야기 하고 글을 마무리 짓겠습니다

jsp를 계속 하기 위해서는 알아야 할 개념이니 유의하십시오~!



jsp로 구구단 만들기~!

안녕하세요

요즘 프로그램 만드는 게 있어서 한동안 블로그를 못했네요

이제 프로그램 만드는 것도 좀 끝나고 시간도 널널해서 다시 블로그를 시작하겠습니다

오늘은 jsp로 구구단 만들기를 한번 해보겠습니답~!

잘 봐주세요

ㄱㄱㄱㄱㄱㄱㄱㄱㄱ



==========================================================

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<h1>구구단</h1>

<table border="1">

<tr>
<%
for(int i=2;i<=9;i++)
{
%>
<td> <%= i+"단" %></td>

<%
}
%>
</tr>

<%
for(int i=1;i<=9;i++)
{
%>
<tr>

<%
for(int j=2;j<=9;j++)
{
%>
<td>
<%=j%> X <%=i%> = <%=j*i%>
</td>

<%
}
%>
</tr>

<%
}
%>
</table>

=========================================================

일단 결과 화면입니다..





사실 jsp로 구구단을 작성하는게 처음이라서..

이게 두번째 해보는건데 가물가물 하네요 ㄷㄷ

jsp는 적응 하려면 좀 걸릴것 같습니다 ㅜㅜ


GetServlet, PostServlet - 자바 Servlet 첫 시작

안녕하세요

오늘부터 자바 jsp/servlet을 진행할까 합니다

이것도 실무에서 많이 쓰이기 때문에 저도 블로그에 기록도 할 겸

다른 분들도 아셨으면 하는 차원에서 글을 써봅니다


이번 시간에는 get 방식과 post 방식에 대해서 이론적인 내용과

그리고 실제 코딩으로 구현한 예를 올립니다


get 방식과 post 방식은 http 프로토콜을 이용해서 서버에게 데이터를 전달 할 때

쓰이는 방식입니다.


그 두 개의 차이점은 제가 내일 아침이나 낮에 추가로 업로드 하겠습니다

잠깐 소스를 보여주기 전에 설명을 드리자면..

정리해서 흐름을 말하자면


html 파일을 작성할 때 <form> 태그 안에

'<form action="PostServlet" method="POST"> ' 을 기술해서

자바 파일에서

'@WebServlet("/PostServlet")' 으로 html 액션명과 자바 웹서블릿명을 맞춰야 합니다



그리고 html 파일에서

method='GET' 또는 method='POST' 방식으로 어떤 방식으로

데이터를 보낼지 기술합니다


자바 파일에서는

doGet()이나 doPost() 방식으로 html 방식에 맞게끔 메서드를 기술해주고

자바 파일에서 응답을 할 때는 아래와 같은 형태로 합니다.

//응답 유형 지정
res.setContentType("text/html; charset=UTF-8");

//스트림 얻어오기
PrintWriter out=res.getWriter();

// 출력
out.println('코드');


반대로 html 파일이 보낸 데이터를 받을 때는

req.setCharacterEncoding("UTF-8");

//사용자가 입력한 값 받아오기
String id=req.getParameter("userId");
String pw=req.getParameter("pwd");

위와 같은 방식으로 처리합니다.


자 그러면 실제 자바 소스를 볼까요?


- Input.html -
=========================================================

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div align="center">
<h1>GET방식 테스트</h1>
<form action="GetServlet" method="GET">
<label>아이디</label>
<input type="text" name="userId"><p>
<label>비밀번호</label>
<input type="password" name="pwd"><p>
<button type="submit">보내기</button>
<button type="reset">다시쓰기</button>
</form>
</div>
</body>
</html>

실행 결과



-GetServlet.java-
input.html의 아이디, 비밀번호 값을 처리하는 서블릿(get방식)
=========================================================

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
/* 요청방식(method)
 * - GET 방식(DEFAULT)
 * - POST 방식
 * - PUT 방식
 * - DELETE 방식
 * - OPTION 방식
 * */

@WebServlet("/GetServlet")
public class GetServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

//get 방식의 요청 처리를 위해서는 doGet()을 오버라이드 하고
//post 방식의 요청 처리를 위해서는 doPost()를 오버라이드 한다
//input.html에서 get 방식으로 보내니 이쪽에서도 get으로 응수하자
@Override
public void doGet(HttpServletRequest req, HttpServletResponse res) throws
ServletException, IOException{

res.setContentType("text/html; charset=UTF-8");
PrintWriter out=res.getWriter();

//1. 사용자가 입력한 값 받아오기(아이디, 비밀번호 값)
String id=req.getParameter("userId");
String pw=req.getParameter("pwd");

//2. 유효성 체크
if(id==null||pw==null||id.trim().isEmpty()||pw.trim().isEmpty()){
out.println("<b>아이디, 비밀번호를 입력해야 해요</b>");
return;
}
out.println("<h1>GetServlet</h1>");
out.println("<h2>환영합니다. "+id+"님</h2>");
out.println("<h2>당신의 비밀번호는 "+pw+"이군요</h2>");
out.close();
}

}////////////////////////////



=========================================================

보시다시피 get 방식은 주소에 userid, pwd 값이 노출되는 점이 있어

일반적으로 회원가입과 같은 중요한 데이터를 처리하는 곳에서는 처리하지 않습니다

사실 일반적으로 다들 이렇게 아는데..

링크

위의 블로그에 들어가면 get과 post의 차이를 제대로 알려주는 곳이 있습니다

한번 참고하시길 바랍니다




자 이번에는 post 방식 예제를 올려봅니다

post 방식은 구현한 메소드명만 차이 있지 거의 비슷합니다

어쨋든 소스를 올려봅니다


-Input2.html-
=========================================================

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div align="center">
<h1>POST방식 테스트</h1>
<form action="PostServlet" method="POST">
<label>아이디</label>
<input type="text" name="userId"><p>
<label>비밀번호</label>
<input type="password" name="pwd"><p>
<button type="submit">보내기</button>
<button type="reset">다시쓰기</button>
</form>
</div>
</body>
</html>




-PostServlet.java-
input.html의 아이디, 비밀번호 값을 처리하는 서블릿(post 방식)

=========================================================

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;

@WebServlet("/PostServlet")
public class PostServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {

//응답 유형 지정
res.setContentType("text/html; charset=UTF-8");

//스트림 얻어오기
PrintWriter out=res.getWriter();

/* get 방식은 한글이 안깨지고 post 방식은 한글이 깨진다
tomcat 7.0부터 get방식은 한글 안깨지게 해주고
post 방식은 바디에 포함되어 있는데 그 부분은 한글 인코딩 처리를 못해준다.
* */
//post 방식일 경우 한글 처리
req.setCharacterEncoding("UTF-8");

//사용자가 입력한 값 받아오기
String id=req.getParameter("userId");
String pw=req.getParameter("pwd");

//유효성 체크하기
if(id==null||pw==null||id.trim().isEmpty()||pw.trim().isEmpty()){
//out.println("<marquee><b>ID, PW를 입력해야 해요</b></marquee>");
//이번에는 자바 스크립트로 구현해보자
out.println("<script>");
out.println("alert('아이디,비번을 입력하세요')");
out.println("location.href='Input2.html'"); // 이전 페이지로 이동
out.println("</script>");
return;
}

//환영 메시지 출력
out.println("<marquee><h1>PostServlet</h1>");
out.println("<h2>환영합니다. "+id+"님</h2>");
out.println("<h2>당신의 비밀번호는 "+pw+"이군요</h2>");

//스트림 닫기
out.close();
}

}



get/post 방식 모두 다 정상적으로 실행을 했습니다

어때요? 참 쉽죠 ^^


create, alter, select table using subquery in oracle - 서브 쿼리를 이용한 테이블 생성

안녕하세요

이번 시간에는 오라클(oracle)에서 서브쿼리(subquery)를 활용하여 테이블을 생성하고

조회하고 삽입하는 예제를 올려봅니다.

잘 봐주세요~!



서브쿼리를 이용한 테이블 생성

CREATE TABLE 테이블명(컬럼명1, 컬럼명2, ...)
AS SUBQUERY

[1] 사원테이블에서 30번 부서에 근무하는 사원의 정보만 추출하여 EMP_30 테이블을 생성하세요
단 일은 사번, 이름, 업무, 입사일, 급여, 보너스를 포함시키세요

CREATE TABLE EMP_30(EMPNO, ENAME, JOB, HIREDATE, SAL, COMM)
AS
SELECT EMPNO, ENAME, JOB, HIREDATE, SAL, COMM
FROM EMP WHERE DEPTNO=30;


SELECT * FROM EMP_30;

[2] EMP에서 부서별로 인원수, 평균급여, 급여의 합, 최소급여, 최대급여를 포함하는 EMP_SUM 테이블을 생성하세요

CREATE TABLE EMP_SUM(DEPTNO, CNT, AVG_SAL, SUM_SAL, MIN_SAL, MAX_SAL)
AS
SELECT DEPTNO, COUNT(ENAME), ROUND(AVG(SAL),2), SUM(SAL), MIN(SAL), MAX(SAL) FROM EMP GROUP BY DEPTNO;

SELECT * FROM EMP_SUM;


[3] EMP에서 사번, 이름, 부서번호, 업무만 포함하는 EMP_TEMP 테이블을 생성하는데, 데이터는 포함하지 않고 구조만 생성하세요

CREATE TABLE EMP_TEMP2(EMPNO, ENAME, DEPTNO, JOB)
AS
SELECT EMPNO, ENAME, DEPTNO, JOB FROM EMP WHERE 1=2; -- 조건을 말도 안되게 주면 구조만 생성
SELECT * FROM EMP_TEMP2;


테이블에 컬럼 추가 및 변경, 삭제

-컬럼 추가
ALTER TABLE 테이블명 ADD(추가할 컬럼정보 [DEFAULT 기본값])
-컬럼 변경
ALTER TABLE 테이블명 MODIFY(변경할 컬럼정보 [DEFAULT 기본값])
-컬럼 삭제
ALTER TABLE 테이블명 DROP COLUMN(삭제할 컬럼명)
-컬럼명 변경
ALTER TABLE 테이블명 RENAME COLUMN 예전컬럼명 TO 새컬럼명

CREATE TABLE DEMO(
NO NUMBER);

SELECT * FROM DEMO;


[3]DEMO 테이블에 NAME 컬럼을 추가하세요 VARCHAR2(10) 유형으로
  DEMO 테이블에 POINT 컬럼을 추가하세요 NUMBER(3)
  ALTER TABLE DEMO ADD NAME VARCHAR2(10);
  ALTER TABLE DEMO ADD POINT NUMBER(3);

  DESC DEMO;



[4]DEMO 테이블에 생성된 POINT 컬럼의 자료형을 CHAR(3)으로 변경하세요
 ALTER TABLE DEMO MODIFY POINT CHAR(3);



[5]DEMO 테이블의 POINT 컬럼을 삭제하세요
ALTER TABLE DEMO DROP POINT;

ALTER TABLE DEMO ADD POINT NUMBER(3) NOT NULL;

INSERT INTO DEMO VALUES (1,'홍길동',100);


INTRO 컬럼을 추가하세요 VARCHAR2(100) NOT NULL로 한다면 => 오류가 발생하면서 추가가 안됨
NOT NULL인 열을 추가하기 위해서는 테이블이 비어있어야 함
ALTER TABLE DEMO ADD INTRO VARCHAR2(100);
DESC DEMO;



COMMIT;

NAME이라는 컬럼을 USERNAME이라고 변경
ALTER TABLE DEMO RENAME COLUMN NAME TO USERNAME;


제약조건 추가=> NO 컬럼에 PK 제약조건 주기
ALTER TABLE DEMO ADD CONSTRAINT DEMO_NO_PK PRIMARY KEY(NO);

SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, STATUS
FROM user_constraints where table_name='DEMO';


INSERT INTO DEMO VALUES(2, '김길동', 300, '자기소개');


제약조건 비활성화
ALTER TABLE 테이블명 DISABLE CONSTRAINT 제약조건명 [CASCADE]
ALTER TABLE DEMO DISABLE CONSTRAINT DEMO_NO_PK; -- STATUS : DISABLEED로 변경


-- 프라이머리키 제약조건이 비 활성화 됨 2번이 계속 동일하게 들어감
ROLLBACK;

제약조건 활성화
ALTER TABLE DEMO ENABLE CONSTRAINT DEMO_NO_PK;



객체이름 변경(테이블명 변경)
RENAME OLD_NAME TO NEW NAME;

EMP_30 테이블명을 EMP_TEMP30으로 변경하세요
RENAME EMP_30 TO EMP_TEMP30;
SELECT * FROM EMP_TEMP30;

테이블 삭제
DROP TABLE 테이블명;

DROP TABLE EMP_30;
ROLLBACK;

DROP TABLE EMP2;

EMP와 동일한 구조의 테이블 EMP2를 만드세요(사번,이름,급여,입사일,부서번호)
(구조만 복사)

CREATE TABLE EMP2(EMPNO,ENAME,SAL,HIREDATE,DEPTNO)
AS
SELECT EMPNO,ENAME,SAL,HIREDATE,DEPTNO FROM EMP WHERE 1=2;

SELECT * FROM EMP2;


INSERT INTO EMP2(EMPNO, ENAME, SAL)
VALUES(1122, 'SCOTT', 3000);

INSERT INTO EMP2
VALUES(1123, 'JAMES', 4000, SYSDATE, 20);


서브쿼리를 이용한 INSERT문

INSERT INTO EMP2
SELECT EMPNO, ENAME, SAL, HIREDATE, DEPTNO
FROM EMP WHERE DEPTNO=10;


EMP2에서 7782번 사원의 부서번호를 20번 부서로 수정하고 급여는 500원을 인상해주세요
UPDATE EMP2 SET DEPTNO=20, SAL = SAL+500
WHERE EMPNO=7782;


[5] MEMBER에서 13/9/1 이후 등록한 고객들의 마일리지를 300점씩 올려주세요
UPDATE MEMBER SET MILEAGE = MILEAGE + 300
WHERE REG_DATE > '13/09/01';
ROLLBACK;


[6] 등록된 MEMBER중 이름에 '김' 자가 들어있는 모든 이름을 '최'로 변경하세요
UPDATE MEMBER SET NAME = REPLACE(NAME, '김', '최') WHERE NAME LIKE '김%';
SELECT * FROM MEMBER;
ROLLBACK;


[7] EMP2에서 SCOTT의 부서번호와 등록일을 MILLER와 동일한 부서번호, 등록일로 수정하세요

UPDATE EMP2 SET(DEPTNO, HIREDATE)
= (SELECT DEPTNO, HIREDATE FROM EMP WHERE ENAME='MILLER')
WHERE ENAME='SCOTT';

INSERT INTO EMP2(EMPNO, ENAME) VALUES (7788, 'SCOTT');

COMMIT;
SELECT * FROM EMP2;

UPDATE MEMBER SET ADDR=NAME, JOB=MILEAGE;
SELECT * FROM MEMBER;
ROLLBACK;

EMP에서 사번 7782번 사원을 삭제하세요
DELETE FROM EMP WHERE EMPNO=7782;
ROLLBACK;

EMP에서 입사일자가 83년인 사원의 정보를 삭제하세요
SELECT * FROM EMP;
DELETE FROM EMP
WHERE TO_CHAR(HIREDATE,'YY')='83';

UDP 방식으로 데이터를 전송하기(JAVA - DatagramSocket, DatagramPacket 활용)

안녕하세요

이번 시간에는 TCP 방식이 아닌 UDP 방식으로 데이터를 전송하는

예제를 올려봅니다.

UDP 방식은 비록 비연결지향, 비신뢰적, 데이터가 순서대로 도착한다는 보장을 못한다는

단점이 있지만 TCP 방식보다 빠르게 데이터를 전달할수 있는 장점이 있습니다.

실시간 동영상 서비스는 UDP 방식으로 구현이 되죠


자 어쨋든 예제 바로 올려봅니다.


아래에 있는 소스는 UDP 데이터를 보내는 Sender 파일입니다.

=========================================================

import java.net.*;

import javax.swing.JOptionPane;

import java.io.*;
/* 데이터를 보내는 측
 * UDP방식 : 비연결 지향, 비신뢰적, 데이터가 순서대로 도착한다는 보장을 못함
 * 하지만 TCP방식보다 빠르게 전달된다.
 * DatagramPacket, DatagramSocket을 사용
 * - DatagramSocket : 데이터 송수신과 관련된 클래스(우체부)
 * - DatagramPacket : 주고 받을 데이터와 관련된 클래스(소포) / 수신을 위한 생성자와 송신을 위한 생성자 두 가지를 제공
 * TCP의 경우 스트림을 이용해 데이터를 주고 받지만 UDP의 경우 데이터그램을 이용해 데이터를 송수신한다
 *
 * */
public class UDPSender {

public static void main(String[] args) throws Exception {

String ip=JOptionPane.showInputDialog("IP주소를 입력하세요");
if(ip==null||ip.trim().isEmpty()){
ip="localhost";
}
InetAddress inet=InetAddress.getByName(ip);

//키보드 입력
BufferedReader key=new BufferedReader(new InputStreamReader(System.in));
System.out.println("보낼 내용을 입력하세요");
DatagramSocket ds=new DatagramSocket();

String sendMsg="";
while((sendMsg=key.readLine())!=null){
if(sendMsg.equalsIgnoreCase("x")) break; //종료
//문자열을 byte 배열에 담자
byte[] data=sendMsg.getBytes();
DatagramPacket pack=new DatagramPacket(data,data.length,inet,3000);
// 데이터, 보낼 데이터 길이, 받을 사람의 ip, 포트번호
ds.send(pack);
System.out.println("보낼 내용을 입력하세요");
}//while-----------------

if(ds!=null) ds.close();
}

}

=========================================================

위에서 udp 데이터를 전송했으면 당연히 받는 receiver가 필요합니다


=========================================================

import java.net.*;
import javax.swing.JOptionPane;
import java.io.*;

public class UDPReceiver {

public static void main(String[] args) throws Exception{

//데이터를 받기 위해 byte배열을 생성한다.
//UDP의 실제 데이터는 512바이트로 제한하는 경우가 많다.
byte[] buffer=new byte[100];

DatagramSocket ds=new DatagramSocket(3000);
DatagramPacket pack=new DatagramPacket(buffer,buffer.length);

while(true){
ds.receive(pack);
byte[] bmsg=pack.getData();
String msg=new String(bmsg,0,pack.getLength());
System.out.println(pack.getAddress()+"로 부터 ["+pack.getPort()+"]번 포트에서 온 메시지: "+msg);
}
}
}

=========================================================


위의 소스를 실행하기 위해서는 도스창에서 실행시키는게 좋습니다.

화면은 아래와 같습니다


UDPSender를 실행시키면 ip주소를 입력하라는 메시지가 나옵니다

저는 그냥 'localhost' 라고 입력하겠습니다.

 

그리고 보낼 내용을 입력하라는 메시지가 나옵니다

저는 '안녕하세요', '반갑습니다' 라고 보내겠습니다



UDPReceiver를 보면 제가 보낸 메시지가 정상적으로 출력이 됩니다

어때요 참 쉽죠? ㅎ



오라클(Oracle) 서브쿼리를 활용해 테이블 조회해보자

안녕하세요

요즘 날씨가 갑자기 추어졌네요..

이제는 여름,겨울 2계절인것 같습니다.

모두 감기 조심하세요~!


이번 시간에는 오라클의 유용하게 쓰이는 서브쿼리 예제를 올려봅니다.

서브쿼리는 괄호 안에 있는 쿼리를 말합니다.


자 그럼 바로 예제 들어가겠습니다

ㄱㄱㄱㄱㄱㄱㄱㄱㄱㄱㄱㄱ


사원 테이블에서 SCOTT의 급여보다 많은 사원의 사번, 이름, 업무, 급여를 출력하세요
SELECT SAL FROM EMP WHERE ENAME='SCOTT';


SELECT EMPNO, ENAME, JOB, SAL
FROM EMP
WHERE SAL > 3000;


SELECT EMPNO, ENAME, JOB, SAL -- Main query
FROM EMP
WHERE SAL>(SELECT SAL FROM EMP WHERE ENAME='SCOTT'); --Nested query


[1] EMP에서 사번이 7521인 사원과 업무가 같고, 급여가 7934인 사원보다 많은 사원의 사번, 이름, 업무, 급여를 출력하세요

SELECT JOB FROM EMP WHERE EMPNO=7521;


SELECT SAL FROM EMP WHERE EMPNO=7934;


SELECT EMPNO, ENAME, JOB, SAL
FROM EMP WHERE JOB = (SELECT JOB FROM EMP WHERE EMPNO=7521)
AND SAL>(SELECT SAL FROM EMP WHERE EMPNO=7934);


--단일 행 서브쿼리
[2] EMP에서 사원들의 평균급여보다 적은 사원의 사번, 이름, 급여, 업무를 출력하세요

SELECT EMPNO, ENAME, SAL, JOB
FROM EMP
WHERE SAL < (SELECT AVG(SAL)FROM EMP);


[3] 사원 테이블에서 사원의 급여가 20번 부서의 최소 급여 보다 많은 부서의 부서번호와 최소급여를 출력하세요

SELECT DEPTNO, MIN(SAL) FROM EMP
GROUP BY DEPTNO
HAVING MIN(SAL) > (SELECT MIN(SAL) FROM EMP WHERE DEPTNO=20);


다중 행 서브 쿼리
- 하나 이상의 행을 반환하는 서브쿼리
- 다중행 서브쿼리는 다중행 연산자를 사용해야 한다.
- 다중행 연산자는 하나 이상의 값을 요구한다.

#다중행 연산자
IN 연산자
ANY 연산자
ALL 연산자
EXIST 연산자

--다중행, 다중열 일 때는 IN 이 들어가야함
[4] 업무별로 최대 급여를 받는 사원의 사번과 이름, 급여를 출력하세요
SELECT JOB, EMPNO, ENAME, SAL
FROM EMP
WHERE (JOB, SAL) IN
(SELECT JOB, MAX(SAL)
FROM EMP
GROUP BY JOB);


ANY 연산자
- 서브쿼리 결과 값 중 어느 하나 값이라도 만족되면 결과값을 반환한다.

SELECT ENAME, SAL FROM EMP
WHERE DEPTNO<>20
--AND SAL > ANY (SELECT SAL FROM EMP WHERE JOB='SALESMAN');
AND SAL > (SELECT MIN(SAL) FROM EMP WHERE JOB = 'SALESMAN');


> ANY (SELECT SAL FROM EMP WHERE JOB='SALESMAN'); 의 의미
-> SAL > (SELECT MIN(SAL) FROM EMP WHERE JOB = 'SALESMAN')와 동일한 의미

SELECT DEPTNO, ENAME, SAL FROM EMP
WHERE DEPTNO<>20
AND SAL < ANY (SELECT SAL FROM EMP WHERE JOB = 'SALESMAN');
==>SAL<(SELECT MAX(SAL) FROM EMP WHERE JOB='SALESMAN')과 동일


#ALL 연산자
- 서브쿼리 결과값 중 모든 결과값이 만족되어야만 결과값을 반환한다.

SELECT ENAME, SAL FROM EMP
WHERE DEPTNO<>20
AND SAL>ALL(SELECT SAL FROM EMP WHERE JOB='SALESMAN'); -- 최대값보다 크냐  부등호가 < 이면 최소값보다 작냐



# EXISTS 연산자
-EXISTS 연산자를 사용하면, 서브쿼리의 데이터가 존재하는가의 여부를 먼저 따져 존재하는 값들만을 결과로 반환해준다
-SUBQUERY에서 적어도 1개의 행을 RETURN 하면 논리식은 참이고 그렇지 않으면 거짓입니다.

[5] 사원을 관리할 수 있는 사원의 정보를 보여주세요
SELECT ENAME, JOB FROM EMP E -- 여기서 E는 관리자를 의미(관리자의 이름과 업무를 보여주자)
WHERE EXISTS (SELECT EMPNO FROM EMP WHERE E.EMPNO=MGR); -- EMP의 사번 = MGT(관리자 사번) -> 관리자냐를 물어보는 것임


#다중 열 서브쿼리
-서브쿼리 결과값이 두 개 이상의 컬럼을 반환하는 경우

[6] EMP에서 급여와 보너스가 30번 부서의 있는 사원의 급여, 보너스와 일치하는 사원의 이름, 부서번호를 출력하세요
SELECT ENAME, DEPTNO, SAL, COMM
FROM EMP
WHERE (SAL, COMM)
IN (SELECT SAL, COMM FROM EMP WHERE DEPTNO=30 AND COMM IS NOT NULL);



[7] 업무별로 최소 급여를 받는 사원의 사번, 이름, 업무, 급여를 출력하세요. 단 업무별로 정렬하세요
SELECT EMPNO, ENAME, JOB, SAL
FROM EMP
WHERE (JOB, SAL) IN
(SELECT JOB, MIN(SAL) FROM EMP GROUP BY JOB)
ORDER BY JOB;



[실습]
84] 고객 테이블에 있는 고객 정보 중 마일리지가 가장 높은 금액의 고객 정보를 보여주세요.
SELECT NAME, JOB, MILEAGE FROM MEMBER
WHERE MILEAGE = (SELECT MAX(MILEAGE) FROM MEMBER);


85] 상품 테이블에 있는 전체 상품 정보 중 상품의 판매가격이 판매가격의 평균보다 큰  상품의 목록을 보여주세요.
 단, 평균을 구할 때와 결과를 보여줄 때의 판매 가격이 50만원을 넘어가는 상품은 제외시키세요.
   
SELECT PRODUCTS_NAME, OUTPUT_PRICE
FROM PRODUCTS
WHERE OUTPUT_PRICE > (SELECT AVG(OUTPUT_PRICE)FROM PRODUCTS
WHERE OUTPUT_PRICE <=500000)
AND OUTPUT_PRICE<=500000;


86] 상품 테이블에 있는 판매가격에서 평균가격 이상의 상품 목록을 구하되 / <-- 여기 먼저 구하자
평균을 구할 때 판매가격이 최대인 상품을 제외하고 평균을 구하세요.
--서브쿼리 안에 서브쿼리가 들어간다

SELECT * FROM PRODUCTS
WHERE OUTPUT_PRICE >=
(SELECT AVG(OUTPUT_PRICE) FROM PRODUCTS
WHERE OUTPUT_PRICE <> (SELECT MAX(OUTPUT_PRICE)FROM PRODUCTS));



87] 상품 카테고리 테이블에서 카테고리 이름에 컴퓨터라는 단어가 포함된 카테고리에 속하는 상품 목록을 보여주세요.

SELECT * FROM PRODUCTS WHERE CATEGORY_FK IN-- SELECT * FROM PRODUCTS WHERE CATEGORY_FK = -> '=' 단일 행 연산자 일때, 'IN' 다중 행
(SELECT CATEGORY_CODE FROM CATEGORY WHERE category_name LIKE '%컴퓨터%');


88] 고객 테이블에 있는 고객정보 중 직업의 종류별로 가장 나이가 많은 사람의 정보를 화면에 보여주세요.

SELECT NAME, JOB, AGE FROM MEMBER WHERE (JOB, AGE) IN -- 다중행 IN
(SELECT JOB, MAX(AGE) -- 다중행
FROM MEMBER GROUP BY JOB);



DELETE문에서 사용
(DELETE문은 직접 실행해보시고 ROLLBACK으로 취소해보세요)

89] 상품 테이블에서 공급가가 가장 큰 상품은 삭제 시키는 SQL 문을 작성하세요

DELETE FROM PRODUCTS WHERE INPUT_PRICE =
(SELECT MAX(INPUT_PRICE) FROM PRODUCTS);

ROLLBACK;

90] 상품 테이블에서 상품 목록을 공급업체(EP_CODE_FK)별로 정리한 뒤
각 공급업체 별로 최소 공급가(INPUT_PRICE)를 가진 상품을 삭제하세요

SELECT * FROM PRODUCTS;
DELETE FROM PRODUCTS WHERE (EP_CODE_FK, INPUT_PRICE) IN
(SELECT EP_CODE_FK, MIN(INPUT_PRICE) FROM PRODUCTS GROUP BY EP_CODE_FK);
ROLLBACK;