我有一個進入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)下進行測試,連接到兩個有問題的版本的服務器,嘗試不同的事情。
有關我如何使此通話有效的任何想法?
哇,這是對可能的解決方案歐文一個偉大的破敗。謝謝!我個人喜歡ARRAY構造解決方案,因爲它對我來說看起來最清潔。現在,我在稍後的select中遇到錯誤,但如果我無法弄清楚這是另一天的問題。再次感謝Erwin! – user1945982
@ user1945982:如果該功能給您帶來困難,請打開另一個問題。從我看到的情況來看,它可能會被簡化一些。 –