os : windows7 64bit

DB : 32bit client(server)

Toad : 32bit ver.10


 

tns 리스너가 로컬을 찾지 못해 나는 에러.

listener.ora 파일 변경


 


SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (SID_NAME = orcl)

      (ORACLE_HOME = C:\app\kimjinmi\product\11.2.0\dbhome_1)

#      (PROGRAM = extproc) 주석처리

      (ENVS = "EXTPROC_DLLS=ONLY:C:\app\kimjinmi\product\11.2.0\dbhome_1\bin\oraclr11.dll")

    )

  )


 


빨간색으로 한부분을 자신의  SID 명으로 바꿔준다.


toad는 tns 리스너를 통해 DB에 접근하게 된다.


오라클을 클라이언트가 아닌 서버로 설치할 경우 로컬을 서버로 인식하지 못해


DB 에 접근할 수 없어 에러가 나타난다.

view > toad option > execute/compile > Substitution~~~ 

를 none으로 하면 특수문자 입력됩니다. 

SELECT MAX (DECODE (activity_item, 110, activity_item, 0) ) t1,

         MAX (DECODE (activity_item, 210, activity_item, 0) ) t2,

         MAX (DECODE (activity_item, 220, activity_item, 0) ) t3,

         MAX (DECODE (activity_item, 230, activity_item, 0) ) t4

    FROM TB_EV_ACTIVITY

GROUP BY mem_id, idea_num


해당 mem_id 참여자와, idea_num 아이디어로 중복을 제거한뒤

decode 함수로 해당 테이블의 activity_item이 110일때만 뽑고 나머진 0 으로 나오기때문에

그중 최고치인(max) 110을 제외한 나머지 행을 중복 거른다


결국 한 사람 과 한 아이디어에 관해 (group by) 110, 210 혹은 210, 220, 230 처럼 

열 데이터를 행으로 뿌려준다





아래 출처 : http://www.gurubee.net/lecture/1028


DECODE함수는 집계함수와 함께 통계 데이터를 추출할 때 많이 사용한다. 아래는 부서별로 급여합계를 조회하는 예이다

1
2
3
4
5
6
7
8
9
10
11
12
13
-- 부서별로 급여 합계를 출력한다.
SELECT deptno, NVL(SUM(DECODE(deptno, 10, sal)),0) deptno10,
               NVL(SUM(DECODE(deptno, 20, sal)),0) deptno20,
               NVL(SUM(DECODE(deptno, 30, sal)),0) deptno30,
               NVL(SUM(DECODE(deptno, 40, sal)),0) deptno40
  FROM emp
 GROUP BY deptno;
 
DEPTNO   DEPTNO10   DEPTNO20   DEPTNO30   DEPTNO40
------- --------- --------- ---------- ----------
     30         0         0       9400          0
     20         0     10875          0          0
     10      8750         0          0          0

아래 부서별 급여합계 예를 보면 일반적인 집계함수를 사용할 때는 급여 합계가 행으로 조회가 되지만, DECODE와 MAX함수를 사용하면 열로 값을 표시할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
-- 부서별로 급여 합계를 행으로 출력한다.
SELECT d.deptno, NVL(SUM(e.sal),0) sal
  FROM emp e, dept d
 WHERE e.deptno(+) = d.deptno
 GROUP BY d.deptno;
 
DEPTNO        SAL
-------- ----------
      10       8750
      20      10875
      30       9400
      40          0
 
 
 
-- 부서별로 급여 합계를  열로 출력한다.
SELECT MAX(NVL(SUM(DECODE(deptno, 10, sal)),0)) deptno10,
       MAX(NVL(SUM(DECODE(deptno, 20, sal)),0)) deptno20,
       MAX(NVL(SUM(DECODE(deptno, 30, sal)),0)) deptno30,
       MAX(NVL(SUM(DECODE(deptno, 40, sal)),0)) deptno40
  FROM emp
 GROUP BY deptno;
 
DEPTNO10   DEPTNO20   DEPTNO30   DEPTNO40
--------- ---------- ---------- ----------
    8750      10875       9400          0

Oracle 에 존재하는 Object 정보를 관리하는 테이블명은 USER_OBJECT 라고 한다.


- 테이블 구조

 OBJECT_NAME

 1

 VARCHAR2 (128 Byte)

 SUBOBJECT_NAME

 2

 VARCHAR2 (30 Byte)

 OBJECT_ID

 3

 NUMBER

 DATA_OBJECT_ID

 4

 NUMBER

 OBJECT_TYPE

 5

 VARCHAR2 (19 Byte)

 CREATED

 6

 DATE

 LAST_DDL_TIME

 7

 DATE

 TIMESTAMP

 8

 VARCHAR2 (19 Byte)

 STATUS

 9

 VARCHAR2 (7 Byte)

 TEMPORARY

 10

 VARCHAR2 (1 Byte)

 GENERATED

 11

 VARCHAR2 (1 Byte)

 SECONDARY

 12

 VARCHAR2 (1 Byte)

 NAMESPACE

 13

 NUMBER

 EDITION_NAME

 14

 VARCHAR2 (30 Byte)

 

▼ OBJECT_TYPE


TABLE SUBPARTITION

INDEX PARTITION

TABLE PARTITION

SEQUENCE

LOB PARTITION

PROCEDURE

LOB

INDEX SUBPARTITION

PACKAGE

PACKAGE BODY

TRIGGER

TABLE

FUNCTION

INDEX

VIEW

TYPE

CLUSTER




SELECT * FROM USER_OBJECTS

WHERE OBJECT_TYPE = 'TABLE'



SELECT * FROM USER_OBJECTS

WHERE OBJECT_TYPE = 'TYPE'


상위 Query 로 정보를 얻을 수 있다.




1. MUTATING ERROR란 무엇인가?


어느 TABLE에 DML(INSERT, UPDATE, DELETE 등)이 실행될 때마다 프로그램에

구애받지 않고 특정 작업을 수행하려할 때 database trigger를 사용한다.

예)EMP table에 data insert, update, delete 시 부서별 평균 급여 table에

updating 하는 경우.


이 경우 trigger를 사용하지 않고 같은 작업을 하려면 평균 급여를 구하는

PL/SQL program을 개발하여 EMP 테이블에 action이 발생 시마다 call하여 사용

하든가, 아니면 각 action 발생 후 동일한 routine을 반복 수행시켜야 한다.


이 때 만일 user가 EMP table에 update 시마다 EMP table에 어떤 처리를 수행

하는 trigger를 만든다면 원치 않는 결과를 일으킬 수 있고 OS memory가 소진

될 때까지 trigger가 trigger를 recursive하게 fire시켜 마치 looping

program과 같은 상황을 초래할 수도 있다.


이러한 trigger를 recursive trigger라 부르며 이런 불상사를 막기 위해

ORACLE은 EMP table에 row trigger를 만들어 원천적으로 trigger 내에서

EMP table을 아예 access 할 수 없도록 하고 있고, 이와 같은 원칙에 위배될

경우 발생되는 error를 mutating error 라고 부른다.


이 경우 user가 trigger를 만든 후 DML(insert, update, delete)을 수행 시

"ORA-4091:table SCOTT.EMP is mutating, trigger/function may not see

it." 와 같은 error를 만나게 된다.



2. ERROR가 발생하는 조건.


TRIGGER에는 다음과 같은 두 종류가 있다.

*row trigger - 프로그램에서 한 row 단위로 처리 시 처리할 때마다

fire되는 trigger.


*statement trigger - 프로그램 당 한번만 fire되는 trigger.


위와 같으므로 만일 application에서 한 row만 처리한다면 두 type에는 차이가

없고 여러 row를 처리할 경우 두 type 간의 차이가 발생한다.


Statement trigger는 일부 제한은 있으나 원칙적으로 mutating error를 발생

시키지 않는다.

Row trigger는 하나의 row 처리 후 해당 table에 대한 계속된 row 처리가 있을

수 있으므로 작업이 완료되기까지 해당 table을 access하는 것이 금지되지만

statement trigger는 일단 하나의 statement가 완료되었다는 보장을 할 수

있으므로 mutating의 기본 속성인 "현재 변화되고 있는 table" 이라는 범위에

들지 않는다.

따라서, mutating error는 row trigger에서의 제한 사항이라 해도 무리가 없다.



3. 해결 방법.


위에서 보았 듯 mutating error를 피해 나가려면 statement trigger를 사용하면

어 려움이 없으나 statement trigger에서는 row trigger에서와 같이 row 단위로

변경 전 후 column data를 handling할 수 없다는 단점이 있다.

즉 :new.column, :old.column을 사용하지 못한다.


이 와 같은 문제로 인하여 row trigger를 사용 시는 temp table 이나 PLSQL

table을 이용하여 피해갈 수가 있다.


다음은 row trigger를 사용 시 mutating error를 유발하는 case(A)와

이를 statement trigger로 전환하여 error를 피해가는 case(B)

에 대한 내용이다.


예) EMP table에 insert, update, delete 시 부서별 평균 급여를 계산하여

DEPT table에 load한다. (TABLE COLUMN은 다음과 같다.)


SQL> desc emp

Name Null? Type

------------------------------- -------- ----

EMPNO NOT NULL NUMBER(4)

ENAME VARCHAR2(10)

JOB VARCHAR2(9)

MGR NUMBER(4)

HIREDATE DATE

SAL NUMBER(7,2)

COMM NUMBER(7,2)

DEPTNO NUMBER(2)



SQL> desc dept

Name Null? Type

------------------------------- -------- ----

DEPTNO NUMBER(2)

DNAME VARCHAR2(14)

LOC VARCHAR2(13)

SAL NUMBER(7,2)




(CASE A) ROW Trigger 만을 사용 시 에러가 발생하는 case.


1) row trigger 생성


create or replace trigger emp_aft_row_trigger

after insert or update or delete on emp

for each row

declare

v_sal emp.sal%type;

begin

select avg(sal) into v_sal from emp

where deptno=:old.deptno;


update emp

set sal=v_sal

where deptno=:old.deptno;


if :old.deptno != :new.deptno then

select avg(sal) into v_sal from emp

where deptno=:new.deptno;


update emp

set sal=v_sal

where deptno=:new.deptno;

end if;

end;

/


2) DATA 1건을 UPDATE한다.


SQL)update emp

set sal=10000

where empno= 7934;

SQL)

update emp

*

ERROR at line 1:

ORA-04091: table JMKIM.EMP is mutating, trigger/function may not

see it

ORA-06512: at line 4

ORA-04088: error during execution of trigger 'JMKIM.EMP_AFT_ROW_TRIGGER'




(CASE B) 에러를 피해 가는 방법


1) PL/SQL table을 생성한다.


SQL) create or replace PACKAGE emp_pkg as

TYPE emp_tab_type is table of EMP.DEPTNO%TYPE

index by binary_integer;

emp_old emp_tab_type;

emp_new emp_tab_type;

emp_index binary_integer;

end emp_pkg;

/


Package created.



2) BEFORE STATEMENT trigger를 생성한다.


SQL)create or replace TRIGGER emp_bef_stm_all

before insert or update or delete on emp

begin

emp_pkg.emp_index :=0;

end;

/

SQL)

Trigger created.



3) AFTER ROW trigger를 생성한다.


SQL>create or replace TRIGGER emp_aft_row_all

after insert or update or delete on emp

for each row

begin

emp_pkg.emp_index := emp_pkg.emp_index + 1;

emp_pkg.emp_old(emp_pkg.emp_index) := :old.deptno;

emp_pkg.emp_new(emp_pkg.emp_index) := :new.deptno;

end;

/

SQL>Trigger created.



4) AFTER STATEMENT trigger를 생성한다.


SQL>create or replace TRIGGER emp_aft_stm_all

after insert or update or delete on emp

declare

v_sal emp.sal%type;

begin

for i in 1 .. emp_pkg.emp_index loop

select avg(sal) into v_sal from emp

where deptno=emp_pkg.emp_old(i);

update dept

set sal = v_sal

where deptno=emp_pkg.emp_old(i);

dbms_output.put_line('DEPTNO(old)=>'||to_char(emp_pkg.emp_old(i)));

if emp_pkg.emp_new(i) != emp_pkg.emp_old(i) then

select avg(sal) into v_sal from emp

where deptno=emp_pkg.emp_new(i);

update dept

set sal = v_sal

where deptno=emp_pkg.emp_new(i);

dbms_output.put_line('DEPTNO(new)=>'||to_char(emp_pkg.emp_new(i)));

end if;

end loop;

emp_pkg.emp_index :=0;

end;

/


SQL>

Package created.



5) data insert 및 확인


SQL> update emp

set sal = 9000

where empno=7902;


SQL>

DEPTNO(old)=>20

1 row updated.



- 함수 권한 주기

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);

*******  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

+ Recent posts