回答

收藏

循环功能无法正常工作

技术问答 技术问答 213 人阅读 | 0 人回复 | 2023-09-12

使用PostgreSQL 9.0.45 j5 T5 F. ]9 }9 D( O
以下是我手表的非常相似的结构:3 g5 \' T, X8 f$ g
CREATE TABLE departamento(  id bigserial NOT NULL, master_fk bigint, nome character varying(100) NOT NULL  CONSTRAINT departamento_pkey PRIMARY KEY (id), CONSTRAINT departamento_master_fk_fkey FOREIGN KEY (master_fk)      REFERENCES departamento (id) MATCH SIMPLE      ON UPDATE NO ACTION ON DELETE NO ACTION)我创建的函数:
2 K7 h; ]8 [3 e$ ~7 ?- ]; |0 J7 w6 pCREATE OR REPLACE FUNCTION fn_retornar_dptos_ate_raiz(bigint[])  RETURNS bigint[] AS$BODY$DECLARE   lista_ini_dptos ALIAS FOR $1;   dp_row departamento%ROWTYPE;   dpto bigint;   retorno_dptos bigint[];BEGIN   BEGIN      PERFORM id FROM tbl_temp_dptos;      EXCEPTION          WHEN undefined_table THEN            EXECUTE 'CREATE TEMPORARY TABLE tbl_temp_dptos (id bigint NOT NULL) ON COMMIT DELETE ROWS';   END;   FOR i IN array_lower(lista_ini_dptos,1)..array_upper(lista_ini_dptos,1) LOOP      SELECT id,master_fk INTO dp_row FROM departamento WHERE id=lista_ini_dptos<i>;      IF dp_row.id IS NOT NULL THEN         EXECUTE 'INSERT INTO tbl_temp_dptos VALUES ($1)' USING dp_row.id;         WHILE dp_row.master_fk IS NOT NULL LOOP            dpto := dp_row.master_fk;            SELECT id,master_fk INTO dp_row FROM departamento WHERE id=lista_ini_dptos<i>;            EXECUTE 'INSERT INTO tbl_temp_dptos VALUES ($1)' USING dp_row.id;         END LOOP;      END IF;   END LOOP;   RETURN ARRAY(SELECT id FROM tbl_temp_dptos);END;$BODY$  LANGUAGE plpgsql VOLATILE任何关于我可以翻译的名字的问题..  l1 |6 q' I* x3 g( q1 ~3 V6 j/ w
函数的概念是什么?我首先检查临时表是否存在(执行),并在异常情况下创建临时表。
' S! q" G/ g$ `  n- Z: w然后,我在数组中获得每个元素,并使用它来获得部门id和master_fk。若搜索成功(检查)id是否为null,即使没必要),我也会id插入临时表,开始新的循环。- ]( O% {5 p4 f7 `! e
第二个循环旨在获得该部门的所有父级(即选择一个部门并将其插入临时表)。% U8 R( i) g; R' C
当第二个循环结束时,返回到第一个循环。当它结束时,我回来了bigint []引用临时表中记录的内容。
8 b$ s( w3 u, B9 I* U我的问题是函数返回了我提供的同一列表。我做错了什么?1 x! [+ \/ B1 R& P8 I. J9 B2 j- W  H
                                                               
4 B6 b8 l. f" l    解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则