반응형

CHR(9) => DBMS.output에서 탭값 출력하기

엑셀에 바로 붙여넣기 귀찮아서 ... ㅋㅋ;

값을 쉽게 구하자..

 또한 & 표시는 CHR(38) 번.

PL/SQL 구문은 & 표시는 값을 입력받도록 되어 있어

REPLACE 구문으로 입력받은 값을 치환할 때 컴파일이 정상적으로 되지 않을수 있음...



간단한 C...를 통해 CHR값을 출력 할 수 있다.

#include <stdio.h>

void main()
{
   char a='\t';
   printf("%d", a);
}

반응형
반응형

1. pkg_backup.sh 파일내용

###  오라클 환경 설정(.profile 참조)

###

sqlplus -SILENT 아뒤/패스워드

@/oracle/backup_pkg/get_pkg_name.sql > names.txt

yd=`date +%Y%m%d`
mkdir -p /oracle/backup_pkg/pkgs/$yd
for get_name in `cat names.txt`
do
        echo "$get_name Package Header Backup"
        echo "set heading off ;" > get_pkg.sql

        echo "set linesize 10000;" >> get_pkg.sql
        echo "set pagesize 50000; " >> get_pkg.sql

        echo "set feedback off; " >> get_pkg.sql
        echo "set verify off;" >> get_pkg.sql

        echo "SELECT TEXT FROM ALL_SOURCE " >> get_pkg.sql
        echo "WHERE TYPE='PACKAGE'" >> get_pkg.sql
        echo "AND   OWNER=''"    >> get_pkg.sql
        echo "AND   NAME='$get_name';" >> get_pkg.sql

        echo "exit; " >> get_pkg.sql

        chmod +x get_pkg.sql

        echo "CREATE OR REPLACE " > /oracle/backup_pkg/pkgs/$yd/$get_name.pks

        sqlplus -SILENT 아뒤/패스워드 @get_pkg.sql >> /oracle/backup_pkg/pkgs/$yd/$get_name.pks


        echo "$get_name Package Body Backup"
        echo "set heading off ;" > get_pkg.sql

        echo "set linesize 10000;" >> get_pkg.sql
        echo "set pagesize 50000; " >> get_pkg.sql

        echo "set feedback off; " >> get_pkg.sql
        echo "set verify off;" >> get_pkg.sql

        echo "SELECT TEXT FROM ALL_SOURCE " >> get_pkg.sql
        echo "WHERE TYPE='PACKAGE BODY'" >> get_pkg.sql
        echo "AND   OWNER=''"    >> get_pkg.sql
        echo "AND   NAME='$get_name';" >> get_pkg.sql

        echo "exit; " >> get_pkg.sql

        chmod +x get_pkg.sql

        echo "CREATE OR REPLACE " > /oracle/backup_pkg/pkgs/$yd/$get_name.pkb

        sqlplus -SILENT 아뒤/패스워드 @get_pkg.sql >> /oracle/backup_pkg/pkgs/$yd/$get_name.pkb


done
cd -

2. get_pkg_name.sql  파일내용

-- 헤더 정보 출력되지 않게 설정
set heading off;

-- 페이지 사이즈를 최대한으로
set pagesize 10000;

-- 출력되는 행수 삭제
set feedback off;

set verify off;

-- 패키지의 이름을 가지고 옴
SELECT NAME FROM ALL_SOURCE
WHERE TYPE='PACKAGE'
AND   OWNER=''
GROUP BY NAME;

-- 종료
exit;

반응형
반응형

물론 난 백업 스크립트를 사용해서 백업하지만

윈도우 상에서 일괄적으로 백업 받을때

(낱개로는 TOAD등 툴을 통해 받을수 있지만...)

사용하면 좋은 프로그램...


프로시져백업.zip


반응형
반응형

본 자료는 일본 @IT(http://www.atmarkit.co.jp/fdb/index/index-db.html#sqlclinic)에 株式会社インサイトテクノロジー의 大道隆久씨가 연재한 SQLクリニック를 번역 재구성한 것입니다.

 

본연재는 SQL의 응용력을 가추고 싶은 엔지니어를 위해 다양한 테크닉을 소개한다. SQL의 기본 구문은 평이한 것이지만, 실무로 활용하려면  교과서적인 기술을 이해하는 것만으로는 불충분하다. 본연재는 저명한 메일 매거진 「오라!오라! Oracle - 듬뿍 검증 생활」을 발행하는 인사이트 테크놀로지의 컨설턴트를 집필진으로 맞이해 SQL의 센스 향상에 도움이 되는 각족 기술을 소개한다. 

 

## 테스트로 사용하는 샘플 테이블은 위의 링크로 부터 다운가능합니다.

 

 

Oracle 10g로 정규표현에 의한 문자열 조작 가능!!!


Oracle Database 10g부터 신규로 추가된 정규 표현 기능은 텍스트 형식 데이터를 취급하기 위한 강력한 툴입니다. 이것으로 SQL를 사용한 문자 데이터를 검색, 조작하는 능력이 큰폭으로 향상됩니다.

 

지금까지는 WHERE구 안에서 “LIKE”와 함께 사용하는 「%」나 「_」등에서 밖에 표현할 수 없었다 이제 애매한 문자열을 정규 표현을 사용해 문자수나 그 종류까지 지정할 수 있게 되었으므로 편리해 졌네요... 

Oracle 10g부터 서포트되는 정규 표현(REGEXP_LIKE, REGEXP_INSTR, REGEXP_SUBSTR, REGEXP_REPLACE 함수)을 소개합니다.

 

Oracle10g로 추가된 새로운 함수


Oracle9i까지 존재했던 함수에 「REGEXP_」를 붙여 정규 표현용의 함수가 준비되었습니다.(표1 참조) 차례로 조작 방법을 확인해 보게습니다. 

함수명칭

구문

설명

REGEXP_LIKE

REGEXP_LIKE(
    열명,
    조건
)

조건(정규 표현)을 사용해 애매한 조건 검색을 실시합니다 .검색 대상열에서는 문자 데이터형을 서포트합니다(CHAR, VARCHAR2, CLOB, NCHAR, NVARCHAR2 및 NCLOB는 서포트합니다만, LONG는 서포트하지 않습니다)

REGEXP_INSTR

REGEXP_INSTR(
    문자열 또는 열명,
    조건
    (,개시 위치)
)

지정한 조건(정규 표현)에 일치하는 부분의 최초의 값을 돌려줍니다.임의에, 검색을 개시하는 개시 위치를 지정하는 것도 가능합니다

REGEXP_SUBSTR

REGEXP_SUBSTR(
    문자열 또는 열명,
    조건
)

지정한 정규 표현에 일치하는 부분 문자열을 뽑아내 결과적으로 돌려줍니다

REGEXP_REPLACE

REGEXP_REPLACE(
    열명 또는 문자열,
    조건,
    치환 문자열
)

지정한 정규 표현에 일치하는 부분을 지정한 다른 문자열로 치환합니다. 복잡한 치환/검색 조작을 가능하게 합니다

표1 정규 표현을 사용하는 함수

 

 

1.REGEXP_LIKE함수

^^^^^^^^^^^^^^^^^^^^^^^^^

정규 표현을 사용해 애매한 조건 검색을 실시할 경우에 이용합니다.

 

構文

 REGEXP_LIKE(열명,조건)

 

 

 

SQL> SELECT * FROM TEST_REGEXP;

COL1
----------
ABCDE01234
01234ABCDE
abcde01234
01234abcde

SQL> SELECT * FROM TEST_REGEXP WHERE REGEXP_LIKE(COL1,'[0-9][A-Z]');

COL1
----------
01234ABCDE

SQL> SELECT * FROM TEST_REGEXP WHERE REGEXP_LIKE(COL1,'[0-9][a-z]');

COL1
----------
01234abcde

리스트1 REGEXP_LIKE 함수를 사용한 fuzzy reference

 

조금 익숙해 지면 이하와 같은 체크 사용도 가능합니다.

 

SQL> ALTER TABLE QA_MASTER ADD CONSTRAINT QA_NO_CHK CHECK
  2  (REGEXP_LIKE(QA_NO,
  3  '^([[:alpha:]]{2}-[[:digit:]]{2}-[[:digit:]]{4})$'));

Table altered.

SQL> INSERT INTO QA_MASTER VALUES('QA-01-0001');

1 row created.

SQL> INSERT INTO QA_MASTER VALUES('00-01-0001');
INSERT INTO QA_MASTER VALUES('00-01-0001')
*
ERROR at line 1:
ORA-02290: check constraint (ORAORA.QA_NO_CHK) violated

리스트2 Q/A관리 마스터에 QA번호를 등록할 때의 서식의 체크

 

이와 같이 허용된 데이터형식만을 체크할수 있습니다.

 

2.REGEXP_INSTR함수

^^^^^^^^^^^^^^^^^^^^^^^^^^

지정한 정규 표현에 일치하는 부분이 몇번째 문자인지를 돌려줍니다.

 

構文
 REGEXP_INSTR(문자열 또는 열명, 조건)

 

 

 

SQL> SELECT COL1,REGEXP_INSTR(COL1,'[0-9]') ,
  2  REGEXP_INSTR(COL1,'%') from TEST_REGEXP;

COL1       REGEXP_INSTR(COL1,'[0-9]') REGEXP_INSTR(COL1,'%')
---------- -------------------------- ----------------------
ABCDE01234                          6                      0
01234ABCDE                          1                      0
@|=)(9&%$#                          6                      8
あいうえ3                           5                      0

6 rows selected.

리스트3 REGEXP_INSTR를 사용한 지정 문자의 위치 검색

 

N번째 문자 이후의 숫자 출력은......

 

SQL> SELECT COL1,REGEXP_INSTR(COL1,'[0-9]',4) FROM TEST_REGEXP;

COL1       REGEXP_INSTR(COL1,'[0-9]',4)
---------- ----------------------------
ABCDE01234                            6
01234ABCDE                            4
abcde01234                            6
01234abcde                            4

리스트4 N번째 문자 이후의 숫자 출력

 

 

3.REGEXP_SUBSTR함수

^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

지정한 정규 표현에 일치하는 부분을 뽑아내 결과적으로 돌려줍니다.

 

構文
 REGEXP_SUBSTR(문자열 또는 열명, 조건)

 

 


SQL> SELECT COL1,REGEXP_SUBSTR(COL1,'[C-Z]+') FROM TEST_REGEXP;

COL1       REGEXP_SUBSTR(COL1,'[C-Z]')
---------- ---------------------------
ABCDE01234 CDE
01234ABCDE CDE
abcde01234
01234abcde

리스트 5 지정한 문자열을 선택


SQL> SELECT COL1,REGEXP_SUBSTR(COL1,'[C-Z]') FROM TEST_REGEXP;

COL1       REGEXP_SUBSTR(COL1,'[C-Z]')
---------- ---------------------------
ABCDE01234 C
01234ABCDE C
abcde01234
01234abcde

리스트 6 해당하는 1 문자만을 선택

 

 

4.REGEXP_REPLACE함수

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

지정한 정규 표현에 일치하는 부분을 지정한 다른 문자열로 교체합니다.

 

構文
 REGEXP_REPLACE(열명 또는 문자열, 조건, 치환 문자열)

 

 


SQL> SELECT COL1,REGEXP_REPLACE(COL1,'[0-2]+','*') FROM TEST_REGEXP;

COL1       REGEXP_REPLACE(COL1,'[0-2]+','*')
---------- --------------------------------------------------
ABCDE01234 ABCDE*34
01234ABCDE *34ABCDE
abcde01234 abcde*34
01234abcde *34abcde

리스트 7 지정한 부분의 문자를 다른 문자로 치환


 

정규 표현의 다양한 활용 방법


SQL문으로 정규 표현이 가능하게 되어서 지금까지는 약간의 세공(PL/SQL나 조건식의 나열)이 필요함 작업을 간단하게 실현될 수 있게 되었습니다. 예를 들면 전자 메일이나 우편번호(해외등에서는 영문자도 포함된다) 격납열에의 검색·입력 체크도 간단합니다.그 외  데이타베이스 이행시에 문제가 되는 외자의 검출, 불필요한 공백 문자의 검출, 중복어의 출현의 식별 및 문자열의 해석·치환 등에도 위력을 발휘합니다.

 

이상과 같이, Oracle10g의 SQL 조작에 관한 추가된 기능입니다만, 알고 있으면 편리하겠져.. 

(계속 연제됩니다.)

반응형
반응형

레코드가 있으면 UPDATE하고 없으면 INSERT해라 였는데,
오라클9i에서 새로 추가된 MERGE INTO 구문을 사용하면

대략 구문은 아래와 같습니다.
pl/sql환경에서는 위와 같이 사용해도 되지만,
sql을 꼭 사용해야한다면 이 방법이 낫겠네요.

[SYNTAX]

MERGE INTO 테이블 A                        -- update 또는 insert할 테이블
USING (테이블명 | SUBQUERY | 뷰)  B  -- 비교 대상
ON(A와 B의 조인식)                             -- 대상테이블과 비교테이블의 조인식
WHEN MATCHED THEN                       -- on절에서 일치하는 로우가 있다면
    UPDATE SET = , , ....                       -- 업데이트하고,
WHEN NOT MATCHED THEN                -- 일치하는 로우가 없다면
    INSERT INTO(컬럼명)                       -- insert를
    VALUES(값, 값, ...)                           -- 이 값으로 넣어라.

f_u1:
   merge into tb_result a
        using dual             b
           on ( a.plt_no = '$in_plt_no' and
                a.srt_id = '$in_srt_id' )
   when matched then
      update set srt_qty     = srt_qty + to_number('$in_srt_qty'),
                 fin_chgr_id = '$in_user_id',
                 fin_chg_dtm = to_char(sysdate, 'yyyymmddhh24miss')
   when not matched then
      insert ( plt_no       , srt_id            , proj_no         , blk_no            ,
               sass_no      , prcd_sass_no      , ptlst_no        , pcs_gb            ,
               stype        , srt_qty           , uom_wgt         , bom_org_cmpo      ,
               io_gb        , req_gb            , ptlst_stat      , req_ser           ,
               lug_gb       , mpart_plt_no      , newprod_qty     , reprod_qty        ,
               imprv_yn     , plt_incd_yn       , fs_srt_usr_id   , fs_srt_dtm        ,
               fs_inpr_id )
      values ( '$in_plt_no' , '$in_srt_id'      , '$in_proj_no'   , '$in_blk_no'      ,
               '$in_sass_no', '$in_prcd_sass_no', '$in_ptlst_no'  , '$in_pcs_gb'      ,
               '$in_stype'  , to_number('$in_srt_qty'), to_number('$in_uom_wgt'), '$in_bom_org_cmpo',
               '$in_io_gb'  , '$in_req_gb'      , 'C'             , to_number('$in_req_ser'),
               '$in_lug_gb' , '$in_mpart_plt_no', to_number('$in_new_srt_qty'), to_number('$in_re_srt_qty'),
               'N'          , 'Y'               , '$in_user_id'   , to_char(sysdate, 'yyyymmddhh24miss'),
               '$in_user_id' )
   ;

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

f_u2:
   declare cursor csr1 is
      select a.lug_gb       as lug_gb  ,
             a.ptlst_no     as lug_type,
             '$in_bizcls'   as bizcls  ,
             sum(a.srt_qty) as srt_qty
      from   tb_result a
      where  a.plt_no = '$in_plt_no'
      group  by a.lug_gb, a.ptlst_no
      $in_semicolon

      begin
         for rec1 in csr1 loop
            update tb_result
            set    stk_qty     = stk_qty - rec1.srt_qty * decode('$in_out_gb', 'O', 1, -1),
                   fin_chgr_id = '$in_user_id',
                   fin_chg_dtm = to_char(sysdate, 'yyyymmddhh24miss')
            where  lug_gb      = rec1.lug_gb
            and    lug_type    = rec1.lug_type
            and    bizcls      = rec1.bizcls
            $in_semicolon

            if sql%notfound then
               insert into tb_stk
                         ( lug_gb    ,
                           lug_type  ,
                           bizcls    ,
                           stk_qty   ,
                           fs_inpr_id    )
                  values ( rec1.lug_gb  ,
                           rec1.lug_type,
                           rec1.bizcls  ,
                           rec1.srt_qty * decode('$in_out_gb', 'O', -1, 1),
                           '$in_user_id' )
               $in_semicolon
            end if $in_semicolon
         end loop $in_semicolon
      end $in_semicolon
   ;

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

테이터를 넣어야할 테이블에

값이 이미 있으면 Update

값이 없으면 Insert

 

MERGE INTO table_name alias                               --테이블 명만 올수 있음(셀렉트 쿼리 No)
          USING (table|view|subquery) alias                --일반적으로 쓰는 쿼리 Ok
          ON (join condition)                                        --where 절이라고 생각하면됨(조건에 서브 OK)
          WHEN MATCHED THEN                              --데이터 중복건이 있는경우 Update
                       UPDATE SET col1 = val1[, col2 = val2…]
          WHEN NOT MATCHED THEN                      -- 중복건이 없는 경우 처리 Insert
                       INSERT (컬럼리스트) VALUES (값들....);

ex)

   MERGE INTO CRCD_WF_CARD A            
   USING DUAL                           
      ON ( A.WF_NO = ? AND A.CRD_NO =? )
    WHEN MATCHED    THEN                
         UPDATE  SET                    
                 A.CRD_TYPE       =?    
               , A.FML_SSN        =?    
               , A.FMLHG_NM       =?    
               , A.FMLENG_NM      =?    
               , A.OCRD_NO        =?    
               , A.DSN_CD         =?    
               , A.DSN_NM         =?    
               , A.BRD_CD         =?    
               , A.CRD_GRD        =?    
               , A.INTGLMT_AMT    =?    
               , A.FML_STLACCT_NO =?    
               , A.CRD_ISSUE_DT   =?    
    WHEN NOT MATCHED THEN               
         INSERT (                       
                 A.WF_NO                
               , A.CRD_NO               
               , A.CRD_TYPE             
               , A.FML_SSN              
               , A.FMLHG_NM             
               , A.FMLENG_NM            
               , A.OCRD_NO              
               , A.DSN_CD               
               , A.DSN_NM               
               , A.BRD_CD               
               , A.CRD_GRD              
               , A.INTGLMT_AMT          
               , A.FML_STLACCT_NO       
               , A.CRD_ISSUE_DT         
                                        
       ) VALUES ( ?, ?, ?, ?, ?, ?, ?,  
                  ?, ?, ?, ?, ?, ?, ?  )

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

ex2)

    MERGE INTO TC_CUSTAGENT A
   USING (SELECT BUSI_CODE, CUST_CODE, CHPE_NAME, CUST_PHNB, CUST_FANU
                FROM TB_ESTMAST
                WHERE BUSI_CODE = '___parameter___'

                     AND CUST_CODE = '____parameter___') B
    ON (A.BUSI_CODE = B.BUSI_CODE
           AND A.AFON_COMP = B.CUST_CODE
           AND A.SEQU_NUMB = (SELECT MAX(SEQU_NUMB)
                                            FROM TC_CUSTAGENT
                                            WHERE BUSI_CODE = A.BUSI_CODE
                                                  AND AFON_COMP = A.AFON_COMP))
   WHEN MATCHED THEN
         UPDATE
         SET  A.CHPE_NAME = B.CHPE_NAME
                ,A.CABL_PHNB = B.CUST_PHNB
                ,A.FAXM_NUMB = B.CUST_FANU
    WHEN NOT MATCHED THEN
         INSERT (  A.AFON_COMP
                       ,A.CHPE_NAME
                       ,A.CABL_PHNB
                       ,A.FAXM_NUMB     
                     )
         VALUES (  B.CUST_CODE
                        ,B.CHPE_NAME      
                        ,B.CUST_PHNB
                        ,B.CUST_FANU    
                      );


>>>>>>>>>>>>>>>>
 
 MERGE INTO
실제 적용하면서 발견한 문제점 (ORACLE 9.2.0.3.0 에서)

 

9.2.0.4.0 버젼에선 아래와 같은 문법으로도 MERGE INTO 가 정상적으로 동작하였다.

 

MERGE INTO POPULAR_KEYWORD
USING DUAL B
ON (FIX_YN = 'Y' AND CATEGORY = 'ALL' AND RANK = '1')
WHEN MATCHED THEN
  UPDATE SET REG_DATE = SYSDATE
WHEN NOT MATCHED THEN
  INSERT (CATEGORY,KEYWORD,RANK, COUNT, REG_DATE)
      VALUES ('ALL','TEST22','1','100',SYSDATE)

 

즉, ON 절에서 값이 NULL 이더라도 WHEN NOT MATCHED THEN 절을 정상적으로 수행하였는데

 

이상하게 다른서버(9.2.0.3.0) 에선 ON절의 값이 NULL 이면 정상적인 루틴을 밟지 못하드라..

즉, INSERT 문을 수행하지 못했다.

[ 0 rows Merged ]

 

그래서 아래와 같이 USING절에서 NULL값이 리턴하지 않게 변경해주고

ON 절에서 A 와 B 를 JOIN 해주니까 정상적으로 동작한다.

 

MERGE INTO POPULAR_KEYWORD2 A
      USING (SELECT 'ALL' CATEGORY, '4' RANK, 'Y' FIX_YN FROM   DUAL) B
      ON (A.CATEGORY = B.CATEGORY AND A.RANK = B.RANK AND A.FIX_YN = B.FIX_YN)
      WHEN MATCHED THEN
        UPDATE SET REG_DATE = SYSDATE
      WHEN NOT MATCHED THEN
        INSERT (CATEGORY,KEYWORD,RANK, COUNT, REG_DATE)
            VALUES ('ALL','TEST22','4','100',SYSDATE)

[ 1 rows Merged ]

 

결론 ==> USING 다음의 SELECT 문의 결과 데이타는 반드시 존재하여야 한다 (NULL 불가).

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

9i이상에서는 데이타가 존재할 경우 갱신 없으면 등록하는 명령어로

MERGE INTO ~ USING ~ ON ~ WHEN ~ 명령어가 있습니다.


 

MERGE INTO oc_whslr_trd_rslt A
USING (
SELECT std_yymm, cust_nbr, whlsr_cust_nbr, sol_tp_cd, sol_cd,chnn_rt,

src_tp_cd,org_cd, emp_nbr,sell_amt, qty
FROM oc_temp_whslr_trd_rslt
) B
ON (

A.std_yymm = B.std_yymm AND

A.cust_nbr = B.cust_nbr AND

A.whlsr_cust_nbr = B.whlsr_cust_nbr AND

A.sol_cd = B.sol_cd AND

A.sol_tp_cd = B.sol_tp_cd AND

A.chnn_rt = B.chnn_rt
)
WHEN MATCHED THEN

UPDATE SET A.sell_amt = A.sell_amt + B.sell_amt,
A.qty = A.qty + B.qty
WHEN NOT MATCHED THEN
INSERT (
A.std_yymm,
A.cust_nbr,
A.whlsr_cust_nbr,
A.sol_cd,
A.sol_tp_cd,
A.chnn_rt,
A.src_tp_cd,
A.org_cd,
A.emp_nbr,
A.sell_amt,
A.qty,
A.drtn_amt,
A.drtn_qty,
A.last_chng_emp,
A.last_chng_dt )
VALUES (
B.std_yymm,
B.cust_nbr,
B.whlsr_cust_nbr,
B.sol_cd,
B.sol_tp_cd,
B.chnn_rt,
B.src_tp_cd,
B.org_cd,
B.emp_nbr,
B.sell_amt,
B.qty,
0,
0,
'CRMSP',
TO_CHAR(sysdate,'YYYYMMDD')
);

 

 

 

MERGE into KAC_PERSON a USING
(select user_id, OPER_FG, VARDATA, NUMDATA from KAC_PERSON
where user_id='57CCF7ADE63F3AC1' AND OPER_FG = 'MAIL_CAPACITY') b
ON (a.user_id=b.user_id and a.OPER_FG=b.OPER_FG)
WHEN MATCHED THEN UPDATE set a.NUMDATA = 15
WHEN NOT MATCHED THEN INSERT (a.user_id,a.OPER_FG,a.VARDATA,a.NUMDATA)
VALUES ('57CCF7ADE63F3AC1','MAIL_CAPACITY','mail',50)

 

CREATE TABLE KAC_PERSON
(
  USER_ID    CHAR(16) NOT NULL,
  OPER_FG    VARCHAR2(20) NOT NULL,
  VARDATA    VARCHAR2(30),
  NUMDATA    NUMBER(4),
  CONSTRAINT PK_KAC_PERSON PRIMARY KEY (USER_ID, OPER_FG)
);

>>>>>>>>>>>>>>>>>>>>>>>>>


MERGE INTO tb_target a
USING (
   select proj_no, spl_no, tag_no, msch_actv, instl_plt_no, wk_ord_dt
   from   tb_source
   where  lot_no  = 'AJ'
   and    proj_no = '1697'
   ) b
ON (   a.proj_no = b.proj_no
   and a.spl_no  = b.spl_no
   and a.tag_no  = b.tag_no)
WHEN MATCHED THEN
   update
   set    a.mk_fndt   = b.wk_ord_dt,
          a.matdlv_dt = b.wk_ord_dt,
          a.gr_dt     = b.wk_ord_dt,
          a.stk_dt    = b.wk_ord_dt,
          a.gi_dt     = b.wk_ord_dt
WHEN NOT MATCHED THEN
   insert(a.proj_no, a.spl_no, a.tag_no, a.msch_actv, a.instl_plt_no,
          a.mk_fndt, a.matdlv_dt, a.gr_dt, a.stk_dt, a.gi_dt)
   values(b.proj_no, b.spl_no, b.tag_no, b.msch_actv, b.instl_plt_no,
          b.wk_ord_dt,b.wk_ord_dt,b.wk_ord_dt,b.wk_ord_dt,b.wk_ord_dt)

반응형
반응형

mom이라는 사용자의

A, B, C 라는 테이블을 사용하기 위해

 

다른 사용자들은 mom.A, mom.B 등으로 사용하는데

 

A, B 로 바로 쓸수 있게 하는

 

synonym을 일괄 생성하는 방법

 

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

sqlplus 로 접속해서

 

 spool make_synonyms.sql

SELECT 'create public synonym ' || table_name || ' for ' || table_name || ';'
  FROM user_tables;

spool off

 

@make_synonyms

 

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

 

다른 방법은 current schema를 쓰는 방법

 

alter session set current_schema=scott;

 

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

 

USER_B에게 USER_A.sample의 select 권한 부여

GRANT SELECT ON USER_A.sample_table TO USER_B;

반응형
반응형

테이블 스페이스 생성

SQL> CREATE TABLESPACE XINET_DATA
    DATAFILE /경로/xinet_01.dbf'
    SIZE 100M
    AUTOEXTEND ON
    NEXT 30M
    SEGMENT SPACE MANAGEMENT AUTO;

SEGMENT SPACE MANAGEMENT AUTO 설정을 해야 SHRINK를 나중에 사용 가능 ~~

 

테이블 스페이스 변경

ALTER USER XINET DEFAULT TABLESPACE XINET_DATA;

사용 테이블 스페이스 조회

SELECT username, default_tablespace, temporary_tablespace FROM DBA_USERS;

반응형
반응형

USERENV : USERENV 함수는 현재 세션의 환경 정보를 반환합니다.
  - ENTRYID : 사용 가능한 Auditing entry Identifier를 반환합니다.
  - LABEL : 현재 세션의 Label을 반환합니다.
  - LANGUAGE : 현재 세션에서 사용중인 언어와 테리토리 값을 반환합니다.
  - SESSIONID : Auditing(감사) Session ID를 반환 합니다.
  - TERMINAL : 현재 세션 터미널의 OS ID를 반환 합니다.
반응형
반응형

### oracle run package (파일명 test.sh)
오라클 계정에 profile 파일의 기본 환경 path 변수들 복사

 

### oracle

sqlplus -SILENT 아이디/패스워드 <<-EOF
 WHENEVER SQLERROR EXIT 1
  WHENEVER OSERROR EXIT 1
   SET ECHO ON
   EXECUTE 호출패키지명();

   EXIT 0
   EOF

   EXITCODE=$?
   export EXITCODE

   if [ "$EXITCODE" -ne 0 ]
   then
     echo "ERROR: SQL*Plus exit code: $EXITCODE"
     echo ""
     echo "**** PROCEDURE RUN ABORTED at `date` !!! ****"
   fi
### end

 

클론 등록 방법 (클론은 root로 등록)

매일 아침 6시에 실행한다면

 

0 6 * * * su - oracle -c /home/test.sh

반응형
반응형

DESC school 와 같은 행태로 테이블을 조회 했을 때, 주석문이 등록되지 않아 출력이 되지 않는 경우가 있다.

알아보기 쉬운 테이블 생성을 위해서는 반드시 주석문을 추가하는것이 좋다.

 

테이블에 주석문 추가하기

COMMENT ON TABLE school IS '학교정보 테이블' ;


컬럼에 주석문 추가하기

COMMENT ON TABLE school COLUMN school.name IS '학교이름';


주석문 삭제하기

COMMENT ON TABLE school IS ' '


주석문을 볼수있는 data dictionary

dictionary 상에 정보 조회를 통해 현재 comment(주석)이 등록 되어 있는지 확인 가능하다.

 * Column

ALL_COL_COMMENTS
USER_COL_COMMENTS

* Table

ALL_TAB_COMMENTS
USER_TAB_COMMENTS




반응형

+ Recent posts