小编RGP*_*GPT的帖子

测试使用和返回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
查看次数

Postgres按周划分

我可以想象按日期对表进行分区(特别是对日志进行分区)是一种广泛使用的方法,但是我找不到解决我问题的好方法。

我想按周创建一个表分区(记录数量大到每月都可以)。之所以要每周一次,是因为我需要算法的数据,该算法将在过程中查找日期。

我的问题是我希望它考虑周并使用“典型”方法来创建分区,所以我必须手动创建它。这样的事情。

    CREATE TABLE measurement_y2013w01 (
CHECK ( logdate >= DATE '2013-01-07' AND logdate < DATE '2013-01-14' ) 
    ) INHERITS (measurement);

    CREATE TABLE measurement_y2006w02 (
CHECK ( logdate >= DATE '2013-01-14' AND logdate < DATE '2013-01-21' ) 
    ) INHERITS (measurement);

... 
Run Code Online (Sandbox Code Playgroud)

但是我希望它能自动完成。我不想为每个星期一个一个地创建分区。

我给命名的规则是yYYYYwWW来命名分区或开始datadYYYYMMDD。

我想在插入时使用类似以下的方法检查分区:

 SELECT
    nmsp_parent.nspname AS parent_schema,
    parent.relname      AS parent,
    nmsp_child.nspname  AS child,
    child.relname       AS child_schema
FROM pg_inherits
    JOIN pg_class parent        ON pg_inherits.inhparent = parent.oid
    JOIN pg_class child         ON pg_inherits.inhrelid   = child.oid
    JOIN pg_namespace nmsp_parent   ON nmsp_parent.oid  = …
Run Code Online (Sandbox Code Playgroud)

sql postgresql partitioning week-number

6
推荐指数
2
解决办法
3661
查看次数

PostgreSQL:bit to smallint

据我所知,在PostgreSQL中你无法从十六进制或位转换为smallint或其他方式.

要从int2转换为bit16,可以执行以下操作:

select ((((-32768)::int2)::int4)::bit(32)<<16)::bit(16)
    Result: 1000000000000000
Run Code Online (Sandbox Code Playgroud)

但是我们怎么能这样做呢?

我有一个int2标志,我想设置最高位.但是因为我不能在int2中使用我的位操作,所以我必须先将它转换为int4,所以我可以这样做.像这样的东西:

SELECT flags, 
       (flags | x'8000'::integer) myInt2Result 
  FROM MyTable;
Run Code Online (Sandbox Code Playgroud)

然后我会使用myInt2Result来调用其他进程.为了让它更容易尝试,让我们想象标志是一个值为2560的smallint:

SELECT 2560::int2, (2560::int2 | x'8000'::integer)
    RESULT: 35328        
Run Code Online (Sandbox Code Playgroud)

由于这大于+32767并且我在PostgreSQL中没有unsigned smallint,我无法将其直接转换为int2(smallint超出范围).

另外:在PostgreSQL中我们做不到

x'8000'::int2 (it would be really handy) 
OR
x'8000'::integer::int2 (smallint out of range) 
Run Code Online (Sandbox Code Playgroud)

有没有办法在PostgreSQL中执行此操作,或者我必须自己将int4转换为int2(考虑位)?

sql postgresql bit-manipulation 16-bit

3
推荐指数
1
解决办法
2184
查看次数