使用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