함수의 시퀀스의 현재 값을 읽어야합니다. 그러나, 나는 CURRVAL()를 사용하려고 각 세션에 처음으로, 나는 다음과 같은 얻을 오류 : 당신의 순서를 초기화해야이 오류에 대한 인터넷 검색을하여이 문제를 찾을 수있는 사람들을위한이 세션에서 시퀀스가 초기화되었는지 확인하는 방법은 무엇입니까?
currval of sequence "foo_seq" is not yet defined in this session
힌트 각 세션은 nextval() or setval()입니다.
나는 lastval()
또는 심지어 setval('your_table_id_seq', (SELECT MAX(id) FROM your_table));
과 같은 것을 사용할 수 있습니다. 그러나이 차이는 단순한 currval()
보다 느리게 나타나는 경향이 있습니다. 내 목표는 간격과 불일치를 피하는 것입니다. (일부 값은 수동으로 추가됩니다.) 따라서 논리 처리 전에 논리 값 nextval()을 사용하는 것이 이상적이지 않습니다. 어쨌든 세션에 대한 순서를 초기화하는 데이 필요하지만, 나는 이런 일을 수행하는 것을 선호 :
--start of the function here
IF is_not_initialized THEN
SELECT setval('foo_seq', (SELECT MAX(id) FROM bar_table)) INTO _current;
ELSE
SELECT currval('foo_seq') INTO _current;
END IF;
--some magic with the _current variable and nextvalue() on the right position
요점은 내가 같이 "is_not_initialized"하는 방법 아무 생각이 없다는 것입니다을하고 있는지 그것을이다 가능하다. 어떤 기능이나 다른 속임수가 있습니까?
EDIT : 사실 내 계획은 각 고객 그룹이 적절한 순서, 순서 없음, 이상한 "무언가와 같은 무언가"중에서 선택하도록하는 것입니다. 고객이 이러한 이상한 시퀀스를 원한다고해도, 필요한 아날로그 데이터가 있고 역 호환성을 위해 DB에 키를 저장해야하기 때문에 (일반적으로 거의 gapless 시퀀스가 필요함) 일반적으로 필요한 열에 만 사용됩니다.
어쨌든,이 상황이 적절한 솔루션이 아니며 그러한 상황에서 이러한 난제를 해결할 수있는 방법이 없을 수도 있으므로 고객에게 정말로 필요한지 다시 생각해 보겠습니다.
에 예외를 발생시킵니다. 시퀀스 *에는 간격이 생길 수 있으므로 **이를 피할 방법이 없습니다. 갭을 피하기위한 비즈니스 요구 사항이있는 경우 시퀀스를 사용할 수 없습니다. 그러나 일반적으로 시퀀스는 인위적 기본 키를 채우는 데 사용되므로 실제 값은 의미가 없습니다. 따라서 갭은 문제가되지 않습니다. gapless 시퀀스 값에 의존한다면 시퀀스에 대한 이해가 잘못되었습니다. –
또한 * "시퀀스의 현재 값을 읽어야합니다."* - 일반적으로 그러한 것이 없습니다. 'currval()'은 정의에 의해'nextval()'*에서 가장 최근에 얻은 값을 반환합니다 * (setval()은 데이터 정의 문과 비슷합니다. 동의합니다. 일부 함수 이름은 오해의 소지가 있습니다. 이걸로 무엇을 이루려고합니까? – pozs