2017-08-13 64 views
1

我是在postgresql中創建函數的新手。我使用的版本相當老舊。這是8.2.15(不是我的選擇,而是我的組織)。以下示例試圖將一個函數應用於另一個函數中的臨時表。將函數應用到另一個函數中的臨時表

-- First function 
create or replace function inner_func(_tbl anyelement) 
RETURNS void AS 
$$ 
BEGIN 
    EXECUTE 'ALTER TABLE ' || _tbl || ' ADD COLUMN d_amount INTEGER'; 
    EXECUTE 'UPDATE ' || _tbl || ' SET d_amount = 2* amount'; 
    RETURN; 
END; 
$$ 
LANGUAGE plpgsql volatile; 

-- Second function 
CREATE OR REPLACE FUNCTION outer_func() 
RETURNS void AS 
$$ 
BEGIN 
    DROP TABLE IF EXISTS my_temp; 
    CREATE TEMP TABLE my_temp 
    (id serial primary key, 
    amount integer 
); 
    INSERT into my_temp (amount) values (10),(20); 

    -- now apply the inner_func right here 
    EXECUTE 'SELECT inner_func(' || quote_ident('my_temp') || ')'; 

    RETURN; 
END; 
LANGUAGE plpgsql volatile; 

當我運行

SELECT outer_func(); 

它吐出一個錯誤:

column "my_temp" does not exist 

但inner_func作品,如果我用它自身的類似如下:

create temp table my_temp2 
(id serial primary key, 
amount integer 
); 
INSERT INTO my_temp2 (amount) values (10),(20); 
SELECT inner_func(quote_ident('my_temp2')); 
SELECT * from my_temp2; 

id amount d_amount 
1 10  20 
2 20  40 

如何讓inner_func工作outer_func?任何想法?

回答

1

它看起來像這個問題是在這裏:

EXECUTE 'SELECT inner_func(' || quote_ident('my_temp') || ')'; 

=> 

EXECUTE 'SELECT inner_func(quote_ident(' || quote_literal('my_temp') || '));'; 

DBFiddle Demo

+1

感謝lad2025。它像一個魅力! – midtownguru

+0

@midtownguru很高興聽到我可以幫助:) – lad2025

相關問題