2013-12-16 141 views
1

當我在PL/pgSQL中實現以下代碼時,會發生一些錯誤。postgresql GET STACKED DIAGNOSTICS不能使用數組類型?

ERROR: syntax error at or near "[" 
LINE 10: GET STACKED DIAGNOSTICS text_val[1] = RETURNED_SQLSTATE, 

或者任何地方我不正確? 任何答覆將不勝感激。

CREATE or replace FUNCTION merge_db5(key INT, data TEXT) RETURNS text AS 
$$ 
    declare 
    text_val text[]; 
    text_result text; 
    -- Declare an array to store the result. 
BEGIN 
    text_result := ''; 
    BEGIN 
    INSERT INTO db(a,b) VALUES (key, data); 
    EXCEPTION WHEN unique_violation THEN 
    GET STACKED DIAGNOSTICS text_val[1] = RETURNED_SQLSTATE, 
    text_val[2] = COLUMN_NAME, 
    text_val[3] = CONSTRAINT_NAME, 
    text_val[4] = PG_DATATYPE_NAME, 
    text_val[5] = MESSAGE_TEXT, 
    text_val[6] = TABLE_NAME, 
    text_val[7] = SCHEMA_NAME, 
    text_val[8] = PG_EXCEPTION_DETAIL, 
    text_val[9] = PG_EXCEPTION_HINT, 
    text_val[10] = PG_EXCEPTION_CONTEXT; 
    text_result = array_to_string(text_val,',','*'); 
    /* 
    To save all the error messages to this array. 
    */ 
    END; 
    return text_result; 
END; 
$$ 
LANGUAGE plpgsql; 
+0

很抱歉,第一次使用這個平臺。我再次給我的困惑如下。當我在pgsql上實現上面的代碼時,會發生一些錯誤。 錯誤:語法錯誤處於或接近「[」 LINE 10:GET STACKED DIAGNOSTICS text_val [1] = RETURNED_SQLSTATE, 或其他地方我錯了? 任何答覆將不勝感激。 –

+1

我不確定你是否可以在那裏使用數組元素。文檔只是說「可變」。它是否使用簡單的文本變量作爲RETURNED_SQLSTATE的目標? –

回答

1

這不是你的錯誤。目標變量應該是標量。陣列不支持那裏。

這個限制的原因是plpgsql解析器和執行器的設計非常簡單。類似的行爲有一個FOR IN LOOP語句。另一方面,這個限制具有實際意義(儘管它沒有設計) - 數組更新不是很快 - 數組是不可變的結構,所以任何更新都是通過創建修改後的副本來模擬的 - 而更少的數組更新通常意味着更快的執行速度。

CREATE or replace FUNCTION merge_db5(key INT, data TEXT) 
RETURNS text AS $$ 
    DECLARE 
    f1 text; f2 text; f3 text; f4 text; f5 text; 
    f6 text; f7 text; f8 text; f9 text; f10 text; 
    BEGIN 
    INSERT INTO db(a,b) VALUES (key, data); 
    RETURN ''; 
    EXCEPTION WHEN unique_violation THEN 
    GET STACKED DIAGNOSTICS f1 = RETURNED_SQLSTATE, 
          f2 = COLUMN_NAME, f3 = CONSTRAINT_NAME, 
          f4 = PG_DATATYPE_NAME, f5 = MESSAGE_TEXT, 
          f6 = TABLE_NAME, f7 = SCHEMA_NAME, 
          f8 = PG_EXCEPTION_DETAIL, f9 = PG_EXCEPTION_HINT, 
          f10 = PG_EXCEPTION_CONTEXT; 
    RETURN array_to_string(ARRAY[f1, f2, f3, f4, f5, f6, f7, f8, f9, f10], '*'); 
    END; 
    $$ LANGUAGE plpgsql; 
相關問題