Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PL/PGSQL动态SQL内部函数中引用局部变量_Sql_Postgresql_Function_Plpgsql_Dynamic Sql - Fatal编程技术网

在PL/PGSQL动态SQL内部函数中引用局部变量

在PL/PGSQL动态SQL内部函数中引用局部变量,sql,postgresql,function,plpgsql,dynamic-sql,Sql,Postgresql,Function,Plpgsql,Dynamic Sql,我有一个用于数据处理的PL/PGSQL函数。我需要首先从表中选择每一行,然后检索每一列的列名和相关值。因此,基本上我是将记录取消旋转到水平状态。这是必要的,因为它们将进入键/值存储,而不是水平存储 以下是我到目前为止的函数摘要: CREATE OR REPLACE FUNCTION myfunc() RETURNS INT AS $BODY$ DECLARE x record; aesql varchar; aeval varchar; y information_sche

我有一个用于数据处理的PL/PGSQL函数。我需要首先从表中选择每一行,然后检索每一列的列名和相关值。因此,基本上我是将记录取消旋转到水平状态。这是必要的,因为它们将进入键/值存储,而不是水平存储

以下是我到目前为止的函数摘要:

CREATE OR REPLACE FUNCTION myfunc()
    RETURNS INT AS 
    $BODY$
DECLARE 
x record; 
aesql varchar;
aeval varchar;
y information_schema.columns%rowtype;
BEGIN
    FOR x IN
    SELECT * FROM mytable
    LOOP
        FOR y in
        SELECT * FROM information_schema.columns where table_schema = 'public' AND table_name = 'mytable'
        loop                                
            execute 'select cast(x.'||y.column_name||' as varchar) into aeval';
        end loop;
        -- add processing for aeval once the dynamic sql is figured out                     
    END LOOP;   
    RETURN 1;
END;
$BODY$ LANGUAGE plpgsql VOLATILE;
我的理解是,要执行execute语句,应该是CRUD查询或类似的查询。任何我试图直接完成作业的问题,比如

execute 'aeval := x.'||y.column_name;
“aeval”或“:”的语法错误失败,如果我使用“:aeval”等

那么,有人知道这是否可能,以及我将如何执行这个动态sql吗?总之,我需要获取记录x的值,但我只知道列名

当我尝试运行该函数时,收到错误:

错误:表“x”的子句条目中缺少,其中:PL/pgSQL 函数myfunc()位于EXECUTE语句的第23行

这个有趣的问题:

select
    translate(string_to_array(mytable.*::text,',')::text,'()','')::text[]
from mytable;
将mytable中的行作为文本数组返回。在函数中循环数组将更容易:

create or replace function myfunc()
returns setof text language plpgsql
as $$
declare
    eaval text;
    x text[];
begin
    for x in
        select translate(string_to_array(mytable.*::text,',')::text,'()','')::text[] 
        from mytable
    loop
        foreach eaval in array x loop
            return next eaval;
        end loop;
        return next '-- next row --';
    end loop;
end $$;

select * from myfunc();

具有参数表名称的函数:

create or replace function myfunc(table_name text)
returns setof text language plpgsql
as $$
declare
    eaval text;
    x text[];
begin
    for x in
        execute format($fmt$
            select translate(string_to_array(%s.*::text,',')::text,'()','')::text[] 
            from %s 
            $fmt$, 
            table_name, table_name)
    loop
        foreach eaval in array x loop
            return next eaval;
        end loop;
        return next '-- next row --';
    end loop;
end $$;

select * from myfunc('mytable');
select * from myfunc('myschema.myanothertable');

阅读更多:这很酷。如果您知道如何通过将表指定为字符串或对象来实现这一点,您会获得额外的积分吗?例如,如果我想在几种不同的表上运行它,该怎么办?