相关疑难解决方法(0)

表名作为PostgreSQL函数参数

我想在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)

postgresql function dynamic-sql plpgsql identifier

69
推荐指数
4
解决办法
7万
查看次数

重构PL/pgSQL函数以返回各种SELECT查询的输出

我写了一个函数,输出一个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 …

sql database postgresql dynamic-sql plpgsql

32
推荐指数
1
解决办法
2万
查看次数

测试使用和返回refcursor的PostgreSQL函数

我想测试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中调试此类事物的最佳方法是什么?

sql postgresql plpgsql cursor

7
推荐指数
1
解决办法
8869
查看次数

如何在 PostgreSQL 的 SELECT 语句中使用行值作为列?

我的 PostgreSQL 9.2.8 数据库中有这三个表的表结构:

在此处输入图片说明

我试图弄清楚如何选择orders一行并在同一行上添加来自order_points和 的一些列points

您可以将该points表想象为一个人可以购买的所有物品的列表,其中 内部知道abbrev它并且它的成本为amount

order_points表是购买的每件商品,因此points.id == order_points.points_idamount类似于说他们购买了 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)

sql postgresql postgresql-9.2

4
推荐指数
1
解决办法
2572
查看次数

如何在PL/pgSQL中按行类型返回表

我正在尝试使用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)

但我不能拿过去给正确的返回类型TABLESETOF RECORDproblem line.根据这个答案:

SQL要求在调用时知道返回类型

但我认为返回类型(我打算从输入表类型中借用)是已知的.有人可以帮助解释是否可以修复上述PL/pgSQL函数的签名?

注意,我需要参数化输入表并返回该表的更新.欢迎替代方案.

postgresql polymorphism dynamic-sql plpgsql

2
推荐指数
1
解决办法
1525
查看次数