2012-12-10 14 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

As * always *:您的PostgreSQL版本?另外,描述函數*應該返回的內容。一排還是幾排? –

+0

密切相關:http://stackoverflow.com/questions/11472790/analogue-to-cross-apply –

回答

2

PostgreSQL不允許使用聯接關係的值作爲聯接中的第二關係的參數。它將在9.3和LATERAL子查詢中可用。這是第一個問題。第二個問題 - 子查詢只能返回一行

(select CHILD_OID from BTREENODES_NODEHIERARCHY) 

可能返回多行

你不需要等到9.3 - 使用CTE(公共表表達式),而不是用來處理一些遞歸數據。