我想测试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中调试此类事物的最佳方法是什么?
我可以想象按日期对表进行分区(特别是对日志进行分区)是一种广泛使用的方法,但是我找不到解决我问题的好方法。
我想按周创建一个表分区(记录数量大到每月都可以)。之所以要每周一次,是因为我需要算法的数据,该算法将在过程中查找日期。
我的问题是我希望它考虑周并使用“典型”方法来创建分区,所以我必须手动创建它。这样的事情。
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) 据我所知,在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(考虑位)?