我想在Postgres函数中传递一个表名作为参数.我试过这段代码:
CREATE OR REPLACE FUNCTION some_f(param character varying) RETURNS integer
AS $$
BEGIN
IF EXISTS (select * from quote_ident($1) where quote_ident($1).id=1) THEN
return 1;
END IF;
return 0;
END;
$$ LANGUAGE plpgsql;
select some_f('table_name');
Run Code Online (Sandbox Code Playgroud)
我得到了这个:
ERROR: syntax error at or near "."
LINE 4: ...elect * from quote_ident($1) where quote_ident($1).id=1)...
^
********** Error **********
ERROR: syntax error at or near "."
Run Code Online (Sandbox Code Playgroud)
以下是更改为此时出现的错误select * from quote_ident($1) tab where tab.id=1:
ERROR: column tab.id does not exist
LINE 1: ...T EXISTS …Run Code Online (Sandbox Code Playgroud) 我写了一个函数,输出一个SELECT以文本形式组成的PostgreSQL 查询.现在我不想再输出文本,但实际上SELECT对数据库运行生成的语句并返回结果 - 就像查询本身一样.
CREATE OR REPLACE FUNCTION data_of(integer)
RETURNS text AS
$BODY$
DECLARE
sensors varchar(100); -- holds list of column names
type varchar(100); -- holds name of table
result text; -- holds SQL query
-- declare more variables
BEGIN
-- do some crazy stuff
result := 'SELECT\r\nDatahora,' || sensors ||
'\r\n\r\nFROM\r\n' || type ||
'\r\n\r\nWHERE\r\id=' || $1 ||'\r\n\r\nORDER BY Datahora;';
RETURN result;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION data_of(integer) OWNER TO postgres;
Run Code Online (Sandbox Code Playgroud)
sensors …
我想测试Postgres函数的结果(不可能改变函数).
该函数接收REFCURSOR和其他几个参数作为参数,并返回相同的RECURSOR.
get_function_that_returns_cursor(ret, 4100, 'SOMETHING', 123465)
Run Code Online (Sandbox Code Playgroud)
现在我想在Postgres中创建一个小测试来获得这个FUNCTION的结果.像下面的代码(这是我的方法,但它不起作用):
DO $$ DECLARE
ret REFCURSOR;
row_to_read table_it_will_return%ROWTYPE ;
BEGIN
PERFORM get_function_that_returns_cursor(ret, 4100, 'SOMETHING', 123465);
-- OR SELECT get_function_that_returns_cursor(ret, 4100, 'SOMETHING', 123465) INTO ret
FOR row_to_read IN SELECT * FROM ret LOOP
-- (...)
RAISE NOTICE 'Row read...';
END LOOP;
CLOSE ret;
END $$;
Run Code Online (Sandbox Code Playgroud)
有关如何使其工作的任何建议?一种通用解决方案,可用于测试此类函数(获取Cursor并返回Cursor?
如果我们不知道返回的行类型怎么能这样做呢?
在PostgresQL中调试此类事物的最佳方法是什么?
我的 PostgreSQL 9.2.8 数据库中有这三个表的表结构:
我试图弄清楚如何选择orders一行并在同一行上添加来自order_points和 的一些列points。
您可以将该points表想象为一个人可以购买的所有物品的列表,其中 内部知道abbrev它并且它的成本为amount。
该order_points表是购买的每件商品,因此points.id == order_points.points_id,amount类似于说他们购买了 5 个糖果棒。它通过以下方式链接到订单order_points.order_id == orders.id
当我选择一个订单时,我希望为每个abbrev存在的以及amount来自order_points表的列都有一列。
所以如果points有这个:
id | name | abbrev | amount
--------------------------------
1 | Snickers | sn | 1.34
2 | Milky Way | mw | 1.73
3 | Coffee | cf | 10.12
Run Code Online (Sandbox Code Playgroud)
并order_points有这个:
id | order_id …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用PL/pgSQL(PostgreSQL 9.3)实现一个函数,该函数返回一个与参数中的输入表具有相同结构的表.基本上,我想更新一个表,并使用plpgsql返回更新表的副本.我在SO周围搜索并发现了几个相关的问题(例如,返回动态表,其中包含来自PL/pgSQL函数的未知列和表名作为PostgreSQL函数参数),这导致了以下最小测试示例:
CREATE OR REPLACE FUNCTION change_val(_lookup_tbl regclass)
RETURNS _lookup_tbl%rowtype AS --problem line
$func$
BEGIN
RETURN QUERY EXECUTE format('UPDATE %s SET val = 2 RETURNING * ; ', _lookup_tbl);
END
$func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
但我不能拿过去给正确的返回类型TABLE或SETOF RECORD在problem line.根据这个答案:
SQL要求在调用时知道返回类型
但我认为返回类型(我打算从输入表类型中借用)是已知的.有人可以帮助解释是否可以修复上述PL/pgSQL函数的签名?
注意,我需要参数化输入表并返回该表的更新.欢迎替代方案.
postgresql ×5
plpgsql ×4
dynamic-sql ×3
sql ×3
cursor ×1
database ×1
function ×1
identifier ×1
polymorphism ×1