关于postgresql:将函数应用于另一个函数内的临时表

Apply function to temp table inside another function

我是在 postgresql 中创建函数的新手。我使用的版本相当旧。它是 8.2.15(不是我的选择,而是我的组织的)。以下示例尝试将一个函数应用于另一个函数中的临时表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
-- 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;

当我跑步时

1
SELECT outer_func();

它吐出一个错误:

1
COLUMN"my_temp" does NOT exist

但是如果我像下面这样单独使用inner_func,它就可以工作:

1
2
3
4
5
6
7
8
9
10
11
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
2
3
4
5
EXECUTE 'SELECT inner_func(' || quote_ident('my_temp') || ')';

=>

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

DBFiddle 演示