2012-12-10 6 views
1

일부 SQLServer 저장 프로 시저를 변환 중입니다. 해결할 수없는 문제가 있습니다. 의 SQLServer 기능의 그 :PostgreSQL의 저장 프로 시저에 대한 매개 변수를 참조하는 중

CREATE FUNCTION [dbo].[getViewNodeHierarchyAux](@pivot varchar(255), @parents varchar(max)) 
RETURNS @view TABLE (PARENT_OID varchar(255), CHILD_OID varchar(255)) 
... 
insert into @view select F.* from BTREENODES_NODEHIERARCHY T cross apply [dbo].getViewNodeHierarchyAux(T.CHILD_OID,@parents) F where [email protected]; 

그리고 내가 PostgreSQL을에 생각의 전환이다 :

CREATE OR REPLACE FUNCTION getviewnodehierarchyauxprueba(IN pivot character varying, IN parents character varying) 
... 
    RETURNS TABLE(test_parent_oid character varying, test_child_oid character varying) 
return query (select F.* from BTREENODES_NODEHIERARCHY T cross join getviewnodehierarchyprueba(T.CHILD_OID,parents) F WHERE T.PARENT_OID=pivot); 

PgAdmin 절 '에서'테이블에서 't'에 대한 유효한 참조가 없다는 것을 알려줍니다. 그리고이 방법으로 쓰면 getviewnodehierarchyprueba((select CHILD_OID from BTREENODES_NODEHIERARCHY),parents)

두 개 이상의 레코드를 반환하며 작동하지 않습니다. 어떤 아이디어? 고맙습니다!

+1

* * : 항상 PostgreSQL? 또한 함수 *가 반환해야하는 내용을 설명하십시오. 1 행 또는 여러 행? –

+0

자세히 관련 : http://stackoverflow.com/questions/11472790/analogue-to-cross-apply –

답변

2

PostgreSQL에서는 결합시 두 번째 관계의 매개 변수로 조인 된 관계의 값을 사용할 수 없습니다. LATERAL subselect가있는 9.3에서 사용할 수 있습니다. 그것은 첫 번째 문제입니다. 두 번째 문제 - 부속 선택은

(select CHILD_OID from BTREENODES_NODEHIERARCHY) 

아마 반환 한 행을 반환 할 수 있습니다 더 한 행

보다 당신은 9.3 기다릴 필요가 없습니다 - 대신 일부 재귀 데이터를 처리하는 CTE (공통 테이블 식)를 사용합니다.