我有一个 Postgresql 函数,它将获取一些输入(通过动态查询从这些参数中查询值)并返回该值(在这里它是唯一的,因此结果应该是一个整数)。
但是,我可以通过终端正常查询动态(只需从 id = 'abcd' 的表中选择值很容易)并获取值(例如:2)。但是当我执行该函数时,Executed dynamic query 的值总是返回 NULL。
我该如何解决这个问题?当我不知道为什么 EXECUTE "query"INTO 变量但变量返回 NULL 而 "query"在另一个终端运行时可以返回值时,我很累。
这是我的函数,我想要返回 _result_value(它总是 NULL - NOTICE: RESULT ABC: )。当我可以通过 psql 查询时。
SELECT uom_id FROM ps_quantity WHERE id = 15
uom_id
--------
1
(1 row)
CREATE OR REPLACE FUNCTION select_field(
selected_table text,
selected_field text,
field_type_sample anyelement,
where_clause text DEFAULT ''::text)
RETURNS anyelement AS
$BODY$DECLARE
-- Log
ME constant text := 'selected_field()';
-- Local variables
_qry text;
_result_value ALIAS FOR $0;
abc integer := 0;
BEGIN
RAISE NOTICE 'FUNCTION select_field';
--- _qry := 'SELECT ' || quote_ident(selected_field) ||
--- ' FROM ' || quote_ident(selected_table) ||
--- ' ' || where_clause;
_qry := ' SELECT uom_id FROM ps_quantity WHERE id = 15; ';
RAISE NOTICE 'WHAT IN HERE: query %', _qry;
-- return 1000;
-- RAISE DEBUG '%: %', ME, _qry;
RAISE NOTICE 'Preparing to query data';
-- EXECUTE _qry INTO _result_value;
--EXECUTE (' SELECT uom_id FROM ps_quantity WHERE id = ''15'' ') into abc;
EXECUTE ' SELECT uom_id FROM ps_quantity WHERE id = 15; ' into _result_value;
RAISE NOTICE 'RESULT ABC: %', _result_value;
RETURN _result_value;
END;$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
最佳答案
您的代码正在我的数据库上运行。也许您正在执行此函数的不同实例 - PostgreSQL 允许函数重载,并且一些神秘的错误基于更多同名函数。
我非常不喜欢这种功能 - 你试图隐藏 SQL - 如果这种技术是非常慢的应用程序,通常的结果是,但这就是你的生活:)。使用现代 PostgreSQL,您可以编写更具可读性的函数:
CREATE OR REPLACE FUNCTION foo(_field text, _table text, _id int,
resulttypedval anyelement, OUT _result anyelement)
AS $$
BEGIN
EXECUTE format('SELECT %I FROM %I'
' WHERE $1 IS NULL OR id = $1',
_field, _table)
INTO _result
USING _id;
RETURN;
END;
$$ LANGUAGE plpgsql;
关于sql - Postgresql 在函数内执行动态查询返回 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33417606/