2013-01-03 51 views
0

我有一個進入plpgsql函數的數組參數有問題。我的代碼在PostgreSQL 8.3中工作,但在9.2.1服務器上調用時失敗。在postgresql 8.3中工作的plpgsql代碼在9.2中失敗

我寫了一個虛擬函數來顯示問題。這是基於我寫的第一個plpgsql代碼。我知道它很醜,所以如果無法以適用於兩種服務器版本的方式逃脫我的引用,我很樂意提供有關重寫此代碼的建議,以便它可以在兩個服務器版本上使用。事實上,無論如何,我都樂於接受建議。我不是在PLPGSQL太好

因此,這裏的虛擬代碼演示了此問題:

CREATE OR REPLACE FUNCTION get_test(collection text[]) 
    RETURNS text AS 
$BODY$ 
DECLARE 
counter int8; directive text; condition text; querytype text; 
BEGIN 
    counter = array_lower(collection, 1); 
    WHILE (counter <= array_upper(collection, 1)) LOOP 
     SELECT INTO directive "?column?"[counter] FROM (SELECT collection) AS foo ; 
     counter = counter + 1; 
     SELECT INTO condition "?column?"[counter] FROM (SELECT collection) AS foo ; 
     counter = counter + 1; 
     SELECT into querytype "?column?"[counter] FROM (SELECT collection) AS foo ; 
     counter = counter + 1; 
    END LOOP; 
    RETURN 'dummy'; 
END; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 
ALTER FUNCTION get_test(text[]) OWNER TO postgres; 

收集參數是建立三個一組(一個簡單的字符串,一個SQL條件,和另一個字符串) 。下面是一個例子調用,在8.3工作,未能在9.2:

select * from get_test('{"dynamic","(tr.PROJECT_NAME = \'SampleProject\')","1"}') 

這讓早在預期8.3「假」,但失敗的9.2:達到或接近「SampleProject」 語法錯誤: ERROR插入點指向SampleProject的S,緊跟在單引號之後,所以我知道我是 ,不能正確地轉義嵌入式SQL中的單引號。

我已經嘗試過在單引號前沒有反斜槓,有兩個反斜槓,最後用兩個單引號,都沒有用。原始代碼由Java客戶端調用,但我一直在pgadmin3(版本1.16)下進行測試,連接到兩個有問題的版本的服務器,嘗試不同的事情。

有關我如何使此通話有效的任何想法?

回答

1

最可能的原因是standard_conforming_strings的不同設置。
試試這個電話:

的SQL標準的方式(和PostgreSQL的建議),以逃避單引號字符串字面內單引號是雙擊其中:

SELECT * 
FROM get_test('{dynamic,(tr.PROJECT_NAME = ''SampleProject''),1}'::text[]) 

OR:

SELECT * 
FROM get_test('{dynamic,"(tr.PROJECT_NAME = ''SampleProject'')",1}'::text[]) 

或者你可以求助於美元符,以避免轉義引號的多層

SELECT * 
FROM get_test($${dynamic,"(tr.PROJECT_NAME = 'SampleProject')",1}$$::text[]) 

甚至數組構造函數:

SELECT * 
FROM get_test(ARRAY['dynamic','(tr.PROJECT_NAME = ''SampleProject'')','1']) 
+0

哇,這是對可能的解決方案歐文一個偉大的破敗。謝謝!我個人喜歡ARRAY構造解決方案,因爲它對我來說看起來最清潔。現在,我在稍後的select中遇到錯誤,但如果我無法弄清楚這是另一天的問題。再次感謝Erwin! – user1945982

+0

@ user1945982:如果該功能給您帶來困難,請打開另一個問題。從我看到的情況來看,它可能會被簡化一些。 –

相關問題