오라클 연속 시퀀스 번호가 범위에 인수 SQL

다음은 간단한 재고 목록이 코드는 일련 번호를 나타내며,의, 형식의 대표는 일련 번호의 형식입니다. 각 레코드는 재고 기록을 나타냅니다.

 

 이제 이러한 수요가, 범위에 대한 순차적 인 일련 번호를 찾을 수 있습니다. 다음과 같이 예상 결과는 다음과 같습니다

 

 

어떻게 이러한 요구를 실현해야 하는가?

반응식 1을 통해 반복하여, 메모리에 전체 테이블의 데이터를 로딩하고, 시작 FormatA FormatB 단부에게 일련 번호를 찾는. 재고 기록의 작은 양이 문제가되지 않습니다. 그러나 주식이 1000 만에 기록에 도달하는 경우, 또는 메모리 문제가 부족 명확하게 저하하는 경향이있다.

반응식 2 : 위해 SEQ ID NO 동일한 포맷 형식은 SQL을 사용하여 기록을 병합.

오라클 XMLAGG 함수 시퀀스 번호가 함께 접합 될 수있다 제공 리턴 타입 CLOB 특정 순서이다. LISTAGG 기능도 비슷한 기능을 제공하지만, 최대 길이는 4000 자입니다. 표 주식 서열은 그래서 여기 XMLAGG 기능을 선택, 4000 개 이상의 문자를 함께 접합 종종있다. 특정 참조 : https://blog.csdn.net/zqkwcyx/article/details/88663982

SQL은 다음 예제를 제공합니다 :

 

재고와 같은 (
numFormat, 0001 등 'FormatA'를 선택 이중 노동 조합 코드로
이중 노동 조합 코드로 numFormat, 0002 등 'FormatA'를 선택
이중 노동 조합 코드로 numFormat, 0003 등 'FormatA'를 선택
numFormat으로 'FormatA'를 선택, 0005 듀얼 노조 부호로서
이중 조합으로부터 코드로서 numFormat, 0006 등 'FormatA를'선택
'FormatA'을 선택 numFormat, 0008 듀얼 조합으로부터 코드로
'FormatB'numFormat 0001 듀얼 조합으로부터 코드로서 선택
으로 선택 'FormatB를' numFormat, 0002 듀얼 노동 조합 코드로
이중 노동 조합 코드로 numFormat, 0005 등 'FormatB'를 선택
이중 노동 조합 코드로 numFormat, 0006 등 'FormatB'를 선택
numFormat으로 'FormatB'를 선택,0008 듀얼 노동 조합의 코드로
이중에서 코드로 numFormat, 0009 등 'FormatB'를 선택
)
을 선택 numformat, RTRIM (XMLAGG (XMLELEMENT (예, orig.code, ','). 추출물 ( '// 텍스트 ()') orig.code에 의해 순서). GetClobVal () ','()에서 NumberClob
인벤토리 SELECT *
) 오리지널
orig.numFormat 의해 기
;

 

 또한 루프를 통해를 통해, 그리고 FormatA FormatB에게 시작과 끝 시퀀스 번호를 찾을 수 있습니다.

ICP 1, 옵션 1은 발생하지 않습니다 훨씬 덜 문제가 될 레코드 수를 확인하십시오. 단점은 여전히 ​​CPU 소비가 비교적 큰 상을 통해 메모리에로드 될 사이클을 필요로한다는 것이다.

 

시나리오 3 : 직접 일련 번호 범위를 찾기 위해 SQL을 사용하여 메모리에 통과 피할 수 있습니까? 대답은 '예, 참조 지연, 납 기능입니다.

https://blog.csdn.net/weixin_41287692/article/details/80577828

전 동료 프랭크 아이디어 제안 감사합니다, 나는 약간 중복 필드를 제거, 자신의 재단에서 일부 변경했습니다.

 

재고와 같은 (
numFormat, 0001 등 'FormatA'를 선택 이중 노동 조합 코드로
이중 노동 조합 코드로 numFormat, 0002 등 'FormatA'를 선택
이중 노동 조합 코드로 numFormat, 0003 등 'FormatA'를 선택
numFormat으로 'FormatA'를 선택, 0005 듀얼 노조 부호로서
이중 조합으로부터 코드로서 numFormat, 0006 등 'FormatA를'선택
'FormatA'을 선택 numFormat, 0008 듀얼 조합으로부터 코드로
'FormatB'numFormat 0001 듀얼 조합으로부터 코드로서 선택
으로 선택 'FormatB를' numFormat, 0002 듀얼 노동 조합 코드로
이중 노동 조합 코드로 numFormat, 0005 등 'FormatB'를 선택
이중 노동 조합 코드로 numFormat, 0006 등 'FormatB'를 선택
numFormat으로 'FormatB'를 선택,0008 듀얼 노동 조합의 코드로
이중에서 코드로 numFormat, 0009 등 'FormatB'를 선택
)
(에서 numFormat, 코드 startNum, NVL (납 (previousCode)를 선택 이상 (previousCode 먼저 널링에 의해 numFormat 명령에 의해 파티션), maxn) endNum

numFormat 선택
래그 (코드 1) 위에 (코드 순서에 의하여 numFormat 의한 분할) previousCode 코드,
최대 (코드)을 통해 (numFormat 의한 분할) maxn
인벤토리를

)
여기서, NVL (코드 previousCode-1,1) <> 0
;

 

추천

출처www.cnblogs.com/pmh905001/p/12241898.html