使用SQL Server,我可以通過SQL Server Management Studio或任何其他客戶端使用完整的程序邏輯執行代碼特設T-SQL代碼。我已經開始使用PostgreSQL,並且遇到了一點不同,因爲PGSQL需要將任何邏輯嵌入到函數中。如何在不創建函數的情況下執行pl/pgsql代碼?
有沒有辦法執行PL/PGSQL代碼而不創建執行功能?
使用SQL Server,我可以通過SQL Server Management Studio或任何其他客戶端使用完整的程序邏輯執行代碼特設T-SQL代碼。我已經開始使用PostgreSQL,並且遇到了一點不同,因爲PGSQL需要將任何邏輯嵌入到函數中。如何在不創建函數的情況下執行pl/pgsql代碼?
有沒有辦法執行PL/PGSQL代碼而不創建執行功能?
的Postgres 9
DO $$
-- declare
BEGIN
/* pl/pgsql here */
END $$;
不,還沒有。 9.0版本(仍然是alpha)會有這個選項(做),你必須等到它被釋放。
+1,但我認爲這是爲8.5宣佈 - http://developer.postgresql.org/pgdocs/postgres/release-8.5.html – 2010-04-02 22:33:55
我認爲8.5成爲9.0因爲實施了一些主要功能... – 2010-04-02 22:37:50
啊,這將解釋它。 – 2010-04-02 22:38:20
我努力得到這個工作,因爲它是相當嚴格的關於完全正確的地方加入半冒號。但一旦你習慣了,它運作良好。當然,除了無法返回記錄外,您還可以引發異常併發出通知&,並執行其他解決方法,如在上面的註釋中指出的使用臨時表作爲@ErwinBrandstetter。
如:
DO
$$
BEGIN
IF EXISTS(SELECT 'any rows?'
FROM {your_table}
WHERE {your_column} = 'blah')
THEN
RAISE NOTICE 'record exists';
ELSE
RAISE EXCEPTION 'record does not exist';
END IF;
DROP TABLE IF EXISTS foo;
CREATE TEMP TABLE foo AS
SELECT 'bar'::character varying(5) as baz;
END
$$;
SELECT * FROM foo;
我認爲能夠返回行,類似於SQL Server/Oracle存儲過程,正在進入PostgreSQL的下一個版本。爲什麼這樣做已經超過了我。 – 2017-12-07 17:22:36
對於任何發現此答案並試圖獲得「錯誤:語法錯誤在「SELECT」或「SELECT」附近,你需要一個BEGIN和END。 DO $$ BEGIN/* pl/pgsql here */END $$ – 2013-08-26 02:31:38
但是,該代碼如何返回查詢結果?如果我把一個SELECT放在pl/pgsql部分,我會得到'ERROR:查詢沒有結果數據的目的地' – isapir 2015-12-29 02:14:52
@Igal:它不能。你不能從'DO'聲明中返回任何東西。您可能會發出通知或寫入臨時表或打開遊標作爲可能的解決方法。 – 2016-04-29 02:23:37