package ch22;

public class AdminBean
{
 private String id;
 private String name;
 private String email;
 private String pwd;
 /**
  * @return email
  */
 public String getEmail()
 {
  return email;
 }
 /**
  * @param email 설정하려는 email
  */
 public void setEmail(String email)
 {
  this.email = email;
 }
 /**
  * @return id
  */
 public String getId()
 {
  return id;
 }
 /**
  * @param id 설정하려는 id
  */
 public void setId(String id)
 {
  this.id = id;
 }
 /**
  * @return name
  */
 public String getName()
 {
  return name;
 }
 /**
  * @param name 설정하려는 name
  */
 public void setName(String name)
 {
  this.name = name;
 }
 /**
  * @return pwd
  */
 public String getPwd()
 {
  return pwd;
 }
 /**
  * @param pwd 설정하려는 pwd
  */
 public void setPwd(String pwd)
 {
  this.pwd = pwd;
 }
 
 
}

Posted by 말없제이
,

JDBC관련 모듈화

DevTool/Java 2009. 6. 29. 18:06

package ch22;

import java.awt.BorderLayout;

import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.Rectangle;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.sql.*;

public class Ch2205 extends JFrame
{
 //재사용 가능하게 모듈처리.
 
 private static final long serialVersionUID = 1L;

 private JPanel jContentPane = null;

 private JLabel jLabel = null;

 private JTextField txtID = null;

 private JLabel jLabel1 = null;

 private JTextField txtName = null;

 private JTextField txtEmail = null;

 private JTextField txtPwd = null;

 private JLabel jLabel2 = null;

 private JLabel jLabel21 = null;

 private JButton btnAdd = null;

 /**
  * This is the default constructor
  */
 public Ch2205()
 {
  super();
  initialize();
 }

 /**
  * This method initializes this
  *
  * @return void
  */
 private void initialize()
 {
  this.setSize(300, 200);
  this.setContentPane(getJContentPane());
  this.setTitle("JFrame");
 }

 /**
  * This method initializes jContentPane
  *
  * @return javax.swing.JPanel
  */
 private JPanel getJContentPane()
 {
  if (jContentPane == null)
  {
   jLabel21 = new JLabel();
   jLabel21.setBounds(new Rectangle(30, 110, 61, 21));
   jLabel21.setText("비밀번호");
   jLabel2 = new JLabel();
   jLabel2.setBounds(new Rectangle(30, 80, 41, 21));
   jLabel2.setText("이메일");
   jLabel1 = new JLabel();
   jLabel1.setBounds(new Rectangle(30, 50, 41, 21));
   jLabel1.setText("이름");
   jLabel = new JLabel();
   jLabel.setBounds(new Rectangle(29, 19, 42, 22));
   jLabel.setText("ID");
   jContentPane = new JPanel();
   jContentPane.setLayout(null);
   jContentPane.add(jLabel, null);
   jContentPane.add(getTxtID(), null);
   jContentPane.add(jLabel1, null);
   jContentPane.add(getTxtName(), null);
   jContentPane.add(jLabel2, null);
   jContentPane.add(getTxtEmail(), null);
   jContentPane.add(jLabel21, null);
   jContentPane.add(getTxtPwd(), null);
   jContentPane.add(getBtnAdd(), null);
  }
  return jContentPane;
 }

 /**
  * This method initializes txtID
  *  
  * @return javax.swing.JTextField
  */
 private JTextField getTxtID()
 {
  if (txtID == null)
  {
   txtID = new JTextField();
   txtID.setBounds(new Rectangle(80, 20, 161, 22));
  }
  return txtID;
 }

 /**
  * This method initializes txtName
  *  
  * @return javax.swing.JTextField
  */
 private JTextField getTxtName()
 {
  if (txtName == null)
  {
   txtName = new JTextField();
   txtName.setBounds(new Rectangle(80, 50, 161, 21));
  }
  return txtName;
 }

 /**
  * This method initializes txtEmail
  *  
  * @return javax.swing.JTextField
  */
 private JTextField getTxtEmail()
 {
  if (txtEmail == null)
  {
   txtEmail = new JTextField();
   txtEmail.setBounds(new Rectangle(80, 80, 161, 21));
  }
  return txtEmail;
 }

 /**
  * This method initializes txtPwd
  *  
  * @return javax.swing.JTextField
  */
 private JTextField getTxtPwd()
 {
  if (txtPwd == null)
  {
   txtPwd = new JTextField();
   txtPwd.setBounds(new Rectangle(100, 110, 141, 21));
  }
  return txtPwd;
 }

 /**
  * This method initializes btnAdd
  *  
  * @return javax.swing.JButton
  */
 private JButton getBtnAdd()
 {
  if (btnAdd == null)
  {
   btnAdd = new JButton();
   btnAdd.setBounds(new Rectangle(150, 140, 91, 21));
   btnAdd.setText("추가");
   btnAdd.addActionListener(new java.awt.event.ActionListener()
   {
    public void actionPerformed(java.awt.event.ActionEvent e)
    {
     // TODO Auto-generated Event stub actionPerformed()
     //동작빈의 모델개체를 생성하고 멤버함수를 호출하되
     //텍스트박스의 값을 문자열로 전달.
     //MVC1 모델.
     //장점 :
     Adminpro adm = new Adminpro();
     AdminBean admbean = new AdminBean();
     String  id=txtID.getText();
     String  name=txtName.getText();
     String  email=txtEmail.getText();
     String  pwd=txtPwd.getText();
     
     admbean.setId(id);
     admbean.setName(name);
     admbean.setPwd(pwd);
     admbean.setEmail(email);
     
     int ab = adm.write(admbean);
     if(ab>0)
     {
      txtID.setText("");
      txtName.setText("");
      txtEmail.setText("");
      txtPwd.setText("");
     }
     
     JOptionPane.showConfirmDialog(null, "수행결과 : "+ab);

    }
   });
  }
  return btnAdd;
 }

}




**********    Adminpro.java      ********
package ch22;

import java.sql.*;

import javax.swing.JOptionPane;


public class Adminpro
{
 //동작 모듈 관련..  2가지 개선상황.
 //1.개선 : 매갠변수가 늘어날시 다 입력해줘야함. -> 데이타빈으로 교체.
 //데이터빈 모델형태 -> getter, setter 사용.
 //2개선 : sql이용시 conn부분 중복, 계승이용해서 풀어주면 됨.
 //public int write(String id, String name, String email, String pwd)
 public int write(AdminBean bean)
 {
  PreparedStatement pstmt = null;
  Connection conn = null;
  int rows=0;
  try
  {
   Class.forName("oracle.jdbc.driver.OracleDriver");
   conn = DriverManager.getConnection
   (
    "jdbc:oracle:thin:@localhost:1521:ORCL","jsp","jsp"
   );
   
   String sql = "insert into admin(id,name,pwd,email) values (?,?,?,?)";
   pstmt=conn.prepareStatement(sql);
   pstmt.setString(1, bean.getId());
   pstmt.setString(2, bean.getName());
   pstmt.setString(3, bean.getPwd());
   pstmt.setString(4, bean.getEmail());
   
   rows=pstmt.executeUpdate();
  }
  catch (ClassNotFoundException e1)
  {
   // TODO 자동 생성된 catch 블록
   e1.printStackTrace();
  }
  catch (SQLException e1)
  {
   // TODO 자동 생성된 catch 블록
   e1.printStackTrace();
  }
  finally
  {
   try
   {
    pstmt.close();
    conn.close();
   }
   catch (SQLException e1)
   {
    // TODO 자동 생성된 catch 블록
    e1.printStackTrace();
   }
   
  }
  return rows;
 
 }
}

Posted by 말없제이
,

package ch22;

import java.awt.BorderLayout;

import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.Rectangle;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.sql.*;

public class Ch2204 extends JFrame
{
 //가장쉬운 이벤트.
 //무명클래스 사용.
 //폼에게 전개..
 //Winform 솔루션 -> 웹으로 개발 X...(재사용 가능성 거의 없음)
 //초보자에게 만들기 쉬우나, 재활용 거의 불가능.
 private static final long serialVersionUID = 1L;

 private JPanel jContentPane = null;

 private JLabel jLabel = null;

 private JTextField txtID = null;

 private JLabel jLabel1 = null;

 private JTextField txtName = null;

 private JTextField txtEmail = null;

 private JTextField txtPwd = null;

 private JLabel jLabel2 = null;

 private JLabel jLabel21 = null;

 private JButton btnAdd = null;

 /**
  * This is the default constructor
  */
 public Ch2204()
 {
  super();
  initialize();
 }

 /**
  * This method initializes this
  *
  * @return void
  */
 private void initialize()
 {
  this.setSize(300, 200);
  this.setContentPane(getJContentPane());
  this.setTitle("JFrame");
 }

 /**
  * This method initializes jContentPane
  *
  * @return javax.swing.JPanel
  */
 private JPanel getJContentPane()
 {
  if (jContentPane == null)
  {
   jLabel21 = new JLabel();
   jLabel21.setBounds(new Rectangle(30, 110, 61, 21));
   jLabel21.setText("비밀번호");
   jLabel2 = new JLabel();
   jLabel2.setBounds(new Rectangle(30, 80, 41, 21));
   jLabel2.setText("이메일");
   jLabel1 = new JLabel();
   jLabel1.setBounds(new Rectangle(30, 50, 41, 21));
   jLabel1.setText("이름");
   jLabel = new JLabel();
   jLabel.setBounds(new Rectangle(29, 19, 42, 22));
   jLabel.setText("ID");
   jContentPane = new JPanel();
   jContentPane.setLayout(null);
   jContentPane.add(jLabel, null);
   jContentPane.add(getTxtID(), null);
   jContentPane.add(jLabel1, null);
   jContentPane.add(getTxtName(), null);
   jContentPane.add(jLabel2, null);
   jContentPane.add(getTxtEmail(), null);
   jContentPane.add(jLabel21, null);
   jContentPane.add(getTxtPwd(), null);
   jContentPane.add(getBtnAdd(), null);
  }
  return jContentPane;
 }

 /**
  * This method initializes txtID
  *  
  * @return javax.swing.JTextField
  */
 private JTextField getTxtID()
 {
  if (txtID == null)
  {
   txtID = new JTextField();
   txtID.setBounds(new Rectangle(80, 20, 161, 22));
  }
  return txtID;
 }

 /**
  * This method initializes txtName
  *  
  * @return javax.swing.JTextField
  */
 private JTextField getTxtName()
 {
  if (txtName == null)
  {
   txtName = new JTextField();
   txtName.setBounds(new Rectangle(80, 50, 161, 21));
  }
  return txtName;
 }

 /**
  * This method initializes txtEmail
  *  
  * @return javax.swing.JTextField
  */
 private JTextField getTxtEmail()
 {
  if (txtEmail == null)
  {
   txtEmail = new JTextField();
   txtEmail.setBounds(new Rectangle(80, 80, 161, 21));
  }
  return txtEmail;
 }

 /**
  * This method initializes txtPwd
  *  
  * @return javax.swing.JTextField
  */
 private JTextField getTxtPwd()
 {
  if (txtPwd == null)
  {
   txtPwd = new JTextField();
   txtPwd.setBounds(new Rectangle(100, 110, 141, 21));
  }
  return txtPwd;
 }

 /**
  * This method initializes btnAdd
  *  
  * @return javax.swing.JButton
  */
 private JButton getBtnAdd()
 {
  if (btnAdd == null)
  {
   btnAdd = new JButton();
   btnAdd.setBounds(new Rectangle(150, 140, 91, 21));
   btnAdd.setText("추가");
   btnAdd.addActionListener(new java.awt.event.ActionListener()
   {
    public void actionPerformed(java.awt.event.ActionEvent e)
    {
     // TODO Auto-generated Event stub actionPerformed()
     
     PreparedStatement pstmt = null;
     Connection conn = null;
     try
     {
      Class.forName("oracle.jdbc.driver.OracleDriver");
      conn = DriverManager.getConnection
      (
       "jdbc:oracle:thin:@localhost:1521:ORCL","jsp","jsp"
      );
     
      String sql = "insert into admin(id,name,pwd,email) values (?,?,?,?)";
      pstmt=conn.prepareStatement(sql);
      pstmt.setString(1, txtID.getText());
      pstmt.setString(2, txtName.getText());
      pstmt.setString(3, txtPwd.getText());
      pstmt.setString(4, txtEmail.getText());
     
      int rows=pstmt.executeUpdate();
      if(rows>0)
      {
      txtID.setText("");
      txtName.setText("");
      txtPwd.setText("");
      txtEmail.setText("");
      }
      JOptionPane.showConfirmDialog( null, rows+"행이 추가되었습니다.");      
     }
     catch (ClassNotFoundException e1)
     {
      // TODO 자동 생성된 catch 블록
      e1.printStackTrace();
     }
     catch (SQLException e1)
     {
      // TODO 자동 생성된 catch 블록
      e1.printStackTrace();
     }
     finally
     {
      try
      {
       pstmt.close();
       conn.close();
      }
      catch (SQLException e1)
      {
       // TODO 자동 생성된 catch 블록
       e1.printStackTrace();
      }
     
     }
    }
   });
  }
  return btnAdd;
 }

}

Posted by 말없제이
,

package ch22;

import java.sql.*;

import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ResultTreeType;

public class Ch2203
{
 public static void main(String[] args)
 {
  Connection conn = null;
  PreparedStatement pstmt = null;
  ResultSet rs = null;
  String id = "admin2";
  /*
   * select문을 사용할 경우 ResultSet개체를 두어야 하며,
   * 사용하는 메서드는 executeQuery()를 사용한다.
   */
  try
  {
   Class.forName("oracle.jdbc.driver.OracleDriver");
   String oUrl = "jdbc:oracle:thin:@localhost:1521:ORCL";
   conn = DriverManager.getConnection(oUrl, "jsp", "jsp");
   oUrl="";
   //String sql = "select * from admin";
   String sql = "select id as i, name as na, email, pwd from admin where id=?";
   pstmt=conn.prepareStatement(sql);
   pstmt.setString(1, id);
   
   //select문을 사요6ㅇ할 경우 executeQuery()를 사용하며
   //반드시 ResultSet 개체로 반환받아야 한다.
   rs = pstmt.executeQuery();
   //처음 레코드로 이동해야 컬럼을 ㅇ릭어들일수 있다.
   //re.next()는 다음요소로 이동할수 있으면 참을 반환하고
   //이동할수 없으면 거짓을 반환한다.
   
   while(rs.next())
   {
    //rs.getString("컬럼명")의 경우
    //컬럼의 값이 문자열일 경우 문자열로
    //읽어들여 반환한다.
    /*String id=rs.getString("id");
    String name=rs.getString("name");*/
    id=rs.getString("i");
    String name=rs.getString("na");
    String email=rs.getString("email");
    String pwd=rs.getString("pwd");
   
    /*System.out.println("id : "+id);
    System.out.println("name : "+name);*/
    System.out.println("i : "+id);
    System.out.println("na : "+name);
    System.out.println("email : "+email);
    System.out.println("pwd : "+pwd);
   }
   
   sql="select count(*) from admin";
   pstmt=conn.prepareStatement(sql);
   rs=pstmt.executeQuery();
   rs.next();
   //위의 SQL처럼 컬럼이름이 없는 경우에는 컬럼번호로 지정가능
   //ASP에서는 인덱스 0, JSP에서는 1.
   int count = rs.getInt(1);
   System.out.println("총갯수 : "+count);
  }
  catch (ClassNotFoundException e)
  {
   // TODO 자동 생성된 catch 블록
   e.printStackTrace();
  }
  catch (SQLException e)
  {
   // TODO 자동 생성된 catch 블록
   e.printStackTrace();
  }
  finally
  {
   try
   {
    rs.close();
    pstmt.close();
    conn.close();
   }
   catch (SQLException e)
   {
    // TODO 자동 생성된 catch 블록
    e.printStackTrace();
   }
   
  }
 
 }
}

Posted by 말없제이
,

package ch22;

import java.sql.*;

public class Ch2202
{
 public static void main(String[] args)
 {
  //CreateStatement와 PreparedStatement
  //두가지 방식중 실제로 속도가 빠른쪽 및 자원 재사용이
  //가능한쪽은 PreparedStatement이다
  //
  //1) select문이 아닌 SQL을 실행하는 방식
  //-->ResultSet이 필요없다.
  //-->executeUpdate()메서드를 사용
  //
  Connection conn = null;
  PreparedStatement pstmt=null;
  //1.JDBC드라이버를 읽어들인다.
  try
  {
   Class.forName("oracle.jdbc.driver.OracleDriver");
   //2. Connection개체를 얻어온다.
   String oUrl = "jdbc:oracle:thin:@localhost:1521:ORCL";
   conn = DriverManager.getConnection(oUrl, "jsp", "jsp");
   oUrl ="";

   String id="admin";
   String name="name";
   String pwd="pwd";
   String email="email";
   
   //3. 실행할 SQL문을 정의
   /*String sql = "insert into admin(id, name, pwd, email) values ("+
   "?,?,?,?)";*/
   String sql = String.format("insert into admin(id, name, pwd, email) values "
     +"('%s','%s','%s','%s')",id, name, pwd, email);
   
   //4. PreparedStatement에 실행할 SQL을 등록한다.
   pstmt = conn.prepareStatement(sql);
   
  /* //첫번째 물음표의 영역에 문자열 "admin"을 대입
   pstmt.setString(1, "admin");
   pstmt.setString(2, "관리자");
   pstmt.setString(3, "1111");
   pstmt.setString(4, "a@a.com");*/
   
   //5. SQL의 실행 : executeUpdate()는
   //SQL의 실행결과 영향받은 행의 수를 숫자를 반환.
   int rows = pstmt.executeUpdate();
   System.out.println(rows+"개행이 추가되었습니다.");
  }
  catch (ClassNotFoundException e)
  {
   // TODO 자동 생성된 catch 블록
   e.printStackTrace();
  }
  catch (SQLException e)
  {
   // TODO 자동 생성된 catch 블록
   e.printStackTrace();
  }
  finally
  {
   //SQL실행시 오류가 나든 안나든 실행되는 부분
   //사용된 자원을 반납
   try
   {
    pstmt.close();
    conn.close();
   }
   catch (SQLException e)
   {
    // TODO 자동 생성된 catch 블록
    e.printStackTrace();
   }
  }
 }
}

Posted by 말없제이
,

JDBC연동..

DevTool/Java 2009. 6. 29. 18:02

package ch22;

//JDBC연동시 필요한 패키지
import java.sql.*;
import java.util.Map;
import java.util.Properties;

public class Ch2201
{
 public static void main(String[] args) throws ClassNotFoundException, SQLException
 {
  //데스크탑 프로그램 사용시 연동부분..  jps에서 폼이 바뀜.
  //퍼시턴스 계층 : Java, JSP, EJB 각각 사용할때의 패턴이 달라짐.
  Class.forName("oracle.jdbc.driver.OracleDriver");
  Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL", "scott", "tiger");
 
  Statement stmt = conn.createStatement();
 
  String sql = "select * from emp";
  ResultSet rs = stmt.executeQuery(sql);
 
  while(rs.next())
  {
   String empno=rs.getString("empno");
   String ename=rs.getString("ename");
   System.out.println("사원번호 : "+empno);
   System.out.println("사원이름 : "+ename);
  }
 
 }
 
 
}

Posted by 말없제이
,
퍼시턴스 계층 : Java, JSP, EJB 각각 사용할때의 패턴이 달라짐.
Posted by 말없제이
,

*.Join
- join의 개념
- join의 종류
*.카르테시안 product 기법(기본)
Cross조인(모든 정보를 보여줌)
ex)
select * from emp, dept;
ex)
select * from emp cross join dept;
ex)
SQL> select ename, deptno, dname
  2  from emp,dept
  3  ;
select ename, deptno, dname
              *
1행에 오류:
ORA-00918: 열의 정의가 애매합니다
-- 어느테이블 소유인것인지 명확하게 해주면 해결
-- "."(dot)을 이용해서 사용.
table명.컬럼명

SQL>
select emp.ename, emp.deptno, dept.dname
from emp,dept

- 테이블명 단축도 가능(alias사용가능-테이블은 공백만사용)
select a.ename, a.deptno, b.dname
from emp a, dept b


*.EQUI Join 기법 : 동일한 값으로 조인하는방법
1.각 테이블의 동일한값을 where에 =로 명시 [where 에 동일값 표시]
ex)
select emp.ename, emp.deptno, dept.dname
from emp,dept
where emp.deptno = dept.deptno

2.join ~ on : from절에 테이블명 join ~ on 비교될 컬럼명.
ex)
select e.ename, e.deptno, d.dname
from emp e join dept d on e.deptno = d.deptno

3.join ~ using(~) : from절에 테이블명 join ~ using(컬럼명) 사용가능
ex)
select e.ename, deptno, d.dname
from emp e join dept d using(deptno)

4.natural join : Oracle에 알아서 명시해라.
select e.ename, deptno, d.dname
from emp e natural join dept d


*.Non-EQUI Join 기법 : 특정범위값으로 조인하는 방법
 -- 사원명, 급여, 급여등급(등급당 최저급여, 등급당 최급여) 조회
select a.ename, a.sal, b.grade, b.losal, b.hisal
from emp a, salgrade b
where a.sal between b.losal and b.hisal


Posted by 말없제이
,

*.날짜함수

  1  select sysdate, sysdate-1, sysdate+1, to_char(sysdate+(1/2),'yy-mm-dd hh24:mi')
  2* from dual
  3  /

SYSDATE  SYSDATE- SYSDATE+ TO_CHAR(SYSDAT
-------- -------- -------- --------------
09/06/26 09/06/25 09/06/27 09-06-26 21:37

*.months_between : 날짜와 날짜사이의 개월을 계산

  1  select sysdate,months_between(sysdate,to_date('2009-01-01'))
  2  from emp
  3* where empno=7788
SQL> /

SYSDATE  MONTHS_BETWEEN(SYSDATE,TO_DATE('2009-01-01'))
-------- ---------------------------------------------
09/06/26                                    5.82029757

*.add_months : 날짜에 개월을 더한 날짜 계산.

  1  select sysdate,add_months(sysdate,2)
  2  from emp
  3* where empno=7788
SQL> /

SYSDATE  ADD_MONT
-------- --------
09/06/26 09/08/26

*.last_day : 해당월의 마지막일
*.next_day : 다가오는 요일의 날짜를 반환.


  1  select sysdate, last_day(sysdate), next_day(sysdate,'토')
  2  from emp
  3* where empno=7788
SQL> /

SYSDATE  LAST_DAY NEXT_DAY
-------- -------- --------
09/06/26 09/06/30 09/06/27

*.round/trunc : 적용될 날짜형태받아서 하위에서 반올림/절삭

  1  select sysdate, round(sysdate,'mm'), trunc(sysdate,'dd')
  2  from emp
  3* where empno=7788
SQL> /

SYSDATE  ROUND(SY TRUNC(SY
-------- -------- --------
09/06/26 09/07/01 09/06/26

  1  select sysdate, to_char(round(sysdate,'hh'),'yy/mm/dd HH24:mi:ss'), trunc(sysdate,'hh')
  2  from emp
  3* where empno=7788
SQL>
SQL> /

SYSDATE  TO_CHAR(ROUND(SYS TRUNC(SY
-------- ----------------- --------
09/06/26 09/06/26 11:00:00 09/06/26


  1  select sysdate, to_char(sysdate,'ddd'), to_char(sysdate,'dd'), to_char(sysdate,'d')
  2  from emp
  3* where empno=7788
SQL> /

SYSDATE  TO_ TO T
-------- --- -- -
09/06/26 177 26 6


*.Null관련 함수
- nvl(exp1, exp2) : 첫인수가 null이면 두번째인수로 대체
- nvl2(exp1, exp2, exp3) : 첫인수가 null가 아니면 두번째 인수대체, null이면 세번째 인수대체

  1  select comm, nvl(comm, 90), nvl2(comm,999,90)
  2  from emp
  3* where sal >= 1500
SQL> /

      COMM NVL(COMM,90) NVL2(COMM,999,90)
---------- ------------ -----------------
       300          300               999
                     90                90
                     90                90
                     90                90
                     90                90
                     90                90
         0            0               999
                     90                90

- nullif : 함수 두개의 표현식을 비교해 동일하면 null, 일치하지않으면 첫번째값 반환.
nullif(exp1, exp2)

SQL> select comm, nullif(comm, 0)
  2  from emp
  3  where comm is not null
  4  ;

      COMM NULLIF(COMM,0)
---------- --------------
       300            300
       500            500
      1400           1400
         0

- coalesce : 인수중의 null아닌 첫번째 인수 반환. 없으면 null.
  1  select comm, coalesce(comm, 77)
  2* from emp
SQL> /

      COMM COALESCE(COMM,77)
---------- -----------------
                          77
       300               300
       500               500
                          77

*.decode 함수 : if~case 알고리즘 간단한표현, 연산자는 '='만 가능. 불만족시 null반환.
decode(표현식|컬럼명, 찾는값1, 리턴값1, 찾는값2,리턴값2, [default값])

  1  select ename, sal, decode(ename, 'ALLEN', sal)
  2* from emp
SQL> /

ENAME             SAL DECODE(ENAME,'ALLEN',SAL)
---------- ---------- -------------------------
SMITH             800
ALLEN            1600                      1600
WARD             1250
JONES            2975
MARTIN           1250
BLAKE            2850
CLARK            2450
SCOTT            3000
KING             5000
TURNER           1500
ADAMS            1100


SQL> -- 10번 부서 급여 100 추가
SQL> -- 20번 부서 급여 200추가
SQL> -- 그외 9000 일괄 지급
  1  select ename, deptno, decode
  2  (
  3   deptno, 10, sal+100,
  4   20, sal+200,
  5   9000
  6  )
  7* from emp
SQL> /

ENAME          DEPTNO DECODE(DEPTNO,10,SAL+100,20,SAL+200,9000)
---------- ---------- -----------------------------------------
SMITH              20                                      1000
ALLEN              30                                      9000
WARD               30                                      9000
JONES              20                                      3175
MARTIN             30                                      9000
BLAKE              30                                      9000
CLARK              10                                      2550
SCOTT              20                                      3200
KING               10                                      5100
TURNER             30                                      9000
ADAMS              20                                      1300

*.case 함수
decode함수기능 확장, 산술연산, 관계연산, 논리연산 비교가능.
case [표현식] when 조건 then 조건만속시 실행코드
else 이후 불만족시 코드.
end


SQL> --급여가 1300이하이면 '급여올려주삼'
SQL> --1300초과하면서 2999이하이면 '나도 올려줘'
SQL> --2999초과 4000이하 '희망~!'
SQL> --그 외 '나두~~'

  1  select ename, sal,
  2  case when sal<1300 then '급여올려주삼'
  3   when sal>=1300 and sal<=2999 then '나도 올려줘'
  4   when sal<4000 then '희망!'
  5  else '나두~~'
  6  end
  7* from emp
SQL> /

ENAME             SAL CASEWHENSAL<
---------- ---------- ------------
SMITH             800 급여올려주삼
ALLEN            1600 나도 올려줘
WARD             1250 급여올려주삼
JONES            2975 나도 올려줘
MARTIN           1250 급여올려주삼
BLAKE            2850 나도 올려줘
CLARK            2450 나도 올려줘
SCOTT            3000 희망!
KING             5000 나두~~



===============
1. 사원명, 급여 "한달급여", "일당" 구하기 / 한달 20일근무
 select ename, sal, sal/20
 from emp

2. 사원명,입사일,입사한 달의 근무일수 출력(날마다 근무)
select ename, hiredate, last_day(hiredate)-hiredate
from emp

3. 우리 과정 개강한지 오늘로 몇일?
select sysdate-to_date('2009-05-25','yyyy-mm-dd')
from dual


Posted by 말없제이
,

그냥 환경설정이죠 - -

사용자 삽입 이미지

사용자 삽입 이미지

사용자 삽입 이미지

사용자 삽입 이미지

Posted by 말없제이
,