更新时间:2025-08-19 GMT+08:00
自定义类型
存储过程中的自定义类型变量不支持下推,需要在下推场景使用时,用变量承接自定义类型的元素。
示例如下:
gaussdb=# CREATE SCHEMA best_practices_for_procedure; CREATE SCHEMA gaussdb=# SET CURRENT_SCHEMA=best_practices_for_procedure; SET gaussdb=# gaussdb=# CREATE TABLE tb1(c1 INT, c2 VARCHAR(20)); NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'c1' as the distribution column by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. CREATE TABLE gaussdb=# INSERT INTO tb1 VALUES(1, 'a'),(2,'b'), (3, 'c'); INSERT 0 3 gaussdb=# -- SELECT语句下推执行 gaussdb=# EXPLAIN SELECT c1 FROM tb1 WHERE c2 = 'a'; QUERY PLAN -------------------------------------------------- Data Node Scan (cost=0.00..0.00 rows=0 width=0) Node/s: All datanodes (2 rows) gaussdb=# -- 变量承接自定义类型元素 gaussdb=# CREATE OR REPLACE PROCEDURE proc1() AS gaussdb$# TYPE ta IS VARRAY(10) OF VARCHAR(30); gaussdb$# v ta := ta(); gaussdb$# b VARCHAR; gaussdb$# a INT; gaussdb$# BEGIN gaussdb$# v(1) := 'a'; gaussdb$# v(2) := 'b'; gaussdb$# FOR i IN 1..v.count LOOP gaussdb$# b := v(i); -- 变量承接自定义类型的元素 gaussdb$# SELECT c1 INTO a FROM tb1 WHERE c2 = b; -- 执行成功 gaussdb$# END LOOP; gaussdb$# END; gaussdb$# / CREATE PROCEDURE gaussdb=# CALL proc1(); proc1 ------- (1 row) gaussdb=# gaussdb=# -- 自定义类型下推场景 gaussdb=# CREATE OR REPLACE PROCEDURE proc2() AS gaussdb$# TYPE ta IS VARRAY(10) OF VARCHAR(30); gaussdb$# v ta := ta(); gaussdb$# b VARCHAR; gaussdb$# a INT; gaussdb$# BEGIN gaussdb$# v(1) := 'a'; gaussdb$# v(2) := 'b'; gaussdb$# FOR i IN 1..v.count LOOP gaussdb$# SELECT c1 INTO a FROM tb1 WHERE c2 = v(1); -- 自定义类型不支持下推,执行报错 gaussdb$# END LOOP; gaussdb$# END; gaussdb$# / CREATE PROCEDURE gaussdb=# CALL proc2(); ERROR: Function v(integer) does not exist. LINE 1: SELECT c1 FROM tb1 WHERE c2 = v(1) ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. QUERY: SELECT c1 FROM tb1 WHERE c2 = v(1) CONTEXT: PL/pgSQL function proc2() line 10 at SQL statement gaussdb=# gaussdb=# DROP SCHEMA best_practices_for_procedure cascade; NOTICE: drop cascades to 3 other objects DETAIL: drop cascades to table tb1 drop cascades to function proc1() drop cascades to function proc2() DROP SCHEMA
父主题: 语句功能