2013-04-05 2 views
1

같은 시나리오가 있습니다. 열이 동적으로 생성 될 저장 프로 시저를 만들어야합니다. 이 C 럼에 기초하여 임시 테이블을 작성해야합니다. 사실,이 시나리오는 SQL Server에서 수행했으며 SQL Server 데이터베이스를 Oracle로 마이그레이션했습니다. 동적 테이블을 만들려면, 당신이 말한되고 그건 동적 SQL임시 테이블을 동적으로 생성했습니다.

BEGIN 
    EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE table_name(col1 number, col2 number)'; 
END; 

을 사용해야 할 것

감사

+0

당신은 오라클의 임시 테이블 또는 plSQL의 중첩 테이블을 의미합니까? –

+0

오라클의 임시 테이블이지만 동적으로 열이 올 것입니다 ... – user1990383

+0

전혀 문제가 아닙니다. 많은 열이 있습니까? 열 번호도 달라 지거나 ... 고정되어 있습니까? –

답변

8

, 그것은 거의 확실 실수 직접 포트 SQL 서버 코드에 그 Oracle에 임시 테이블을 작성합니다. SQL Server 코드와 동일한 방식으로 작동하지 않습니다.

  • 먼저 Oracle의 임시 테이블은 세션에 로컬 인 SQL Server와 달리 모든 세션에서 볼 수 있습니다. 즉, 저장 프로 시저를 호출하는 두 개의 세션이있는 경우 임시 테이블을 만들려고 시도하고 두 번째 세션이 실패 할 것입니다. 즉 임시 테이블을 만드는 대신 임시 테이블을 삭제하는 경우 상황이 악화됩니다. 수천 개의 임시 테이블이 누적되도록 함).
  • 테이블을 생성하는 것은 필요한 래칭 양을 감안할 때 비효율적 인 프로세스입니다. 오라클의 가정은 당신이 즉석에서 객체를 생성하지 않는다는 것입니다. 응용 프로그램이 해당 가정을 위반하면 확장 성 문제가 발생할 수 있습니다.
  • 즉석에서 테이블을 만드는 경우 즉시 테이블을 참조해야합니다. 따라서 임시 테이블에 대한 쿼리는 동적 SQL을 사용해야합니다. 이는 정적 SQL보다 효율적이지 않으며 코드를 작성하기가 어려워지고 디버그하기가 어려워지고 유지 관리가 더 어려워집니다.
+0

응답 해 주셔서 감사합니다. 즉석에서 테이블을 만드는 것은 의미가 없지만이 문제를 해결하기 위해 무엇을해야하는지 생각하지 못했습니다. 이 시나리오를 어떻게 달성 할 수 있는지 제안 해 주시겠습니까? 감사합니다. – user1990383

+0

@ user1990383 - 해결하려는 비즈니스 문제에 따라 달라질 수 있습니다. 예를 들어 열이 "동적으로 나타납니다"는 이유는 무엇입니까? 왜 임시 테이블을 원하니? 두 가지 모두 기술 구현 세부 사항입니다. 기본 비즈니스 요구 사항은 무엇입니까? –

+0

다른 열 이름을 가진 파일이 생길 때마다. 그 파일에 대한 표를 만들어야합니다. 다른 사용자가 저장 프로 시저를 호출 할 수 있습니다. – user1990383

2

어쩌면 나는 조금 화제이지만 실제로 달성하고 싶은 것을 분석하려고합니다. 나는 T-TSQL을 사용하는 몇몇 사람들과 일해 왔으며 SQL 서버에 사용 된 패턴은 오라클과 다르다. 코드를 일일이 정확하게 다시 작성하지 마십시오. 작동하지 않습니다.

예를 들어, 임시 테이블의 사용은 오라클에서 잘못된 디자인으로 간주됩니다 (대부분의 경우). T-SQL에서 임시 테이블을 사용하는 경우 일반적으로 Oracle에서 커서를 사용합니다.

또한 SQL과 PL/SQL은 컴파일 된 언어입니다 (실제 스크립팅이 아닙니다). PL/SQL 패키지에서 테이블을 생성 한 후 일부 또는 다른 패키지에서 사용할 수는 없습니다. Oracle에서 개체를 수정할 때 모든 종속 코드를 백그라운드에서 다시 컴파일해야합니다. 이것은 오라클에 SQL Server에서 온 사람들을위한 많은 좌절의 원천입니다.

더 나쁘지는 않습니다.

+0

좋아, 고마워. 내가 너를 도울 수 있으면 나를 위해 @Justin 동굴에 대한 요구 사항을 설명했다. – user1990383

+0

글쎄 그것은 또한 agly하지만 EAV 구조에 대해 생각할 수도 있습니다. 예측할 수없고 정규화되지 않은 경우입니다. – ibre5041

관련 문제