我正在嘗試使用 postgresql 的 plpgsql 從嵌套塊中訪問父塊中的變數,如下所示
DO $outer-block$
DECLARE
test_variable text DEFAULT "test";
BEGIN
DO $inner-block$
BEGIN
RAISE NOTICE '%',test_variable;
END;
$inner-block$;
END;
$outer-block$;
當我嘗試運行它時,它告訴我“列 test_variable 不存在”,所以我想當內部塊被賦予控制權時,這個變數不在范圍內,有沒有辦法從嵌套中訪問它堵塞?
(我檢查了這個問題:How to access external scope variables from a function in PostgreSQL?,有點類似,但在這種情況下,它試圖從一個函式訪問外部塊變數,這是一個持久資料庫物件,它會在某種程度上試圖創建一個閉包,這不是我在這里做的,因為我想從一次性執行內部塊中訪問外部塊的范圍,這可能會有所不同,但我不不確定)
uj5u.com熱心網友回復:
檔案plpgsql 結構向您展示了如何執行此操作。以您的示例為起點:
DO
$$
<<outerblock>>
DECLARE
test_variable text DEFAULT 'test';
BEGIN
RAISE NOTICE '%',test_variable;
DECLARE
test_variable text := 'inner test';
BEGIN
RAISE NOTICE '%',test_variable;
RAISE NOTICE '%', outerblock.test_variable;
END;
END;
$$;
NOTICE: test
NOTICE: inner test
NOTICE: test
與您的示例的差異:
'test' 而不是“test”,因此該值不被視為識別符號。
使用
<<outerblock>>標簽語法來標記外部塊。$<some_tag>$不這樣做。使用標簽
outerblock.test_variable從外部塊中獲取變數值。
僅供參考,在您的原始示例中,不需要內部塊,因為您不執行任何更改值的操作test_variable,因此無論如何它將與外部塊相同。
更新
DO剛剛意識到您可能會根據示例中的使用來嘗試執行嵌套函式。那是另一回事,然后阻塞。為了傳遞資料,您必須將其作為引數添加到嵌套函式中的引數中。因為DO函式不能有不起作用的引數。您將不得不使用常規功能。
進一步更新
你可以有一個嵌套DO函式:
DO
$$
<<outerblock>>
DECLARE
test_variable text DEFAULT 'test';
BEGIN
RAISE NOTICE '%',test_variable;
DO
$i$
DECLARE
inner_test_variable text := 'inner test';
BEGIN
RAISE NOTICE 'Inner %', inner_test_variable;
END;
$i$;
END;
$$;
NOTICE: test
NOTICE: Inner inner test
DO
您只是無法訪問外部的變數。它們必須作為函式引數的引數傳遞給內部函式,并且DO函式沒有引數。您可以使用常規功能來做到這一點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/460293.html
標籤:PostgreSQL 变量 范围 嵌套的 plpgsql
上一篇:Python檢查三向相等
