|
적어도 오라클에서는 같다. 이걸 모르고 있다 된통 당할 뻔했다.
ANSI SQL규격을 보면 null과 빈 문자열은 서로 다른 존재다. 오라클은 이 점에서 ANSI호환이 아니다. 그래서 오라클 DB에 입력으로 빈 문자열을 넣으면 자동으로 null로 변환해서 저장을 하게 된다. 그리고 이 점을 잘 모르면 여러가지 문제에 봉착하게 된다. WHERE조건절에 col1 = '' 이 안 먹힌다. 오직 col is null로 해야한다. 그럼 length(col1)은 어떻게 나올까? 이 결과도 null이다. not null 제약이 걸린 열에 빈 문자열을 넣지 못한다.
특정 조건에 걸리는 row를 수정해야한다. 문제는 그 조건이 해당 테이블의 필드에 있는 게 아닌 참조를 하고 있는 다른 테이블의 필드값을 검사해야한다는 점이다. 그것도 참조 테이블이 하나도 아니고 두 군데 이상에서 말이다.
또 다른 경우는 다른 데이블의 매칭이 되는 row가 있어서 그 값을 자신의 테이블에 대입시켜야한다. 아래 예제가 그것이다. 상품의 세부 원소 정보는 그 원소의 기본 템플릿을 참조한다. 이제까지는 템플릿의 이름만을 참조했는데, 이름은 중복도 될 수 있고 변경도 가능하도록 요건이 바뀌었다. 그래서 이름 대신 템플릿의 고유 ID를 참조키로 넣어야 하는 상황이 생겼다. 그래서 원소 테이블에 ref_id라는 필드를 추가하고 그 원소에 해당하는 템플릿 풀의 고유 아이디를 집어넣어야한다. 이것까지만은 그래도 되었는데, 더 고약한 점이 상품과 원소풀은 섹션으로 나뉘어 있고 DB테이블은 하나로 쓴다는 것이다. 원소 매핑 테이블에도 섹션 정보가 있었다면 편했겠지만 거기에는 없다. 말로 쓰자면, 속성을 소유하는 상품과 동일한 섹션에 속하면서 이름은 속성과 같은 속성풀의 아이디를 참조아이디 필드에 넣는 것이다. 이것을 아래처럼 하니 넣을 수 있었다. UPDATE pd_mapping aa SET ref_id = (select ag.attr_id from pf_attr_pool ag where ag.attr_name = aa.attr_name AND ag.section = (SELECT section FROM products pd WHERE pd.prdt_id = aa.prdt_id) ) WHERE ref_id is null; 혹시 더 빠르고 좋은 방법은 없을까?
현재 내 스키마에 있는 테이블의 목록을 보고싶을 때가 있다. 좋은 툴을 쓰면 잘 보여주지만 SQL로도 어찌 안 될까. SELECT * FROM tab; 이라는게 있다. 그런데 테이블이 아닌 인덱스나 시퀀스 같은 것은 어떻게 찾을 수 있을까? 그래서 찾아보니 있더라. USER_OBJECTS 라는 테이블을 보는 것이었다.
select object_name from user_objects where object_type = 'TABLE'; select object_name from user_objects where object_type = 'SEQUENCE'; 타입에는 정확히 대문자로만 적어야 나온다. 원래 이것을 찾아본 이유는, 자동생성된 수십개의 시퀀스의 이름을 일괄적으로 바꾸어야할 일이 생겼기 때문이다. prefix정책이 바뀌는 바람에 이미 만들어진 시퀀스의 prefix들을 바꾸는 것이었는데 그것을 위해 문제의 시퀀스들을 찾고 그것의 이름을 바꾸는 쿼리를 생성해야한다. 시쿼스 이름 바꾸는 것은 RENAME seqname TO newname 으로 비교적 간단했다. select 'RENAME '||object_name||' TO NEWPREFIX_'||substr(object_name,11)||';' AS queries from user_objects where object_type = 'SEQUENCE' AND OBJECT_NAME like 'OLDPREFIX_%';
동아리 사람들과 지난 토요일에 쿠얼라이 정자점에 다녀왔다. 아마도 공식 명칭이 이거일텐데 '커피프린스 2호점'이 떠올라 여기도 쿠얼라이 2호점 식으로 지었어도 나름 괜찮지 않았을까 싶기도 하더라. (하지만 난 정작 그 드라마는 거의 안 봐서 왜 2호점인지도 모른다)
역시나 시작부터 삽질이다. 7시에 역에서 모이기로 하고 7시에 식당을 예약하는 짓을 했는데, 동아리 사람들의 평균 지각시간과 역에서 식당까지의 이동시간을 고려하지 않았던 것이다. 지난 번 모임때는 약속시간 10분 전에 상당수가 모였던 것에 너무 고무되었나... 사람들에게 연락을 해서 예상 시간을 잡고 예약 시간을 7시 30분으로 늦추었다. 정자역 4번 출구로 나와서 10시방향-대각선 왼쪽-을 보면 천장 부근에 빨간색 'I'자가 그려진 아이파크 건물이 다른 빌딩 너머로 보인다. 쿠얼라이 분당점은 거기에 있다. 대충 눈으로 보니 사장님이 말한 5분은 빠른 남자 걸음으로 5분이고 느긋하게 걸으면 시간이 더 걸려 보이더라. 사람들이 다 모인 뒤 시간을 보니 7시 26분... 약간 늦겠는걸 이라는 생각을 하고 출발을 했다. 두 번째 삽질... 아이파크에 도착을 했는데 쿠얼라이가 잘 안 보인다 건물 주변을 약간 배회하니 정자역에서 보이는 두 채의 아이파크는 104동과 302동이었다. 정자역에서 봤을 때는 타워팰리스처럼 약간 원통형의 느낌이 나는 주상복합 빌딩 두 개가 보여 그게 전부 다인 줄 알았는데, 이게 아이파크 끄트머리고 수내역 방향으로 주~욱 아이파크였던 것이다. 대체 쿠얼라이가 있는 101동은 어디인 것인가. 주차경비실에 아저씨에게 물어보니 이 아저씨도 페이크를 썼다. 100미터쯤 더 가면 102동이 나오고 거기서 들어가면 101동이랬다. 실제로 102동은 더 멀었고 101동은 거기서 안으로 들어가는 게 아니라 계속 직진하면 나오는 것이었다. 결국 사장님에게 다시 전화해서 겨우 도착한 시간이 7시 45분쯤.. 위치를 보니 서울에서 5500-1번 같은 버스를 타고 오는 것이면 정자역이 아닌 전 정류장에서 내려서 오는게 더 빠르겠다. 그 정류장에서 내려도 약간 더 뒤로 가야한다. 아직 오픈한지도 별로 안 되고 홍보도 그다지 많이 안 되서 비교적 한산할 걸로 생각했는데, 막상 가니까 우리 예약 테이블을 빼고는 2인용 테이블 하나만 비어있더라. 왠지 늦은게 미안스러워졌다. 뭐, 피크에는 대기 손님이 줄을 서야하는 삼청동보다는 한가한 편이긴 하더라. 사진은 동행한 M군의 캐논 IXUS인가 하는 똑딱이의 도움을 받았다. M군의 말로는 캐논 익서스는 떨림보정 기능이 없는 것인지 거의 효과가 없다고 했는지... 그 이유로 사진도 작은 가방을 간이 삼각대로 활용해 찍느라 사진 각도가 다른 블로거처럼 안 나온다. ![]() 빨간색 쿠얼라이 글자가 보인다. 명함과 같은 디자인을 가졌던 삼청동점과는 다른 분위기로 만들었나보다. ![]() 찻잔을 찍은 건가? ![]() 가격표도 찍어왔네... 삼청동에도 가본지가 오래되고 내가 직접 지불한 적이 없어서인지 제대로 가격표도 안 봤었기 때문에 가격이 바뀐 것인지 어떤지 잘 모르겠다. 사장님 말씀이 삼청동과는 달리 정자점은 부가세 포함 가격이고, 실제 가격은 비슷한 수준이라고 하더라. ![]() 해물 누룽지탕. 떨림본능이 제대로 느껴지는 사진이다. 누룽지탕 찍은게 이게 전부라서 다른 것 올릴 수도 없고... ![]() 유린기.. 언제 먹어도 좋네.. ![]() 고량주... 술하고는 인연이 거의 없는 내가 뭔 술인지 어찌 알겠나. 괜히 선배 술 따른다고 하다가 손이 미끄려저 거의 두 잔 분량을식탁 소독용으로 써버려 눈총을 많이 받았다. ![]() 중새우크림소스, 이게 쿠얼라이의 대표 요리가 된 것 같다. 사람당 하나씩밖에 안 돌아간 것이 아쉬웠다. ![]() 새우를 다 먹고난 찌끄레기 접시. 그런데 저 분홍색 한자는 뭔 글자일까? ![]() 사진이 작고 흐릿해서 티가 잘 안 나 보이는데, 중앙쯤 보이는 갈색 장은 왠지 인테리어용 장 같고, 오른쪽에 있는 것은 와인 냉장고였다. 사장님이 중식에 와인도 잘 어울린다고 했지만, 우리 멤버는 중식에는 그래도 고량주라고 해서 고량주로 결정했다. 뭐, 와인이든 고량주든 내 영역이 아니다. ![]()
뭔가 새로 시작하고 싶으면 기존 것을 다 날리고 새로 채워넣고자 할 때가 있다.
오라클에서도 이렇게 하고 싶었다. 테이블스페이스나 유저를 삭제하고 새로 만드는 것도 방법이 될 수 있겠지만 이 방법도 참 쉽지가 않더라. 누군가 schema를 삭제하라고 하던데 따라해 봤더니 잘 안 되었다. 다른 곳에서 설명을 보니 지우려는 schema 안의 객체를 먼저 없애고 지워야한단다. rmdir같은 부류네... 이봐... 지금 그거 지울 방법을 찾고 있는 거라고... 조금 더 검색을 하니 아래 스크립트를 돌려서 나온 결과를 실행하라고 했다. 실행해보니 행이 522개나 나왔다. 듣도보도 못한 테이블도 많이 나오고 말이다. select 'drop '||object_type||' '|| object_name|| DECODE(OBJECT_TYPE,'TABLE',' CASCADE CONSTRAINTS;',';') from user_objects; BIN$Q/r6Lu8Mz3LgQAB/AQBJgg==$0 이런 식으로 이름이 붙은 테이블들은 뭐란 말인가? 어쨌든 결과로 나온 것을 다시 돌렸더니 에러도 참 많이 난다. 그래도 내가 만들었던 테이블들은 다 지웠진 것 같다. 테이블들이 뭔가 지워지기는 했지만 다시 위 스크립트를 돌렸는데 행이 9개 줄었다. 지워진 테이블을 대신해서 BIN$Q/r6Lu8Mz3LgQAB/AQBJgg==$0 같은 테이블이 더 늘어난 것 같다. 이것들은 drop table로는 안 지워지나보다. 오라클은 여전히 나에게 불친절하다. ps. 결론을 내렸다. 그냥 사용자 지우고 새로 만들었다. drop user myuser; CREATE USER myuser IDENTIFIED BY mypass DEFAULT TABLESPACE tblspace TEMPORARY TABLESPACE TEMP; GRANT connect, resource, dba TO myuser;
|
메뉴릿
메모장
카테고리
최근 등록된 덧글
한동안 저도 블로그에 신..
by 하야로비 at 06/10 같았군요...... 다른.. by appler at 05/27 질러요 질러~ 저처럼 .. by 하야로비 at 01/07 하야로비님도 새해 복 .. by 유인아 at 01/04 허헛, 이 무플 사이트에.. by 하야로비 at 11/19 오옷!!! 내 proc 로 컴.. by 김재명 at 11/18 나도 이름이 두개이지만.. by 이경록 at 06/04 저거 올리고나서 10분도 .. by 하야로비 at 05/31 굳이 Audacious가 아.. by LunApapa at 05/31 아... 개인적인 용도로.. by 하야로비 at 05/02 최근 등록된 트랙백
이전 블로그
이글루 링크
|