Sunday, April 25, 2010

ORA-01752: cannot delete from view without exactly one key-preserved table



delete 문 같은 경우에는 대상이 되는 table을 아래 쿼리와 같이 조인하여 사용하는 경우가 있을 수 있다.


DEPT TABLE의 PK는 dept_no 이고, 
EMP TABLE의 PK는 emp_no, fac_no 이다.


delete from (select name, age, b.dept_name
                       from emp a, dept b
                   where a.dept_no =  b.dept_no 
                      and b.dept_name = 'Service');


이렇게 쿼리를 작성하면 'Service' 부서에 속한 모든 EMP TABLE의 요소들이 삭제된다.

근데 만약 대상에 대해서 key preserved table이 존재하지 않는다면 표제와 같은 Oracle 에러가 발생한다.

ORA-01752: cannot delete from view without exactly one key-preserved table

한마디로 key-preserved 한 table이 없어서 이 쿼리는 사용할 수 없다는 뜻이다.
key-preserved table은 쉽게 생각해서 1:n 관계에서 Join 문을 만들어서 select 쿼리를 수행할 때 특정 table의 Row들이 중복되지 않고 유일성을 유지하는 경우를 말한다.여기서 중요한 것은 실제로 Row들이 중복되지 않고 나오느냐가 아니다. Join 구조 안에서 모든 PK를 서로 물고 있느냐는 것이다.

한마디로 프로그래머의 실수로 인해서 중복 Row가 생길 수가 없는 구조를 말한다. 그러한 두개의 table이 서로간의 PK를 맞물었을 때 ORA-1752는 없어진다. 즉, 예초부터 DB 설계가 잘못되어 있다면 delete 쿼리를 Join구조로 사용할 수가 없다.

잘못된 구조의 예를 한번 만들어 봤다.


DEPT TABLE의 PK는 dept_no, dept_pos 이고, 
EMP TABLE의 PK는 emp_no, fac_no 이다.

delete from (select name, age, b.dept_name
                       from emp a, dept b
                   where a.dept_no =  b.dept_no 
                      and b.dept_name = 'Service');

이 경우 dept_pos는 EMP table과 아무런 관계도 맺지 않는다. 즉 PK가 두개인 DEPT TABLE은 dept_no 정보가 같은 Row가 얼마든지 존재할 가능성이 있고(실제로 DB내용은 그렇지 않다해도 아무 상관도 없다), 즉 key-preserved table이어야 하는 EMP TABLE은 여러개의 중복 Row가 Return 될 수 있다. 실제로 쿼리를 동작시켰을 때 중복되느냐 아니냐는 전혀 관심사가 아니다. 구조적인 문제다.








Friday, April 23, 2010

Flex Builder: An internal build error has occurred.


엊그제 열심히 Flex 코딩을 하고 있는데 갑자기 나타난 이 녀석.

An internal build error has occurred.

도대체 뭔가 싶어서 몇번이나 Project Clean을 시켜도 없어지질 않는다.
에러가 난 위치에 대한 정보는 전혀 없고 Project 위치만을 알려 줄 뿐이다.
당최 난감해하면 인터넷 검색을 해보았다.

몇몇 한국어 블로그에선 Flex Complier가 제대로 Syntax 에러를 잡아주지 못하는 경우에 발생한다고들 한다. 예를 들자면 아래와 같은 내용이었다.

switch(value) {
// Just blank in there.
}

이 내용을 바탕으로 인간 컴파일러 가동... -_-;;
2시간을 넘게 몇몇 Syntax 에러를 찾아내긴 했지만 전혀 해당 사항이 없었다.

결국 다시 구글링으로...
해외 사이트를 통해서 이 에러에 대해서 자세히 소개된 문건이 있었는데 아래에 소개한다.


녀석이 소개한 내용을 약간만 번역하자면... 세상에 이런 엿같은 Error Description은 첨 본다고 한다. 물론 나도 동의하는 바다.
원인을 4가지 정도 서술해 놓았는데 아래와 같다.

  • 위에서 언급한 한국 블로거가 말한 Case 였다. Switch 문을 주석처리할 때 내부만 처리하고 Switch 문을 그대로 둘 경우 발생한다고 한다. 반드시 Switch 문을 주석 처리할 때는 전체 구문을 통째로 처리하라고 언급하고 있다.
  • 좀 더 어이없고 황당한 경우이다. Debug Session이 죽지 않는 경우이다. Rebuild, Clean 이 수행되지 않으며 해당 Swf 파일이 삭제 되지도 않는다. 작업 관리자에서 adl.exe Processer를 죽이면 된다고 한다.
  • Project 내에 설정 파일 .project, .actionscript 에 제대로 Update 되지 않은 경우이다. Project를 삭제하고 새 Project에 기존 내용을 모두 옮겨 넣으면 문제가 해결된다고는 한다. 나에게 발생한 문제가 이 경우였는데 실제로 굳이 Project를 지우고 새로 만들 필요는 없었다. .project, .actionscript 파일을 문제가 되는 부분만 찾아서 고치니까 해결되었다.
  • 이 경우는 한국 블로그에서 많이 보았는데 일반적인 Syntax 에러에서도 발생할 수 있다는 것이었다. 자질구레한 Syntax 에러를 Complier가 제대로 못찾아 준다고 생각하니 왠지 Flex로 작업하기가 싫어진다.

문제를 해결하고 보니까 나의 에러 원인은 Class Refactor 기능이었다. 이 기능이 Refactor된 Class에 대한 정보를 .actionscript 파일에 제대로 Update 해주지 못한 것이다. 줸장;; 다신 Refactor 기능 쓰면 안되겠다...

어쨋든 에러 관련하여 Adobe에서는 전혀 도움되지 않는 페이지만 링크 해줄 뿐 아무런 지원이 없는 듯 하다... 위와 같은 Case로도 해결되지 않는다면 Flex Builder log를 한번 확인해보는 것도 문제해결에 도움은 될듯하다.
그 외에도 이상한 말들이 많았던거 같다. 어떤이는 3.2로 SDK를 업그레이드 하니까 괜찮더라는 등등... (참고로 나는 원래부터 3.2 SDK 였다. -_-;)

갑자기 스티브 잡스가 했던 말이 생각난다.
(Adobe의 기술을 지원할 의향이 없다고 말했던 기자회견)

"Flash 같은 쓰레기 코드를 아이팟에 탑재할 생각이 없다. 대부분의 MAC 컴퓨터에서 생기는 문제는 Flash Code로 인한 것들이었다."

이런 감정적인 발언에 공감하게 만들지 말란 말이다! -_-;;;


- Fin


Sunday, April 18, 2010

Eclipse Update Sites

호기심에 한번 설치해본 Find Bug.
전체 소스를 스캔해서 문맥적인 오류, 혹은 오류가 날 가능성에 대해서 Inform 해준다.
별로 쓸모 있는 Plugin은 아니지만 그저 '이런 것도 있구나' 정도로 한번 설치해보는 것도 재밌을 듯 하다.
참고로 나는 이 Plugin으로 PDE 개발에 Reference 정도로 사용하고 있다.

내가 사용하는 Eclipse Decompiler Tool 이다. 복잡한 설정이 전혀 없다. 그저 설치 후에 File Association에서 *.class 파일에 대한 기본 Viewer를 JD로 설정해놓으면 된다. 별도의 GUI 버전도 가지고 있는 것이 특징이다.

필수 Plugin 이다. 왜 Adobe사는 Builder를 만들때부터 이걸 넣지 않았을까 하는 의구심이 들 정도 이다.


Wednesday, April 14, 2010

[Oracle] BYPASS_UJVC 힌트 사용하기


Undocumented HIT (잘못되어도 오라클에서 보장 하지 않음)
일반적으로 특정 테이블을 Update하기 위해서는 WHERE절에 EXISTS 또는 IN 등의 Sub-Query로 조인 조건을 만족하는
Row를 먼저 Check하고, 조건을 만족하는 Row에 대하여 SET 절에서 필요한 데이터를 검색하여 Update하는 것이 보통이다.
이 때, Update 해야 하는 Row가 많을 경우 WHERE절이나 SET절에서 테이블을 반복적으로 Random 액세스해야 하는 부담이
발생하므로 처리 범위가 넓은 Update문의 경우에는 'Updatable Join View'를 활용할 필요가 있다.
이 때, 조인되는 2개의 테이블은 반드시 1:1 또는 1:M의 관계여야 하며,
Update되는 컬럼의 테이블은 M쪽 집합이어야 한다.
이것은 1쪽 집합인 Parent table의 조인 컬럼이 UK 또는 PK로 설정되어 있어야 함을 의미한다.
이 조건을 만족하지 못하는 Updatable Join View는 에러를 Return하며 실행되지 않는다.
(ORA-01779 cannot modify a column which maps to a non key-preserved table)
그러나, 일반적으로 View 또는 2개 이상의 테이블을 조인한 집합을 엑세스하는
경우가 많으므로 위의 UK나 PK Constraint를 설정하기 어려운 것이 현실이다.
따라서, 이러한 Constraint를 피해서 Updatable Join View를 사용할 수 있도록
BYPASS_UJVC 라는 힌트를 사용하여 튜닝할 수 있다.

자세한 예제는 아래 페이지에서 확인하라.

Tuesday, April 13, 2010

PDE Context Menu Target Class List


Eclipse 3.0 Registered Context Menus

Part NameRegistering ClassMenu IdWorkbench Part Id
AntAntVieworg.eclipse.ant.ui.views.AntVieworg.eclipse.ant.ui.views.AntView
BookmarksBookmarkVieworg.eclipse.ui.views.BookmarkVieworg.eclipse.ui.views.BookmarkView
BreakpointsBreakpointsVieworg.eclipse.debug.ui.BreakpointVieworg.eclipse.debug.ui.BreakpointView
Call HierarchyCallHierarchyViewPartorg.eclipse.jdt.callhierarchy.vieworg.eclipse.jdt.callhierarchy.view
Class File ViewerClassFileEditor#ClassFileRulerContextorg.eclipse.jdt.ui.ClassFileEditor
Class File ViewerClassFileEditororg.eclipse.jdt.ui.ClassFileEditor.EditorContextorg.eclipse.jdt.ui.ClassFileEditor
Class File ViewerClassFileEditororg.eclipse.jdt.ui.ClassFileEditor.RulerContextorg.eclipse.jdt.ui.ClassFileEditor
Classic SearchSearchResultVieworg.eclipse.search.SearchResultVieworg.eclipse.search.SearchResultView
CVS RepositoriesRepositoriesVieworg.eclipse.team.ccvs.ui.RepositoriesVieworg.eclipse.team.ccvs.ui.RepositoriesView
CVS Resource HistoryHistoryVieworg.eclipse.team.ccvs.ui.HistoryVieworg.eclipse.team.ccvs.ui.HistoryView
DebugLaunchVieworg.eclipse.debug.ui.DebugVieworg.eclipse.debug.ui.DebugView
DeclarationSourceVieworg.eclipse.jdt.ui.SourceVieworg.eclipse.jdt.ui.SourceView
DisplayDisplayVieworg.eclipse.jdt.debug.ui.DisplayVieworg.eclipse.jdt.debug.ui.DisplayView
ExpressionsExpressionVieworg.eclipse.debug.ui.ExpressionVieworg.eclipse.debug.ui.ExpressionView
ExpressionsExpressionVieworg.eclipse.debug.ui.VariableView.detailorg.eclipse.debug.ui.ExpressionView
HierarchyTypeHierarchyViewPartorg.eclipse.jdt.ui.TypeHierarchy.membersorg.eclipse.jdt.ui.TypeHierarchy
HierarchyTypeHierarchyViewPartorg.eclipse.jdt.ui.TypeHierarchy.subtypesorg.eclipse.jdt.ui.TypeHierarchy
HierarchyTypeHierarchyViewPartorg.eclipse.jdt.ui.TypeHierarchy.supertypesorg.eclipse.jdt.ui.TypeHierarchy
HierarchyTypeHierarchyViewPartorg.eclipse.jdt.ui.TypeHierarchy.typehierarchyorg.eclipse.jdt.ui.TypeHierarchy
Java EditorCompilationUnitEditor#CompilationUnitEditorContextorg.eclipse.jdt.ui.CompilationUnitEditor
Java EditorCompilationUnitEditor#CompilationUnitRulerContextorg.eclipse.jdt.ui.CompilationUnitEditor
Java EditorCompilationUnitEditororg.eclipse.jdt.ui.CompilationUnitEditor.EditorContextorg.eclipse.jdt.ui.CompilationUnitEditor
Java EditorCompilationUnitEditororg.eclipse.jdt.ui.CompilationUnitEditor.RulerContextorg.eclipse.jdt.ui.CompilationUnitEditor
JavadocJavadocVieworg.eclipse.jdt.ui.JavadocVieworg.eclipse.jdt.ui.JavadocView
MembersMembersVieworg.eclipse.jdt.ui.MembersVieworg.eclipse.jdt.ui.MembersView
NavigatorResourceNavigatororg.eclipse.ui.views.ResourceNavigatororg.eclipse.ui.views.ResourceNavigator
Package ExplorerPackageExplorerPartorg.eclipse.jdt.ui.PackageExplorerorg.eclipse.jdt.ui.PackageExplorer
PackagesPackagesVieworg.eclipse.jdt.ui.PackagesVieworg.eclipse.jdt.ui.PackagesView
Plug-in DependenciesDependenciesVieworg.eclipse.pde.ui.DependenciesVieworg.eclipse.pde.ui.DependenciesView
Plug-insPluginsVieworg.eclipse.pde.ui.PluginsVieworg.eclipse.pde.ui.PluginsView
ProblemsProblemVieworg.eclipse.ui.views.ProblemVieworg.eclipse.ui.views.ProblemView
ProjectsProjectsVieworg.eclipse.jdt.ui.ProjectsVieworg.eclipse.jdt.ui.ProjectsView
Properties File EditorTextEditor#TextEditorContextorg.eclipse.jdt.ui.DefaultTextEditor
Properties File EditorTextEditor#TextRulerContextorg.eclipse.jdt.ui.DefaultTextEditor
Properties File EditorTextEditororg.eclipse.jdt.ui.DefaultTextEditor.EditorContextorg.eclipse.jdt.ui.DefaultTextEditor
Properties File EditorTextEditororg.eclipse.jdt.ui.DefaultTextEditor.RulerContextorg.eclipse.jdt.ui.DefaultTextEditor
RegistersRegistersVieworg.eclipse.debug.ui.RegisterVieworg.eclipse.debug.ui.RegisterView
RegistersRegistersVieworg.eclipse.debug.ui.VariableView.detailorg.eclipse.debug.ui.RegisterView
TasksTaskVieworg.eclipse.ui.views.TaskListorg.eclipse.ui.views.TaskList
Text EditorTextEditor#TextEditorContextorg.eclipse.ui.DefaultTextEditor
Text EditorTextEditor#TextRulerContextorg.eclipse.ui.DefaultTextEditor
Text EditorTextEditororg.eclipse.ui.DefaultTextEditor.EditorContextorg.eclipse.ui.DefaultTextEditor
Text EditorTextEditororg.eclipse.ui.DefaultTextEditor.RulerContextorg.eclipse.ui.DefaultTextEditor
Threads and MonitorsMonitorsVieworg.eclipse.jdt.debug.ui.MonitorsVieworg.eclipse.jdt.debug.ui.MonitorsView
TypesTypesVieworg.eclipse.jdt.ui.TypesVieworg.eclipse.jdt.ui.TypesView
VariablesVariablesVieworg.eclipse.debug.ui.VariableVieworg.eclipse.debug.ui.VariableView
VariablesVariablesVieworg.eclipse.debug.ui.VariableView.detailorg.eclipse.debug.ui.VariableView

출처 : http://www.jdg2e.com/ch21.actions.table/doc/index.html

XMLEditor -> org.eclipse.core.runtime.xml.source.EditorContext

주사위 놀이

Busan city, South Korea
All about programming knowledge such as Java, Flex and Oracle DB Management.

Followers