TYPE rct IS REF CURSOR RETURN stocktable%ROWTYPE;
FUNCTION pipe_stocks_parallel(
p_source_data IN rct,
p_limit_size IN PLS_INTEGER
) RETURN stockpivot_ntt
PIPELINED
PARALLEL_ENABLE (PARTITION p_source_data BY ANY);
最后想这样调用:
SELECT * FROM TABLE(
pipe_stocks_parallel(
CURSOR(SELECT /*+ PARALLEL(4) */ * FROM stocktable)));
如上面所示,想定义一个管道函数,用上并行。oracle是上面这样定义的,达梦支持么,语法是什么样的。
达梦支持类似Oracle的并行查询,首先需要通过PARALLEL_POLICY=1打开并行查询功能,然后通过MAX_PARALLEL_DEGREE和PARALLEL_THRD_NUM等参数来配置并行规则,详情参考:DM8管理员手册 => 查询优化 => 并行查询
我测试了一下,下面这个写法能编译通过。
我这里DM版本是:--03134284194-20240812-238838-20108 Pack9
同时,在目前官方文档里也没找到关于 PARALLEL_ENABLE 参数的说明,不知道为啥。。。
你测试下看看
CREATE OR REPLACE TYPE TP_RCT IS REF CURSOR RETURN T_INF%ROWTYPE;
CREATE OR REPLACE TYPE TP_RETURN IS TABLE OF VARCHAR2(32767);
CREATE OR REPLACE FUNCTION F_PIPETST(P_SOURDATA TP_RCT)
RETURN TP_RETURN PARALLEL_ENABLE PIPELINED
IS
V_RET VARCHAR2(32767);
BEGIN
LOOP
FETCH P_SOURDATA INTO V_RET;
EXIT WHEN P_SOURDATA%NOTFOUND;
PIPE ROW (V_RET);
END LOOP;
END;
SELECT *
FROM TABLE(F_PIPETST(CURSOR(SELECT T FROM T_INF LIMIT 10)));
达梦也支持的