Postgresql 选择整数返回函数结果到变量postgres中
在Postgres中,我正在为我编写的函数(存储过程)编写测试脚本。函数返回和整数,即插入行的id。在测试脚本中,我希望将该id选择到一个变量中,并显示所有内容都已正确插入 函数如下所示: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; $
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版本。