在嵌套的postgresql函数中使用父级变量?

在嵌套的postgresql函数中使用父级变量?,sql,postgresql,Sql,Postgresql,我有一个相当长的SQL例程,它获取一些参数并运行一大堆CASE语句。我的结构如下: DO $$ DECLARE var INTEGER = "someColumn" FROM TABLE LIMIT 1; BEGIN; CREATE OR REPLACE FUNCTION pg_temp.fn(var2 boolean) returns decimal AS $fn$ SELECT CASE WHEN var2 THEN var::decimal ELSE 0::decimal END $

我有一个相当长的SQL例程,它获取一些参数并运行一大堆
CASE
语句。我的结构如下:

DO $$
DECLARE var INTEGER = "someColumn" FROM TABLE LIMIT 1;

BEGIN;

CREATE OR REPLACE FUNCTION pg_temp.fn(var2 boolean) returns decimal AS 
$fn$ SELECT CASE WHEN var2 THEN var::decimal ELSE 0::decimal END $fn$ language sql;
$$
而且在
fn
内部使用
var
似乎不太管用。因为
列不存在
。有没有办法让它发挥作用,也许我的想法太复杂了


编辑:修复了丢失的类型。在原始代码中有一个类型声明,该声明不是问题所在。首先,在嵌套函数中使用变量是。

这不是最佳做法。可以这样做,但不建议使用嵌套函数

问题在于
var
与函数在不同的范围内。您必须将函数作为一个独立单元“编写”。您可以使用
EXECUTE
FORMAT
执行此操作

以下是将
var
显示为消息的函数示例:

DO $$
DECLARE
    sql text; -- To "write" the function
    var integer := id FROM table_name ORDER BY id LIMIT 1;
BEGIN
-- To make it hapend I use $test$ to set the function.
-- FORMAT is to allocate var into the function through '%s'.
-- you have to use the correct sintax acording to the data type.
    sql :=  FORMAT($test$
CREATE OR REPLACE FUNCTION test() RETURNS void AS $FUNCTION$
BEGIN
    RAISE NOTICE '%s';
END; $FUNCTION$ LANGUAGE plpgsql
$test$,var);
    EXECUTE sql;
END; $$

那是我的错误。我的实际声明包含一个类型(我不能在这里发布原始代码),但是当尝试
创建
函数
时,我的示例中的
var
列不存在。变量在脚本的其他地方工作,只是在该函数中未知。
CREATE函数是否在
EXECUTE
中?不,在我的代码中没有
EXECUTE
。编辑:其他一切都是纯SQL,使用顶部声明的变量(共有8个)。@david1602更改了我的答案,我认为这是您需要的。我明白了,谢谢您的努力!这似乎太复杂了。我知道SQL不是一种真正的“编程语言”,但我认为不同作用域的东西可能会起作用,类似于它在JavaScript中的作用。无论如何,我想我会选择在一个不同的CTE中选择它并加入它,而不是试图通过函数获取数字。编辑:很遗憾,我不能投票,因为我的声望不足15,但我至少把它标记为可接受的解决方案!