오라클 12.1과 12.2 자체의 JSON 활용에 관한예제 및 스크립트를 준비해놓고 너무 많은 시간이 지나버렸습니다.  개인적인 욕심에 이것저것 새로운 것들을 해보고 혼자 기뻐하고 끝나는게 아쉬워서 블로그를 시작했지만, 게으름으로 인해서 두번째 페이지의 보강이 늦어져서 검색후 오시는분들에게 실무적인 내용이 없는데에 미안하게 생각하고 있습니다. 

현재는 AWS, 오라클 클라우드 아키텍처 구성과 데이터분석관련 헤딩을 하고 있어서 마음의 여유가 생기는데로 정리하도록 하겠습니다.

Oracle 9i 에서 처음 제공된 XML DB의 기능을 개인적으로 많이 사용하지는 않았지만 버전이 올라가면서 기능적으로 추가가 되었습니다.


 XMLType이  데이터 타입으로 지원되어 데이터베이스의 XML 문서를 SQL에서 액세스 할 수 있으며 XML 개발자는 문서에서 XML 표준을 사용할 수 있습니다. 이는 XML 문서에 대해 쿼리를 수행 할 수 있도록 했습니다. Varchar 또는 CLOB 구현 대신 XML Type을 사용하여 Table, Column 또는 View를 만들 수 있습니다. 매개 변수 및 변수에 대한 데이터 유형으로 사용할 수도 있었습니다.

하지만 12C 이전 버전에서는 JSON TYPE에 대한 기능등을 제공하지 않아서 APEX_JSON 과 PL/JSON 이라는 오픈소스의 라이브러리를 사용하여서 필요한 기능들을 사용해야 했습니다.


 오라클 Database 12c 는 트랜잭션, 인덱싱, 선언적 쿼리 및 View 를 포함한 관계형 데이터베이스 기능을 기본으로 JSON (JavaScript Object Notation) 데이터를 지원한다고 합니다.

XML 과 JSON 의 특징비교는 넘어가도록 하고 데이터 베이스에서의 비교를 하겠습니다.


오라클 데이터 베이스 안에서 XML 과 JSON 의 차이는 XML 은 XMLTpye 를 사용 하여 저장 가능 하지만 JSON 데이터는 Varchar2,BLOB,CLOB 를 이용하여 저장 됩니다. 권고사항은 Check 제약조건을 항상 사용 하여 Column 값이 유효한 JSON 인지 확인 하는 것이 좋다고 합니다.

LAX(느슨한) Strict(엄격한) Column 으로 관리 할지에 따라서 옵션을 부여 하면 됩니다. (Default: LAX)


-- EX) Table 생성시 CLOB JSON column script

{column_name} CLOB CONSTRAINT {constraint_name} CHECK ({column_name}IS JSON)

{column_name} CLOB CONSTRAINT {constraint_name} CHECK ({column_name} IS JSON STRICT)


18C 버전기준으로 XML 과 공간데이터(Spatial Types), ANYTYPE 등 생소한 데이터 타입들이 많이 있지만 JSON  type 은 예정에 없나 봅니다.


다음 문서는 CLOB TYPE 의 JSON 칼럼을 기준으로 작성된 스크립트의 예제 수정해서 사용합니다.

출처 : Oracle Database Online Documentation 12c Release 1 (12.1) 


* Object Creation Scripts

 A. ELEMENT Query

-- Example A-1 직접 조건 절에 따른 데이터 조회

-- Example A-2  Column 추출후 데이터 비교 조회

-- Example A-3 JSON Arry를 JSON DATA로 조회 

-- Example A-4 JSON 배열 요소 표시 

-- Example A-5 JSON Array 더하기 다른 데이터 조회

-- Example A-6 JSON_TABLE: NESTED 사용 배열 elements

-- Example A-7 JSON 점(.) 표기 AND JSON_VALUE 쿼리 비교 1  

-- Example A-8 JSON 표기 AND JSON_VALUE 쿼리 비교 2


 B.INDEX : Bitmap 은 Enterprise Version 만 사용가능하며 B-tree 기본  

-- Example B-1 Creating a Bitmap Index for JSON_EXISTS  

-- Example B-2 Creating a Bitmap Index for JSON_VALUE                                  

-- Example B-3 Creating a Function-Based Index for a JSON Object Field: JSON_VALUE

-- Example B-4 Function-Based Index(FBI) : 펑션 기반 인덱스 사용

-- Example B-5 JSON_VALUE 명시 적  RETURNING NUMBER

-- Example B-6 Numerical Conversion 숫자형 변환 조회

-- Example B-7 묵시적 형변환  Numerical Conversion


 C. Indexing Multiple JSON Fields Using a Composite B-Tree Index

-- Example C-1 Creating Virtual Columns for JSON Object Fields

-- Example C-2 Creating a Composite B-tree Index for JSON Object Fields

-- Example C-3 Two Ways to Query JSON Data Indexed with a Composite Index


 D. Full-Text Search of JSON Data

 E. Loading External JSON Data

 F. Replication of JSON Data




 




1. Install Steps on the Server Computer

 A. Install Oracle Database Enterprise Edition

 B. Install R

 C-1. Install Oracle R Distribution (Recommended)

 C-2. Install open source R

 D. Install Oracle R Enterprise Server

 E. Install Oracle R Enterprise Supporting Packages

 F. Create a Database User for Oracle R Enterprise


Step D.E.F : Server Scripts


2. Install Steps on the Client Computer

 A. Install Oracle Database Client

 B. Install R

 C-1. Install Oracle R Distribution (Recommended)

 C-2. Install open source R

 D. Install Oracle R Enterprise Supporting Packages

 E. Install Oracle R Enterprise Packages



R12 기준으로 확인 했을때 보통 툴이나  Dba_Constraints 를 찾아 보게 될건데 오라클 ERP 는 

어떻게 된놈인지 테이블이 2만개가 넘는데 제약 조건이 없다!!  

 

어떻게 된 일일까? 

 

 

 

 

 

그러면 표준테이블 어디서 어떻게 Key 를 찾아서 Extension 개발을 하지?

SQL 조인을 해서 데이터를 뽑던, VIEW 를 만들던 조인이 되야 할꺼 아닌가.

Database 를 공부하다가 보면 제약 조건에 대한 내용은 배우는 거라서 테이블에 웬만하면 다하는줄 알았는데.;;

어느 DB 커뮤니티에 PK FK 가 설정안된 곳이 많이 있냐고 올라온 글을 보고서 뻘 답글을 남긴적이 있다

그러면 어디서 어떻게 찾아야 할까....

 

현 MOS(My Oracle Support) 구 metalink (구 양배추 현 조세호 도 아니고;;) 에 방대한 문서들도 있고.

Technical Reference Manual 이 잘 되어 있다.  

 

E-TRM 에서 해당 버전별 OBJECT 를 조회 하면 각 칼럼들의 설명과 더불어 대빵큰(?) 모듈별 ERD 에서

논리적 연결고리를 확인할 수 있다.

http://etrm.oracle.com/pls/etrm/etrm_search.search

 

▶ ERD는 어느정도 익숙한 모듈이다 싶으면 800%확대해도 간신히 글자가 보이고, 1600% 확대 해야 알아 먹을수 있는 PDF;;

 

이외에 Database 직접 접근이 가능할 경우  해당 테이블의 Index 중에 Unique Index 를 찾아 테이블의 Key 를 찾아서 

조인해서 사용을 할것이다. 대부분이 그렇지 않을까; (처음 배울때 누가 알려주는 사람이 없어서 이렇게 맨땅에 헤딩경험한 1인)

 

한가지 더 소개 하자면, application developer 권한의 Database 라는 메뉴를 사용해서 확인이 가능하다.

 

 

 

 

 

 

TABLE Function 을 참고로 해서 보면 툴에서 많이 보던 내용이 나타난다.

각 아이템별 설명은 대부분 아실거라 생각 하고 패쓰 하고.생소한 아이템들에 대해서는 별도로 개인정리하기로 혼자 정함;;

 

 

Oracle ERP Primary Key 조회

SELECT ft.table_id,        ft.table_name,        ft.table_type,        fpk.primary_key_id,        fpk.primary_key_name,        fpk.description,        fpk.enabled_flag,        fpkc.column_id,        fc.column_sequence,        fc.column_name,        fc.column_type   FROM fnd_tables              ft,        fnd_columns             fc,        fnd_primary_keys        fpk,        fnd_primary_key_columns fpkc  WHERE 1 = 1    AND ft.application_id = fc.application_id    AND ft.table_id = fc.table_id             AND ft.application_id = fpk.application_id    AND ft.table_id = fpk.table_id          AND fpk.application_id = fpkc.application_id    AND fpk.table_id = fpkc.table_id          AND fpkc.column_id = fc.column_id          AND ft.table_name LIKE '<TABLE_NAME>';

 

 테이블/칼럼

fnd_tables

fnd_columns

 

▶ Primary Key/Column

 fnd_primary_keys

 fnd_primary_key_columns

 

 Foreign Key/Column

 fnd_foreign_keys

 fnd_foreign_key_columns

 

▶ Index/Column

 fnd_indexes;

 fnd_index_columns

 

DB OBJECT 아이디와 별개로 각각의 고유한 Table ID 를 가지고 있다.

 

결국은 제약 조건을 테이블에 직접 걸지 않고, 별도의 테이블로 관리를 하고 있었다는거다. 

 

Surrogate Key 사용은 쿼리가 복잡해진다는 단점이 있지만, 데이터 변경에 대한 영향을 적게 받을수 있기 때문에 운영상의 이점이 있다는 점이 

작용을 한것으로 보인다.

 

 

아래의 Wiki 문서 내용을 참조 

 

  • Applications cannot lose their reference to a row in the database (since the identifier never changes).
  • The primary or natural key data can always be modified, even with databases that do not support cascading updates across related foreign keys.

 

 

https://en.wikipedia.org/wiki/Surrogate_key#Advantages

 

추가. Table Column 제약조건 찾기 (2014.11.03)

 

SELECT dcc.owner,        dcc.table_name,        dcc.constraint_name,        dcc.column_name,        decode(dc.constraint_type, 'P', 'PRIMARY KEY', 'U', 'UNIQUE KEY', 'C', 'CHECK OR NOT NULL', 'R', 'FOREIGN KEY') constraint_type   FROM dba_cons_columns dcc,        dba_constraints  dc  WHERE 1 = 1    AND dcc.table_name = dc.table_name    AND dcc.constraint_name = dc.constraint_name    AND dcc.owner = nvl(upper('&USERNAME'), dcc.owner)    AND dcc.table_name = nvl(upper('&TABLENAME'), dcc.table_name)  ORDER BY 1,           2,           3,           4;

 

 

 

'Developer > Tip' 카테고리의 다른 글

몇가지 고려사항 [Oracle ERP Developer guide]  (0) 2009.06.29
ITEM 조건에 따른 LOV 변경  (0) 2009.06.23
VIEW 를 이용한 DML 작업  (0) 2009.06.19

2014. 4. 9HOWTO


In this Document

Goal
Solution
 Release 11i
 Release 12.0
 Release 12.1
 Release 12.2
 Documentation Notices
References


이문서는 ORACLE ERP (E-business Suite) 에서 OAF 를 사용하기위한 JDeveloper 의 버전을 찾는 내용을 담고 있는 문서 입니다.


해당문서의 제일하단의 번역 부분을 선택하면 지원 가능한 언어별 문서를 확인 할 수 있습니다.


한국어 문서 : 

OA Framework – E-Business Suite 11i 또는 Release 12.x 에서 사용할 JDeveloper의 올바른 버전을 찾는 방법 (문서 ID 1535922.1)




2014. 4. 1DIAGNOSTIC TOOLS



RDA Getting Started

RDA Documentation Links
Getting Started
You are here

In This Document



Overview

Remote Diagnostic Agent (RDA) is a command-line diagnostic tool that is executed by an engine written in the Perl programming language. RDA provides a unified package of support diagnostics tools and preventive solutions. The data captured provides Oracle Support with a comprehensive picture of the customer's environment which aids in problem diagnosis.


Oracle Support encourages the use of RDA because it greatly reduces service request resolution time by minimizing the number of requests from Oracle Support for more information. RDA is designed to be as unobtrusive as possible; it does not modify systems in any way. It collects useful data for Oracle Support only and a security filter is provided if required.


This guide provides users with an overview of RDA, the download instructions, and general steps about how to execute RDA within a UNIX, Windows, and Mac OS X environment.


▶ 이 가이드는 RDA의 개요, 다운로드 지침 및 UNIX, Windows 및 맥 OS X 환경에서 RDA를 실행하는 방법에 대한 일반적인 단계를 사용자에게 제공합니다.



RDA 를 사용함으로써 문제에 대해서 해결시간을 크게 줄일수 있으며, 시스템에 대한 변경을 가하지 않다고 명시 되어 있네요.

그러나 개인적으로 가장큰 이점으로 생각하는 부분은 오라클 제품들에 대한 사전 설치 작업에 대해서 체크를 할수 있다는 것입니다.



▶ 상세 내역은 하기 문서를 통해서 확인 할 수 있습니다.


◈  RDA - Health Check / Validation Engine Guide (문서 ID 250262.1)


ORACLE E-BUSINESS SUITE, ORACLE DATABASE등등 제품들에 대한 OS 별 사전 설치 환경 검토를 할수 있습니다.

- 해당 Product 의 OS 인증정보,ORACLE_HOME 체크, 자바, HW 정보, OS 각종 설정 대한 내용등을  Rule Group 라는 항목으로  코드화하여 나타내고 있습니다.




▶ 추가적으로 오라클 Database 설치시 필요한 사전 패키지들에 대해서 버젼별로 하나하나 설치 하던 방식에서 벗어나 한번에 설치 가능하도록 하고 있습니다.      오라클 공식 사이트 참조링크.



♣ 리눅스에서 Database 설치를 위한 사전 패치셋 설치 예


Linux OS Installation with Reduced Set of Packages for Running Oracle Database Server (문서 ID 728346.1)


Installation

For OL4/RHEL4 and OL5/RHEl5, either one of below will install all packages required for running Oracle software and resolve all dependencies:

  • yum:
    # yum install oracle-validated
  • up2date: up2date needs a repository, so the oracle-validated package needs to be added to an existing repository or a new repository needs to be created then added to the up2date configuration:
    # up2date --nox --update oracle-validated

Check Document 1152174.1 in case you encounter errors of missing kernel-header rpm package.

For Oracle database 11gR2 running on  OL6/RHEL6, use command below to install all packages required for running Oracle software and resolve all dependencies .

# yum install oracle-rdbms-server-11gR2-preinstall

For Oracle database 12cR1 running on  OL6/RHEL6,use command below to install all packages required for running Oracle software and resolve all dependencies.

yum install   oracle-rdbms-server-12cR1-preinstall





Download link

http://www.oracle.com/technetwork/developer-tools/jdev/downloads/index.html?ssSourceSiteId=ocomen


Installation Doc.

http://docs.oracle.com/middleware/1212/cross/installtasks.htm


Jdeveloper Doc.

http://docs.oracle.com/middleware/1212/jdev/docs.htm

수정 날짜:2012. 10. 25유형:HOWTO상태:PUBLISHED우선순위:3


▶ 이문서는  Oracle Application 에서 Form,Library,Menu 의 컴파일에 대해서 

설명 하고 있습니다.



폴더 프롬프트 사용중 데이터의 길이에 비해 폴더 프롬프트가 많이 긴경우 발생;;;;


->폴더툴 Prompt 사용시 2줄이상 prompt 사용 방법을 찾지 못하여

Database block 의 Prompt 의 위치를 폴더 prompt 와 병행해서 위쪽에 추가 적용


- Prompt Alignment Top

- Prompt Attachment Offset : .29 적용


 예제그림.1


 

-> 노란선이 Stack Canvas 의 ViewPort 범위

 

Tabular 형식의 레코드를  나타내면서 Stack Canvas 의  View port 높이가  자동 적용된 

제일 마지막 레코드에걸쳐 있어서 문제 발생 


그림.2



(확인작업:  Block 레코드 갯수 줄인후에도 View Port 가 동일한 현상 발생 

Number of Records Displayed : 최초 15->13개 ->10개)


위 현상의 문제점

-> 레코드간 이동시 마지막 레코드 이동후 위쪽 레코드 이동시 Canvas Layout 이 변형되는 현상 발생




삽질후 확인내역


출처 : APP_FOLDER_RESIZE_VIEW(Procedure) 에서 확인


Viewport 리사이즈시 높이 지정 부분

  new_height := app_folder.std_prompt_height + 

                (app_folder.base_records_displayed * app_folder.std_item_height) + 

                app_folder.std_scrollbar_height;



app_folder.std_prompt_height : 아이템의 프롬프트의 높이

app_folder.base_records_displayed : Block 에 적용된 Number of Records Displayed 갯수 (Tabluar 형식)

app_folder.std_item_height : 아이템의 높이

app_folder.std_scrollbar_height : 스크롤바의 높이(Horizontal 높이인듯)


Viewport 리사이즈 = 기본 프롬프트의 높이 + (레코드 갯수*아이템높이) + 스크롤바 높이


결론은 prompt 의 Attachement Offset 을 고려 하지 않고 있어서 

결국 폴더 프롬프트를 길게 사용;;;;






25-Apr-2008WHITE PAPERPUBLISHED3

 

DOC

Using OAF and ADF White Paper.


TableSpace & Datafile관리


-- TableSpace 조회

SELECT * FROM  dba_tablespaces;



-- 테이블 스페이스의 Datafile 조회

SELECT * FROM dba_data_files;



-- 테이블 스페이스 데이터 파일리사이즈

ALTER DATABASE DATAFILE  '/oradata/system01.dbf' RESIZE 10000M;



Temp TableSpace& Datafile 관리


-- Temp TableSpace 조회

SELECT * FROM dba_temp_files;


-- Temp TableSpace 리사이즈

ALTER DATABASE TEMPFILE  '/oradata/temp01.dbf' RESIZE 10000M; 



NULL 관련 함수

-- NULLIF (exp1,expr2)

NULLIF  expr1  expr2 를 비교합니다. 같은 경우는 NULL을 리턴합니다. 다르면 expr1 을 리턴합니다. expr1 은 리터럴 NULL 을 지정할 수 없습니다.

동일문장

CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END

 

-- COALESCE(expr1,expr2,expr3,)

COALESCE 는 식의 목록의 첫 번째 NULL이 아닌 expr 을 반환합니다. 2 개 이상의 식을 지정할 필요가 있습니다. 모든 expr 이 NULL로 계산되는 경우,이 함수는 NULL을 리턴합니다.

동일문장

CASE WHEN expr1 IS NOT NULL THEN expr1 ELSE expr2 END

통계관련 함수

-- CORR (exp1,expr2)

CORR 숫자 쌍의 집합에 대한 상관 계수를 반환합니다. 이것은 집계 함수 또는 분석 함수로 사용할 수 있습니다.

이 함수는 인수로서 임의의 수치 데이터형 또는 암묵적으로 수치 데이터 형으로 변환 가능한 숫자가 아닌 데이터 형식을 취합니다. Oracle 숫자의 우선 순위가 가장 높은 인수를 판단하여 나머지 인수를 데이터 형식으로 암시적으로 변환하여 데이터 형식을 반환합니다.

동일문장

COVAR_POP (expr1, expr2) / (STDDEV_POP (expr1) * STDDEV_POP (expr2))

참고 :

CORR 함수는 피어슨 상관 계수를 계산합니다. 이 계산하려면 수식을 인수로 지정해야합니다. Oracle은 비모수 또는 순위 상관을 지원하는 CORR_S (스피 어맨 로우 계수) 및
CORR_K (켄달의 타우 b 계수) 기능도 제공합니다.

 

 

1. 몽고디비에서 0~1사이의 Random 데이터 생성 (50만건)

for(i=0; i<500000; i++) {
db.test.insert({"seq" : i,"random": Math.random(), "date": new Date() }); 
}

2. R 에서 rmongodb 패키지 사용해서 plot 찍기 (10건 : limit=10L)

library(rmongodb) 
mongo <-mongo.create(host="-- HOST IP --", name="",username="", password="", db="test")
if (mongo.is.connected(mongo)) {
    buf <- mongo.bson.buffer.create() 
    query <- mongo.bson.from.buffer(buf)
    cursor <- mongo.find(mongo, "test.test", query, limit=10L)
    # Step though the matching records and display them
    while (mongo.cursor.next(cursor)) { 
     a<- mongo.bson.to.list(mongo.cursor.value(cursor))
    print(a$seq)
    print(a$random)
    plot(a$seq,a$random,xlim=c(0,10),ylim=c(0,1))
    axis(1,at=seq(0,10,1))
    axis(2,at=seq(0,1,0.1))
    par(new=T)
    }
}

결과 확인