2010-04-02 125 views
41

使用SQL Server,我可以通過SQL Server Management Studio或任何其他客戶端使用完整的程序邏輯執行代碼特設T-SQL代碼。我已經開始使用PostgreSQL,並且遇到了一點不同,因爲PGSQL需要將任何邏輯嵌入到函數中。如何在不創建函數的情況下執行pl/pgsql代碼?

有沒有辦法執行PL/PGSQL代碼而不創建執行功能?

回答

51

的Postgres 9

DO $$ 
-- declare 
BEGIN 
    /* pl/pgsql here */ 
END $$; 
+3

對於任何發現此答案並試圖獲得「錯誤:語法錯誤在「SELECT」或「SELECT」附近,你需要一個BEGIN和END。 DO $$ BEGIN/* pl/pgsql here */END $$ – 2013-08-26 02:31:38

+2

但是,該代碼如何返回查詢結果?如果我把一個SELECT放在pl/pgsql部分,我會得到'ERROR:查詢沒有結果數據的目的地' – isapir 2015-12-29 02:14:52

+2

@Igal:它不能。你不能從'DO'聲明中返回任何東西。您可能會發出通知或寫入臨時表或打開遊標作爲可能的解決方法。 – 2016-04-29 02:23:37

5

不,還沒有。 9.0版本(仍然是alpha)會有這個選項(做),你必須等到它被釋放。

+0

+1,但我認爲這是爲8.5宣佈 - http://developer.postgresql.org/pgdocs/postgres/release-8.5.html – 2010-04-02 22:33:55

+1

我認爲8.5成爲9.0因爲實施了一些主要功能... – 2010-04-02 22:37:50

+0

啊,這將解釋它。 – 2010-04-02 22:38:20

1

我努力得到這個工作,因爲它是相當嚴格的關於完全正確的地方加入半冒號。但一旦你習慣了,它運作良好。當然,除了無法返回記錄外,您還可以引發異常併發出通知&,並執行其他解決方法,如在上面的註釋中指出的使用臨時表作爲@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; 
+0

我認爲能夠返回行,類似於SQL Server/Oracle存儲過程,正在進入PostgreSQL的下一個版本。爲什麼這樣做已經超過了我。 – 2017-12-07 17:22:36

相關問題