- 함수 권한 주기

grant execute
on 함수명
to  사용자이름(스키마이름)



- 함수 삭제

DROP FUNCTION PRMIT.GET_FUNCTION


방법1:

INSERT ALL

INTO table (column1, column2)

VALUES (value1, value2)

INTO table (column1, column2)

VALUES (value1, value2)

...etc...

SELECT * FROM DUAL;


방법2:

INSERT INTO table (column1, column2)

SELECT value1, value2 FROM DUAL UNION ALL

SELECT value1, value2 FROM DUAL UNION ALL

...etc...

SELECT value1, value2 FROM DUAL;



DBMS Tool 1:

INSERT INTO table (column1, column2) VALUES (value1, value2);

INSERT INTO table (column1, column2) VALUES (value1, value2);

INSERT INTO table (column1, column2) VALUES (value1, value2);

INSERT INTO table (column1, column2) VALUES (value1, value2);

INSERT INTO table (column1, column2) VALUES (value1, value2);

...etc...

INSERT INTO table (column1, column2) VALUES (value1, value2);


1. 자바에서 호출하는 경우

1CallableStatement cstmt = conn.prepareCall("{call PROC_BL_TO_UTM(?,?,?,?)}");
2cstmt.setString(1"37.465687");
3cstmt.setString(2"127.249481");
4cstmt.registerOutParameter(3, OracleTypes.FLOAT);
5cstmt.registerOutParameter(4, OracleTypes.FLOAT);
6cstmt.execute();
7uTmx = cstmt.getFloat(3);
8uTmy = cstmt.getFloat(4);


2. iBatis에서 프로시저 호출하기

SqlMap 설정

<parameterMap class="map" id="blParam">
  <parameter property="p_latitude" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>
  <parameter property="p_longitude" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>
  <parameter property="p_utmx" jdbcType="DECIMAL" javaType="long" mode="OUT"/>
  <parameter property="p_utmy" jdbcType="DECIMAL" javaType="long" mode="OUT"/>
 </parameterMap>
  
 <procedure id="bl_to_utm" parameterMap="blParam">
  <![CDATA[
   {call PROC_BL_TO_UTM(?,?,?,?)}
  ]]>
 </procedure>


java 설정

1Map<string, object=""> map = new HashMap<string,object>();
2map.put("p_latitude",vo.getX_latitude());
3map.put("p_longitude", vo.getX_longitude());
4sqlMapper.update("VocIphone.bl_to_utm", map );
5 
6String utmx = map.get("p_utmx").toString();
7String utmy = map.get("p_utmy").toString();</string,object></string,>



SqlMap 쪽에서 parameterMap 으로 설정해놓은 형식으로 프로시저에 전달되고 리턴은 데이터를 실어서 날렸던 맵으로 돌아옴
sqlMapper를 실행시킬때 update / queryForObject / queryForList 를 사용할수 있으니 리턴 타입에 맞춰서 사용하면 됨

out을 리스트로 받는 경우 resultMap을 설정해서 List 형태로도 받을수 있다. 

<parameter property="result" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" resultMap="resultParam" mode="OUT"/>

resultMap을 설정해주고 resultMap에서 property와 column이름을 설정해주고 class를 미리 만들어놓은 VO객체로 넣어주면 해당항목의 리스트로 프로시저 실행결과가 리턴된다. 

3. 주의사항

sqlMap에서 프로시저를 호출할때

<procedure id="bl_to_utm" parameterMap="blParam">
   {
     call PROC_BL_TO_UTM(?,?,?,?)
    }
 </procedure>


위의 코드처럼 중괄호를 적어놓으면 에러가 난다..;; 괜히 보기 편하게 만든다고 했다가 삽질하게 된다. 

파라미터의 타입

만약 프로시저의 파라미터가 Number 타입이라면.. OUT 파라미터 정의에서 Number라고 쓰면 에러가 남
오라클의 경우 프로시저 내부에서 Number를 BigDecimal로 변환해서 사용한다고 한다. 따라서 아래처럼 적으면 에러가 난다. 

<parameter property="p_utmy" jdbcType="NUMBER" javaType="java.util.Number" mode="OUT"/>ERROR


<parameter property="p_utmy" jdbcType="DECIMAL" javaType="long" mode="OUT"/>

jdbcType="DECIMAL"이런 형태로 적어줘야 정상적으로 실행된다. 






출처 : http://rinn.kr/46

*******  Windows용 오라클 삭제 방법 *******


1. 시작-모든프로그램-
    Oracle Installation Products-Universal Installer
    를 클릭


2. 제품설치해제를 클릭-독립형제품과 Oracle홈의 
    체크박스를 클릭합니다. 
    그런다음에 다음을 클릭하여 진행합니다.
    -- 소요시간 현재 우리컴퓨터 기준으로 약 15분 소요


3. 시작-실행-regedit 엔터
    레지스트리 편집기를 오픈합니다.
    내컴퓨터--HKEY_LOCAL_MACHINE
    --SYSTEM--ControlSet001--Services
    --Oracle* 모두 삭제를 합니다.

    내컴퓨터--HKEY_LOCAL_MACHINE
    --SYSTEM--ControlSet002--Services
    --Oracle* 모두 삭제를 합니다.

    내컴퓨터--HKEY_LOCAL_MACHINE
    --SYSTEM--CurrentControlSet--Services
    --Oracle* 모두 삭제를 합니다.


4. 반드시 재부팅을 합니다.


5. 탐색기에서 오라클을 설치한 c:\oracle 폴더를 
   삭제합니다. 또는 e:\oracle 도 되어질수 있습니다.


6. 탐색기에서 C:\Program Files\Oracle 폴더를
    삭제합니다.


7. 이렇게 하면 깔끔하게 Oracle 이 제거됩니다.



출처 : http://erictus.tistory.com/entry/%EC%98%A4%EB%9D%BC%ED%81%B4-%ED%99%95%EC%8B%A4%ED%95%9C-%EC%A0%9C%EA%B1%B0%EB%B0%A9%EB%B2%95

<div class="information"> 사용된 개발환경

  • iBATIS : 2.3.0.677
  • Oracle : 10g
  • eclipse : wtp All-in-one R-1.5.4-200705021353

</div>

<div class="warning">

  • xml설정파일에서는 대소문자 구분이 의외로 굉장히 중요하다. 필자의 경우 jdbcType 의 값을 INTEGER로 줘야 하는데도 불구하고 Integer로 줘서 한참동안이나 고생을 했다.
  • Procedure에서는 Map을 사용할 경우 queryForObject 메소드의 반환 객체에 값이 셋팅되는것이 아니고 넘긴 객체에 값이 셋팅된다. 기본적으로 반환되는 Map객체는 null로 넘어온다. 프로시저에서 넘긴값을 인자로 넘긴 Map에 셋팅되니 이점에 유의해서 사용해야 한다.

</div>

  1. IN 타입 예제[1]
  2. OUT 타입 예제[2]
  3. INOUT 타입 예제[3]

IN타입[#1]#

  • IN파라미터란! : 호출자에 의해 프로시저에 전달되는 파라미터이고 읽기전용의 값이다. 즉 프로시저는 이 값을 변경할수는 없다.
  • 테스트 케이스 : 여기서는 IN타입으로 값을 받아와서 특정 테이블에 값을 입력하는 케이스를 보여준다.

프로시저#

CREATE OR REPLACE PROCEDURE procedurein (p_param IN NUMBERIS
BEGIN
   DBMS_OUTPUT.put_line (p_param);
   INSERT INTO tablein VALUES (p_param);
   commit;
END;
/

테이블 생성#

create table tablein(val number);

sqlMap파일#

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMap      
    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"      
    "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="Account">
  <procedure id="inProcedure" parameterClass="java.lang.Integer">
    call procedurein(#val#) }
  </procedure>
</sqlMap>

실행코드#

package com.mydomain.data;

.......................

public class SimpleExample {

  private static SqlMapClient sqlMapper;
  static {
    try {
      Reader reader = Resources.getResourceAsReader("com/mydomain/data/SqlMapConfig.xml");
      sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
      reader.close();
    catch (IOException e) {
      throw new RuntimeException("Something bad happened while building the SqlMapClient instance." + e, e);
    }
  }
  
  public static void callInTypeProcedure(int valthrows SQLException{
    sqlMapper.queryForObject("inProcedure"new Integer(val));
  }

  public static void main(String[] argsthrows SQLException {
    
    try {
      callInTypeProcedure(123);
    catch (Exception e) {
      e.printStackTrace();
    }
  }
}

결과#

SQL> select * from tableIN;

       VAL
----------
       123

SQL>

여기서 보면 인자로 123이라는 숫자값을 넘겼으며 프로시저에 정의된 내용대로 tableIN이라는 테이블에 값이 정상적으로 입력이 된것을 볼수 있다.

OUT타입[#2]#

  • OUT파라미터란! : 프로시저에서 값이 변경될수 있다. 이 파라미터는 프로시저가 다수의 정보를 호출자에게 반환시켜주어야 하는 경우에 주로 사용한다.
  • 테스트 케이스 : 여기서는 IN타입으로 입력된 숫자값에 3을 더한 값을 반환하는 것을 보여주는 예제이다.

프로시저#

CREATE OR REPLACE PROCEDURE procedure_out(p_inval in integer, p_outval out integerIS 
BEGIN
   p_outval := p_inval+3;
END;
/

sqlMap파일#

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMap      
    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"      
    "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="Account">
  <parameterMap id="outProcedureMap" class="java.util.Map">
    <parameter property="p_inval" javaType="java.lang.Integer" jdbcType="INTEGER" mode="IN" />
    <parameter property="p_outval" javaType="java.lang.Integer" jdbcType="INTEGER" mode="OUT" />
  </parameterMap>
  
  <procedure id="outProcedure" parameterMap="outProcedureMap">
    call procedure_out (?,?) }
  </procedure>
</sqlMap>

실행코드#

package com.mydomain.data;

.......................

public class SimpleExample {

  private static SqlMapClient sqlMapper;
  static {
    try {
      Reader reader = Resources.getResourceAsReader("com/mydomain/data/SqlMapConfig.xml");
      sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
      reader.close();
    catch (IOException e) {
      throw new RuntimeException("Something bad happened while building the SqlMapClient instance." + e, e);
    }
  }
  
  public static Map callOutTypeProcedure(Map mthrows SQLException{
    sqlMapper.queryForObject("outProcedure", m);
    return m;
  }

  public static void main(String[] argsthrows SQLException {    
    try {
      Map<String, Integer> m = new HashMap<String, Integer>(2);
      m.put("p_inval"new Integer(123));      
      Map result = SimpleExample.callOutTypeProcedure(m);
      System.out.println("result : " + Integer.parseInt(result.get("p_outval").toString()));    
    catch (Exception e) {
      e.printStackTrace();
    }
  }
}

결과#

result : 126

인자로 넘겨진 값인 123에 3을 더해 126이라는 값이 반환되었다.

INOUT타입[#3]#

  • INOUT파라미터란! : 프로시저가 읽고 쓰는 작업을 동시에 할수 있는 파라미터를 의미한다.
  • 테스트 케이스 : 여기서는 INOUT타입으로 값을 받아와서 값의 위치를 서로 바꿔서 값을 입력한 뒤 반환하는 케이스를 보여주는 예제이다.

프로시저#

CREATE OR REPLACE PROCEDURE procedure_inout(p_inout1 in out integer, p_inout2 in out integerIS
tmpVar NUMBER;
BEGIN
   tmpVar:=p_inout1;
   p_inout1:=p_inout2;
   p_inout2:=tmpVar;
END;
/

sqlMap파일#

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMap      
    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"      
    "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="Account">
  <parameterMap id="inoutProcedureMap" class="java.util.Map">
    <parameter property="p_inout1" javaType="java.lang.Integer" jdbcType="INTEGER" mode="INOUT" />
    <parameter property="p_inout2" javaType="java.lang.Integer" jdbcType="INTEGER" mode="INOUT" />
  </parameterMap>  
  
  <procedure id="inoutProcedure" resultClass="java.util.Map" parameterMap="inoutProcedureMap">
    call procedure_inout(?, ?) }
  </procedure>  
</sqlMap>

실행코드#

package com.mydomain.data;

.......................

public class SimpleExample {

  private static SqlMapClient sqlMapper;
  static {
    try {
      Reader reader = Resources.getResourceAsReader("com/mydomain/data/SqlMapConfig.xml");
      sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
      reader.close();
    catch (IOException e) {
      throw new RuntimeException("Something bad happened while building the SqlMapClient instance." + e, e);
    }
  }
  
  public static Map callProcedure(Map mthrows SQLException{
    sqlMapper.queryForObject("inoutProcedure", m);    
    return m;
  }

  public static void main(String[] argsthrows SQLException {
    
    try {
      Map<String, Integer> m = new HashMap<String, Integer>(2);
      m.put("p_inout1"new Integer(7));
      m.put("p_inout2"new Integer(5));
      System.out.println("인자로 넘어가는 값 \n"+m);
      Map map = (HashMap)SimpleExample.callProcedure(m);
      System.out.println("결과로 넘어온 값 \n"+m);
    catch (Exception e) {
      e.printStackTrace();
    }
  }
}

결과#

인자로 넘어가는 값 
{p_inout1=7, p_inout2=5}
결과로 넘어온 값 
{p_inout1=5, p_inout2=7}

보면 처음에 넘긴값은 p_inout1값이 7이고 p_inout2값인데 반환값은 반대로 5, 7이다. 즉 프로시저의 처리고 값이 정상적으로 바껴서 넘어온것이다.




출처 : http://ldg.pe.kr/Wiki.jsp?page=ProcedureExample

-- ADMIN 계정에 접속 후

GRANT SELECT, INSERT, DELETE, UPDATE ON '권한 줄 테이블 명' TO '권한 받을 계정'


ex)

GRANT SELECT, INSERT, DELETE, UPDATE ON TB_TEST TO IPPMBL_APP;



-- 각 계정에 접속 후,

CREATE SYNONYM '바뀔 명칭' FOR '해당계정.해당 명칭'


ex)

--TEST1 계정 접속 후

CREATE SYNONYM TB_TEST FOR IPPADM_APP.TB_TEST;


--TEST2 계정 접속 후

CREATE SYNONYM TB_TEST FOR IPPADM_APP.TB_TEST;




-- MGR 계정에 접속해 모두 줄수도 있다

CREATE OR REPLACE SYNONYM COKR_APP.TAB_SOLAR_AREA FOR COKR_MGR.TAB_SOLAR_AREA;


CREATE OR REPLACE SYNONYM B2B_COKR_APP.TAB_SOLAR_AREA FOR COKR_MGR.TAB_SOLAR_AREA;



GRANT DELETE, INSERT, SELECT, UPDATE ON COKR_MGR.TAB_SOLAR_AREA TO COKR_APP;


GRANT DELETE, INSERT, SELECT, UPDATE ON COKR_MGR.TAB_SOLAR_AREA TO B2B_COKR_APP;

'Database > Oracle' 카테고리의 다른 글

[DB] 오라클 확실한 삭제 방법  (0) 2015.01.07
[Example] procedure 예제  (0) 2014.11.04
[Select] SELECT * INTO와 INSERT INTO SELECT..의 차이점  (0) 2014.11.04
[Permission] 계정 권한  (0) 2014.10.26
[Query] Outer Join  (0) 2014.10.01

1.SELECT * INTO사용법

   SELECT  INTO 구문은 원본은 있고 대상 테이블은 새롭게 생성하려 할 경우 사용합니다.

   TABLE A에서 모든 데이터를 가져와 A_COPY라는 테이블을 생성하여 데이터를 INSERT하고 싶습니다.

   물론 A_COPY라는 테이블은 현재 만들어져있지 않습니다.

 

   SELECT * INTO A_COPY FROM A

 

   위와 같이 하면 A테이블과 같은 컬럼과 데이터를 가지는 A_COPY라는 테이블이 생성됩니다.

   그럼 A테이블의 특정 컬럼만 가져오려면?

 

   SELECT * INTO A_COPY

   FROM (

              SELECT COL1,COL2,COL3.... FROM A 

             ) AS TEMP_TABLE

   위와 같이 하면 A테이블의 특정 컬럼만 가져와서 A_COPY라는 테이블을 생성하여 데이터를 INSERT합니다.

 

2.INSERT INTO SELECT 사용법

   INSERT INTO 구문은 원본과 대상테이블이 모두 있을 경우 사용합니다.

   TABLE A에서 모든 데이터를 가져와 B라는 테이블에 INSERT 하고 싶습니다.

  

   INSERT INTO B SELECT * FROM A

   위에서 TABLE A와 TABLE B는 스키마가 동일해야 합니다.

 

   만일 A보다 컬럼수가 적을 경우에는

   INSERT INTO B SELECT COL1,COL2,COL3 FROM A

   와 같이 사용할 수 있습니다.



3. 오라클에서 신규 테이블생성 ctas를 이용하면 됩니다.

create table new_table
as 
select * from old




출처 : http://tit99hds.egloos.com/viewer/928582

'Database > Oracle' 카테고리의 다른 글

[Example] procedure 예제  (0) 2014.11.04
[Oracle] GRANT , SYNONYM 주는 방법  (0) 2014.11.04
[Permission] 계정 권한  (0) 2014.10.26
[Query] Outer Join  (0) 2014.10.01
[Multi Update] 다중 row 같은 column update  (0) 2014.09.18


create user scott identified by tiger

default tablespace users

temporary tablespace temp;


alter user scott identified by tiger;

alter user scott account unlock;

Outer Join 이란?

  • - Equi Join은 조인을 생성하려는 두 개의 테이블의 한쪽 컬럼에서 값이 없다면 테이터를 반환하지 못한다.
  • - 동일 조건에서 조인 조건을 만족하는 값이 없는 행들을 조회하기 위해 Outer Join을 사용 한다.
  • - Outer Join 연산자는 "(+)" 이다.
  • - 조인시 값이 없는 조인측에 "(+)"를 위치 시킨다.
  • - Outer Join 연산자는 표현식의 한 편에만 올 수 있다.


Outer Join 예제

Equi Join과 Outer Join의 비교.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
-- Equi Join 으로 부서 번호를 조회하는 예제
SELECT DISTINCT(e.deptno), d.deptno, d.dname
  FROM emp e, dept d
 WHERE e.deptno = d.deptno;
 
DEPTNO     DEPTNO
------ ----------
    10         10
    20         20
    30         30
 
-- Outer Join 으로 부서 번호를 조회하는 예제
SELECT DISTINCT(e.deptno), d.deptno
  FROM emp e, dept d
 WHERE e.deptno(+) = d.deptno;
 
DEPTNO  DEPTNO
 ------- --------
     10       10
     20       20
     30       30
              40


Outer Join을 사용하는 테이블에 추가로 조건절이 있다면 (+)연산자를 모두 해야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-- ename LIKE 조건절에 (+)연산자가 누락된 경우
SELECT DISTINCT(a.deptno), b.deptno
  FROM emp a, dept b
 WHERE a.deptno(+) = b.deptno
   AND a.ename LIKE '%';
 
DEPTNO     DEPTNO
---------- ----------
        10         10
        20         20
        30         30
 
-- ename LIKE 조건절에 (+)연산자를 추가해야 정상적으로 데이터가 조회 된다.
SELECT DISTINCT(a.deptno), b.deptno
  FROM emp a, dept b
 WHERE a.deptno(+) = b.deptno
   AND a.ename(+) LIKE '%';
 
DEPTNO  DEPTNO
 ------- --------
     10       10
     20       20
     30       30
              40


LEFT, RIGHT, FULL Outer Join

Oracle9i 부터는 ANSI/ISO SQL 표준인 LEFT OUTER JOIN , RIGHT OUTER JOIN, FULL OUTER JOIN를 지원 한다.


LEFT OUTER JOIN

LEFT OUTERL JOIN은 오른쪽 테이블(아래 예제에서 emp테이블)에 조인시킬 컬럼의 값이 없는 경우 사용한다.

1
2
3
4
5
-- LEFT OUTER JOIN 조인 예제
SELECT DISTINCT(e.deptno), d.deptno
  FROM dept d
  LEFT OUTER JOIN emp e
  ON d.deptno = e.deptno; 


RIGHT OUTER JOIN

RIGHT OUTERL JOIN은 왼쪽 테이블(아래 예제에서 emp테이블)에 조인시킬 컬럼의 값이 없는 경우 사용한다.

1
2
3
4
5
-- RIGHT OUTER JOIN 조인 예제
SELECT DISTINCT(e.deptno), d.deptno
  FROM emp e
 RIGHT OUTER JOIN dept d
    ON e.deptno = d.deptno;


FULL OUTER JOIN

FULL OUTERL JOIN은 양쪽 테이블 모두 Outer Join걸어야 하는 경우 사용 한다.

1
2
3
4
5
-- FULL OUTER JOIN 조인 예제
SELECT DISTINCT(e.deptno), d.deptno
  FROM emp e
  FULL OUTER JOIN dept d
    ON e.deptno = d.deptno;






출처 : http://www.gurubee.net/lecture/1021

UPDATE TB_CM_BOARD

        SET

        EXT_ATTR5 = CASE

            WHEN BOARD_NUM=1142  THEN

            WHEN BOARD_NUM=1143  THEN

            WHEN BOARD_NUM=1144  THEN

            WHEN BOARD_NUM=1145  THEN 4

            WHEN BOARD_NUM=1146  THEN 5  

        END

WHERE

        BOARD_NUM IN (1142, 1143, 1144, 1145, 1146)


 

인덱스가 1142, 1143, 1144, 1145, 1146에 대한 글의 ext_attr5 컬럼의 값들을

1, 2, 3, 4, 5 로 업데이트

+ Recent posts