본문 바로가기

Server Oriented/DB-Oracle

(38)
프로시저에서 테이블/인덱스 생성 등 ddl 문을 실행하려면.. 프로시저에서 ddl 문을 실행하는 방법은 2가지라 하는데, 여기서는 커서 사용하는 방법이 아닌 'execute immediate DDL문장' 사용.. 그런데, 프로시저에서 테이블을 생성하려면.. 관련 권한도 필요해서, sys 나 system 계정에서 해당 권한을 부여해 주어야 한다. grant create any table to 사용자계정; execute immediate 'create table ...' execute immediate 'create index ...' 프로시저 변수에 ddl 문을 담았다가 execute '변수' 로 실행할 수도 있다. '문장1' || ' where column1 = ''C'' ' || -- 인용부호 2개를 이어서 사용하면, '||'C'||' 처럼 복잡하게 하지 않아도 ..
orai18n.jar 다운로드 및 적용 https://www.oracle.com/database/technologies/appdev/jdbc-downloads.html jdk8 용 인 ojdbc8-full.tar.gz 를 다운받아 .gz 압축을 풀면, orai18n.jar 파일이 나온다.. 이클립스 해당 프로젝트 명을 마우스 오른쪽 버튼으로 클릭하고, properties 단축메뉴 클릭, Java Build Path 의 Libraries 탭에서 Add External JARs... 버튼 클릭. orai18n.jar 파일을 찾아서 선택하고, Apply and Close 한 다음, 웹서버 재시작. build.gradle 수정 및 적용시 등등의 이유로 간혹, java build path 에서 orai18n.jar 세팅한 내용이 사라지므로, 다시 Ad..
프로시저 ... 를 사용할 수 없습니다.. 프로시저 사용이 불가할 때의 메시지는, 대체로 '프로시저를 찾을 수 없습니다' 나 프로시저 ooo 에서 오류가 발생하였습니다. 그럼, '사용할 수 없습니다' 는 뭔 소리지..? 배경 설명을 해 보면, DB 사용자 A 가 만든 '프로시저A' 를, DB 사용자 B 가 '시너님A' 로 등록하여 실행해 왔던 것인데.. ('프로시저A' 는 DB 사용자 A 가 만든 '테이블A' 를 select/update/insert) DB 사용자 C 가 해당 프로시저를 컴파일 하는 시점에서 DB 사용자 B 가 만든 '시너님A' 로는 DB 사용자 C 가 컴파일한 '프로시저A' 와의 owner 관계가 끊어졌던 것. 다만, synonym 관계는 끊어지지 않음. 연결 관계가 끊어졌으면 오류 메시지가 '찾을 수 없습니다' 였을듯. '프로..
Toad 토드, Function/Job/Procedure/Trigger 추출 오라클 DB 에서 각종 Function/Job/Procedure/Trigger 등을 추출하여 백업해 두면, 두고두고 요긴합니다. 주기적으로 백업해 두시길.. Database, Export, Export DDL 메뉴 차례로 선택. Export DDL 화면에서, Output 은 Single file, File 체크 하고, Add 버튼 클릭. (하나의 파일에서 찾는 것이 편리합니다. 물론, 여려 파일로 만들고 여러파일에서 찾기를 해도 되겠지만..) Add 버튼을 누르면 Object Search 팝업창이 열립니다. - Search term, 필요시 세팅 - Object status, 살아 있는 것도 하려면 Valid(기본 설정), 모두 하려면 Both - Schemas to search, 체크하려는 스키마 모두..
경품 추첨 DB 로직 경품 갯수가 n 개일 때, 경품 전체 데이타를 미리 만들어 놓고, update 하는 방식으로 세팅할 수도 있지만.. 여기에서는, 경품을 관리하는 경품테이블을 두고.. 추첨이 일어날 때마다 이벤트테이블에 insert 하는 방식. insert 하는 방식 보다는 update 할 때 동시성 문제가 발생할 수 있으므로, 데이타도 적게 적재되는 insert 방식으로 구현하는게 좋음. insert into 이벤트테이블( 이벤트시퀀스 ,이벤트카테고리 ,사용자아이디 ,경품코드 ) select 이벤트시퀀스.nextval ,a.* from (select 이벤트카테고리 ,사용자아이디 ,(case when today = 1 -- 좋은 경품은 1인 1건만 당첨, 한 번만 당첨 or c.cnt_mid >= 2 -- 중간 경품은 1..
to_char(숫자,'fm90.0') 오라클 형식 to_char(숫자,Formatter) 함수에서,9 는 숫자를 표시하되 값이 없으면 null 처리,0 은 숫자를 표시하되 값이 없으면 0 처리,fm 은 trim() 을 to_char() 밖에 한 번 더 씌워주는 효과. to_char(5.2, '9.9') 는 '5.2' 를 출력. to_char(5.2, '0.0') 을 해도 '5.2' 라고 출력. 그러면, to_char(5.2, '9') 라고 하면 어떻게 찍힐까..? '5' 만 찍힘. to_char(5.2, '0') 도 '5'.to_char(5.5, '9') 라고 하면..? 5.5 의 반올림으로 표시하려 하므로, '6' 이라고 찍힘. to_char(5.5,'0') 도 '5'.Formmater 에서 설정된 소숫점 이하 마지막 자리에서 그 위로 반올림 하는 것..
하나의 트랜잭션 안에서 sysdate 가 다른 값이 세팅될 수 있다..? .java 에서 하나의 트랜잭션으로 최초와 마지막 insert 문에 sysdate 를 넣는 문장이 있고,첫 insert 문장이 실행되고 마지막 insert 문장이 실행될 때 1초의 시차가 있었다면..첫번째 insert 문장의 sysdate 항목과 마지막 insert 문장의 sysdate 항목은 1초의 차이가 난다. 그리고, 첫번째 insert 문장의 sysdate 가 마지막 insert 문장의 sysdate 항목 보다 빠르다고는 할 수 없다.이것은 DBMS 가 어떻게 처리했느냐에 따라 다르다.특히, DBMS 의 CPU 가 여럿이라면.. 병렬 처리의 폐해(?)가 적용될 수 있으므로 유의. 이를 동일 시각으로 맞춰주려면,트랜잭션 초입에 sysdate 를 select 해서 그 값을 가지고 있다가,매 문장에서 ..
스크레치 복권 발급과 관련된 단상 1. 복권 경품 DB 를 만들어서.. - 각 경품에 대하여 확보된 총 수량 - 관리자가 세팅하기에 따라 현재 오픈될 수 있는 수량 - 경품 코드와 경품 명칭 (경품 코드는 일련번호로 따는 것이 덜 번거로움) - 꽝도 하나의 경품으로 세팅 - 경품도 그룹이 있을 터인데, 이를테면 물품과 포인트 등등으로 구분 2. 경품은 난수로 일차 세팅 (seed 에 해당) - round(dbms_random.value(경품코드1, 경품코드2)) 상기 1에서 그룹을 잡은 경품 코드별로, 로그인 했을 때 발급되는 복권에 대한 경품 코드를 난수로 체크, 특정 이벤트(이를테면 회원가입, 물건 구입 등등)에 해당하여 발급되는 복권에 대한 경품 세팅 3. 사용자가 방문시 seed 를 체크하고 기타 사항을 확인하여 복권을 발급 - ..