Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.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
Postgresql 选择整数返回函数结果到变量postgres中_Postgresql_Stored Procedures_Plpgsql - Fatal编程技术网

Postgresql 选择整数返回函数结果到变量postgres中

Postgresql 选择整数返回函数结果到变量postgres中,postgresql,stored-procedures,plpgsql,Postgresql,Stored Procedures,Plpgsql,在Postgres中,我正在为我编写的函数(存储过程)编写测试脚本。函数返回和整数,即插入行的id。在测试脚本中,我希望将该id选择到一个变量中,并显示所有内容都已正确插入 函数如下所示: CREATE FUNCTION create_factor(p_name VARCHAR(255)) RETURNS integer AS $$ DECLARE v_insert_id INTEGER; BEGIN .... RETURN v_insert_id AS id; END; $

在Postgres中,我正在为我编写的函数(存储过程)编写测试脚本。函数返回和整数,即插入行的id。在测试脚本中,我希望将该id选择到一个变量中,并显示所有内容都已正确插入

函数如下所示:

CREATE FUNCTION create_factor(p_name VARCHAR(255))
  RETURNS integer AS
$$
DECLARE v_insert_id INTEGER;
BEGIN
    ....
    RETURN v_insert_id AS id;
END;
$$ LANGUAGE plpgsql;
BEGIN;

\i create_factor.sql

DO $$
declare factorId integer;

select create_factor into factorId from    /* have tried selecting * as well */
create_factor(
    'my factor'::VARCHAR(255)
);

\x

select * from factors where name='my factor' and id=factorId;

\x

select k.key_name, v.value
from factors f
join factor_type_key_store k on k.factor_type_id = f.factor_type_id
join factor_key_value_store v on v.factor_type_key_store_id=k.id ;

END$$;

ROLLBACK;
psql脚本如下所示:

CREATE FUNCTION create_factor(p_name VARCHAR(255))
  RETURNS integer AS
$$
DECLARE v_insert_id INTEGER;
BEGIN
    ....
    RETURN v_insert_id AS id;
END;
$$ LANGUAGE plpgsql;
BEGIN;

\i create_factor.sql

DO $$
declare factorId integer;

select create_factor into factorId from    /* have tried selecting * as well */
create_factor(
    'my factor'::VARCHAR(255)
);

\x

select * from factors where name='my factor' and id=factorId;

\x

select k.key_name, v.value
from factors f
join factor_type_key_store k on k.factor_type_id = f.factor_type_id
join factor_key_value_store v on v.factor_type_key_store_id=k.id ;

END$$;

ROLLBACK;
我得到的错误如下:

psql:create\u factor\u test.sql:31:错误:类型名称无效 “将_factor.id创建为factored from


显然是指
select into
语句。我已将函数定义和脚本都调高了不少。不确定我缺少了什么。

您需要使用EXECUTE….into来分配变量,如下所示:

CREATE FUNCTION create_factor(p_name VARCHAR(255))
  RETURNS integer AS
$$
DECLARE v_insert_id INTEGER;
BEGIN
    ....
    RETURN v_insert_id AS id;
END;
$$ LANGUAGE plpgsql;
BEGIN;

\i create_factor.sql

DO $$
declare factorId integer;

select create_factor into factorId from    /* have tried selecting * as well */
create_factor(
    'my factor'::VARCHAR(255)
);

\x

select * from factors where name='my factor' and id=factorId;

\x

select k.key_name, v.value
from factors f
join factor_type_key_store k on k.factor_type_id = f.factor_type_id
join factor_key_value_store v on v.factor_type_key_store_id=k.id ;

END$$;

ROLLBACK;
见文件

函数返回1:

CREATE FUNCTION create_factor(   p_name VARCHAR(255)
                                    )
RETURNS integer AS $$
DECLARE v_insert_id INTEGER;
BEGIN
     v_insert_id:=1;
     RETURN v_insert_id AS id;
END;
$$ LANGUAGE plpgsql;
执行到将函数结果分配给变量:

DO $$
declare factorId integer;
BEGIN
EXECUTE 'select * from 
create_factor(
    ''my factor''::VARCHAR(255)
);' INTO factorId;     /* have tried selecting * as well */

RAISE NOTICE 'factorID = %', factorId;

EXECUTE 'WITH f AS (select * from factors where name=''my factor'' and id=' || factorId || ')
select k.key_name, v.value from f join factor_type_key_store k on k.factor_type_id = f.factor_type_id join factor_key_value_store v on v.factor_type_key_store_id=k.id;';

END$$;

变量名和列别名在函数外部不可见。可以使用
OUT
参数设置名称。对于像您这样返回标量值的简单函数,默认列名默认为函数名称

CREATE FUNCTION create_factor(p_name text)
  RETURNS integer AS
$func$
DECLARE
   v_insert_id INTEGER;
BEGIN
    ....
    RETURN v_insert_id;  -- AS id -- pointless noise
END;
$$ LANGUAGE plpgsql;
我假设您知道
DO
语句中的代码默认为PL/pgSQL,而不是普通SQL

您可以在plpgsql代码中声明一个变量,并在同一行上分配给它


但是您不能从
DO
语句中
返回任何内容。您需要另一个函数来完成此操作。可能是为您完成了此任务?不知道您想看到什么,我返回了示例中的整行。

这起作用,但随后我无法使
选择
工作。将它们放入
perform
语句中r以测试字符串的形式执行,但输出不会在psql控制台中呈现。这是posgres/psql的限制吗?@FrankConry DO语句仅返回void。DO是仅postgresql实现。它与SQL不兼容。要使此可重复并定义返回的输出,需要创建存储过程。请参阅doc:-“代码块被视为没有参数的函数体,返回void。它被一次解析和执行。“
EXECUTE
完全没有必要。这是一种误解。“显示所有内容都已正确插入”表示您的函数
create\u factor()
实际上插入了一行。你应该这么明确地说。另外,你可能想开始另一个问题,询问如何优化该行。看起来你所拥有的不是最佳的。记住要提到你的Postgres版本。