2009-07-21 22 views
1

좋아, 내가 이전에 가진 문제와 관련된 질문이 있습니다. 문제를 해결하는 방법을 알고 있지만 오류를 재현하는 데 문제가 있습니다.Sybase select variable logic

다른 레코드를 기반으로 레코드를 만드는 일련의 절차가 있습니다. 레코드는 link_id의 방법으로 기본 레코드에 연결됩니다. 이 link_id을 잡고하는 과정에서 쿼리는 활동에 대한 테이블의 여러 행이 지금

select @p_link_id = id --of the parent 
from table 
where thingy_id = (blah) 

입니다. 일부는 취소 될 수 있습니다. 내가 가지고있는 코드는 select 문에서 취소 된 행을 disinclude하지 않으므로 이전에 취소 된 행이있는 경우 해당 ID가 select에 표시됩니다. 취소 된 행을 삭제하면 항상 '열린'레코드 하나가 선택됩니다. (where status != 'C' 추가)

이렇게하면이 문제가 해결됩니다. 그러나 개발 환경에서 문제를 재현 할 수 있어야합니다.

데이터의 전체 힙을 입력하고 열기, 취소 등의 작업을 수행하여 유효하지 않은 ID를 반환하는 SELECT 문을 얻으려고 시도했습니다. 그러나 select를 실행할 때마다 ID가 순서대로 생성되지만이 오류가 발생한 경우 select 문은 변수의 첫 번째 값인 것으로 보이는 항목을 반환합니다.

예를 들면.

ID Status 
1 Cancelled 
2 Cancelled 
3 Cancelled 
4 Open 

내가 원하는 ID에 대한 선택을한다면, 내가 싶어, 위의 주어진 '4'. 오류에서 결과는 1입니다. 그러나 취소 된 레코드 10 개를 입력해도 선택 항목의 마지막 레코드는 계속 표시됩니다.

오라클에서 변수를 선택하고 둘 이상의 레코드가 반환되면 오류가 발생한다는 것을 알고 있습니다 (필자는 생각합니다). Sybase는 오류없이 여러 값을 변수에 할당 할 수 있습니다.

데이터가 테이블에서 선택되는 방식과 관련이 있습니다. 정렬 순서가없는 ID는 오름차순으로 반환되지 않으며 dboption은 변수로 선택됩니다. 질의 된 첫 번째 또는 마지막 값을 저장하십시오.

편집 : 저장 프로 시저 변경 사항을 롤백하여이 오류를 재현 할 수있는 것처럼 보입니다. 그러나, procs는이 link_id 컬럼 근처의 아무 곳에 나 가지 않습니다. 데이터베이스 아키텍처를 변경하면 인덱스 또는 다른 것이 손상 될 수 있습니까?

+0

[태그 : sybase-asa], [태그 : sybase-ase], [태그 : sybase-iq] 또는 [태그 : sqlanywhere]입니까? [sybase] 태그 정리 중 ... –

답변

2

하나 개 이상의 행이 반환되면 this에있어서, 상기 목록의 마지막 값 것이다 저장된 값.

ORDER BY을 통해 검색을위한 주문을 지정하지 않은 경우, 반환 된 주문은 데이터베이스 엔진의 편의에 따라 제공됩니다. 데이터베이스 인스턴스에 따라 매우 다를 수 있습니다. 데이터가 데이터베이스 블록 구조 내에있는 위치 때문에 생성 된 순서대로 표시되거나 "임의"로 나타날 수도 있습니다.

이야기의 도덕적 : SELECT s는 하나의 행을 반환

  1. 항상 만들 싱글
  2. # 1이 수행 할 수없는 경우, 만들기 위해 ORDER BY을 사용해야합니다 관심있는 사람은 마지막 제공