2010-12-20 10 views
2

시간 범위에서 필터링하는 복잡한 SELECT 쿼리가 있는데 사용자 지정 매개 변수를 사용하여이 시간 범위 (시작 날짜와 종료 날짜)를 지정할 수 있습니다. 그래서 저장 프로 시저를 사용하여이를 수행 할 수 있으며 반환 값은 여러 행 결과 집합입니다. 내가 가지고있는 문제는 나중에이 결과 세트를 처리하는 방법입니다. 저장 프로 시저가 단지 매개 변수를 취하는 SELECT 경우에도저장 프로 시저에서 데이터 선택

SELECT * FROM (CALL stored_procedure(start_time, end_time)) 

: 내가 좋아하는 뭔가를 할 수 없습니다. 서버 측 준비 문은 작동하지 않습니다 (또한 영구하지 않습니다). 임시 테이블을 사용하는 것이 좋습니다. 그 이유는 이상적인 솔루션이 아니기 때문입니다. 1) 테이블 스키마를 지정하고 싶지 않고 사용자가해야하는 것처럼 보입니다. 2) 임시 테이블의 수명은 쿼리 호출에만 국한됩니다. 그 이상으로 지속 할 필요는 없습니다.

다시 요약하면, 서버 측에서 마치 하위 쿼리 인 것처럼 조작 할 수있는 결과 집합 인 서버 측의 영구 준비 문과 같은 것을 원합니다. 어떤 아이디어? 감사.

그건 그렇고, MySQL 5.0을 사용하고 있습니다. 나는 꽤 오래된 버전이라는 것을 알고 있지만,이 기능은 더 이상 최신 버전에 존재하지 않는 것 같습니다. 다른 SQL 엔진에서 저장 프로 시저에서 SELECT를 수행 할 수 있는지 확실하지 않습니다. 전환은 현재로서는 선택 사항이 아니지만 앞으로 전환 할 경우에 대비하여 가능할 지 여부를 알고 싶습니다.

+0

저장 프로 시저를 원하는대로 하위 쿼리로 호출 할 수 없으므로 상황에 따라보기를 사용할 수 있습니까? – DTest

+0

뷰가 작동하지 않는 이유는 하위 쿼리에서 매개 변수를 가져오고 뷰를 사용하여 전체 쿼리를 설정해야하기 때문입니다. –

답변

1

다른 엔진에서는 기능에서 선택이 가능합니다. 예를 들어, 오라클은 사용자 정의 유형의 테이블을 반환하는 함수를 작성할 수 있습니다. 함수에서 결과 집합을 정의하고 쿼리를 사용하거나 선택 및 코드 조합을 사용하여 결과 집합을 채울 수 있습니다. 결국, 결과 집합은 함수에서 반환 할 수 있으며, 사용하여 해당에 쿼리를 계속 할 수 있습니다

select * from table(FunctionToBeCalls(parameters)); 

유일한 단점은,이 결과 세트가 인덱싱되지 않습니다 것을, 그래서이 경우 속도가 느릴 수 있습니다 함수는 복잡한 쿼리 내에서 사용됩니다.

MySQL에서는 이와 비슷한 기능이 없습니다. 선택 쿼리에서 프로 시저의 결과 집합을 직접 사용할 방법이 없습니다. 함수에서 단일 값을 반환 할 수 있으며 값을 반환하는 프로 시저에 OUT 또는 INOUT 매개 변수를 사용할 수 있습니다. 하지만 전체 결과 집합을 사용할 수 없습니다. 프로 시저 내에 임시 테이블을 채우는 것이 가장 가까운 방법입니다.

+1

완전성을 위해 : PostgreSQL, SQL 서버 및 DB2에서 "테이블 함수"도 가능합니다. –

+1

모두 나열하려면 Firebird/Interbase를 목록에 추가하십시오 –

관련 문제