首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgres函数如何返回包含多个元素的数组

Postgres函数如何返回包含多个元素的数组
EN

Stack Overflow用户
提问于 2021-11-17 23:14:11
回答 1查看 37关注 0票数 0

我想创建一个函数来返回一个包含多个元素的数组,查询可以完美地工作,但我不能执行as函数,因为我总是收到错误,这是我的函数:

代码语言:javascript
复制
    CREATE OR REPLACE FUNCTION public.buscarexamen(visit anyelement)
 RETURNS anyelement
 LANGUAGE plpgsql
AS $function$
    BEGIN
return array(SELECT fn_folio_paciente(vi.clave_unilabor, vi.fecha, vi.consec) AS folio_paciente,
    vi.cve_visita, gp.nombre AS nombre_grupo, gp.cve_grupo,    
    --
    vp.cve_visita_prueba, p.cve_prueba, p.nombre AS nombre_prueba, me.nombre AS nombre_metodo,
    --
    gcf.visible AS visible_grupo,
    cf.cve_grupo_campo_formato, gc.nombre_grupo_campo AS grupo_parametro, cf.nombre AS nombre_parametro,
    cf.orden, cf.tipo_dato, cf.solo_lectura AS tipo_titulo,
    cf.cve_seccion_padre, cf.tiene_elementos_seccion, cf.observacion AS observacion_parametro,
    --
    pr.cve_prueba_resultado, pr.tipo_formato_prueba AS tipo_formato, pr.cantidad_resultado AS cantidad_parametro,
    pr.observaciones AS observacion_analista, pr.observaciones_prueba,
    CASE
      WHEN (TRIM(pr.observaciones) <> '') OR  (TRIM(pr.observaciones_prueba) <> '') THEN 1
      ELSE 0 END AS prueba_tiene_observacion,
    --
    rc.cve_resultado_campo, rc.resultado, rc.observacion AS observacion_resultado, rc.signo, rc.decimales, cf.xleft as cursiva,
    vr.valor_referencia_min, vr.valor_referencia_max, un.nombre AS nombre_unidad,
    cf.tiene_valores_referencia
FROM visitas vi
    JOIN corporativo.unilabor_unidades uu ON (vi.cve_unilabor_unidad = uu.cve_unilabor_unidad)
    JOIN visita_pruebas vp ON (vi.cve_visita = vp.cve_visita)
    JOIN prueba_resultados pr ON (vp.cve_visita_prueba = pr.cve_visita_prueba)
    JOIN prueba_metodo pm ON (pr.cve_prueba_metodo = pm.cve_prueba_metodo)
    JOIN metodos me ON (pm.cve_metodo = me.cve_metodo)
    JOIN pruebas p ON (pr.cve_prueba = p.cve_prueba)
    JOIN grupos gh ON (p.cve_grupo = gh.cve_grupo)
    JOIN grupos gp ON (gh.cve_grupo_padre = gp.cve_grupo)
    JOIN pacientes pa ON (vi.cve_paciente = pa.cve_paciente)
    JOIN contratos co ON (vi.cve_contrato = co.cve_contrato AND co.contrato_cerrado = 0)
    JOIN resultados_campos rc ON (pr.cve_prueba_resultado = rc.cve_prueba_resultado)
    JOIN unidades un ON (rc.cve_unidad = un.cve_unidad)
    LEFT JOIN valor_referencia_resultado vr ON (rc.cve_resultado_campo = vr.cve_resultado_campo)
    JOIN campos_formatos cf ON (rc.cve_campo_formato = cf.cve_campo_formato)
    JOIN grupos_campos_formato gcf ON (cf.cve_grupo_campo_formato = gcf.cve_grupo_campo_formato)
    JOIN grupos_campos gc ON (gcf.cve_grupo_campo = gc.cve_grupo_campo)
WHERE vi.cve_visita = 696787
    AND cf.solo_lectura = 0
ORDER BY p.orden_prueba, pr.cve_prueba_resultado, gcf.orden_grupo, rc.orden_local, vr.orden_valor);
    END;
$function$
;

我试着使用:

代码语言:javascript
复制
select * from buscarexamen(123123);

在SQL脚本上返回以下内容:

代码语言:javascript
复制
SQL Error [42601]: ERROR: subquery must return only one column Where: PL/pgSQL function buscarexamen(anyelement) line 3 at RETURN

真的,我花了很多时间寻找解决方案,但到目前为止还没有奏效。

任何帮助都是非常感谢的。

致以问候。

EN

回答 1

Stack Overflow用户

发布于 2021-11-18 21:07:24

你的目标听起来很奇怪。但是,您应该能够通过创建一个composite type your_composite_type来实现:

代码语言:javascript
复制
CREATE TYPE your_composite_type AS
( folio_paciente folio_paciente_data_type
, cve_visita cve_visita_data_type
, nombre_grupo nombre_grupo_data_type
, cve_grupo cve_grupo_data_type
, cve_visita_prueba cve_visita_prueba_data_type
, cve_prueba cve_prueba_data_type
, nombre_prueba nombre_prueba_data_type
, nombre_metodo nombre_metodo_data_type
, visible_grupo visible_grupo_data_type
, [...]
, nombre_unidad nombre_unidad_data_type
, tiene_valores_referencia tiene_valores_referencia_data_type
) ;

然后,函数public.buscarexamen()可以返回数据类型为your_composite_type的数组:

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION public.buscarexamen(visit anyelement)
 RETURNS your_composite_type[] -- instead of anyarray
 LANGUAGE plpgsql
AS $function$
BEGIN
return array(SELECT row( fn_folio_paciente(...)
                       , vi.cve_visita, gp.nombre, gp.cve_grupo
                       , [...]
                       , vr.valor_referencia_min, vr.valor_referencia_max, un.nombre 
                       , cf.tiene_valores_referencia
                       ) :: your_composite_type
               FROM visitas vi
               JOIN [...]
              WHERE [...]
              ORDER BY p.orden_prueba, pr.cve_prueba_resultado, gcf.orden_grupo, rc.orden_local, vr.orden_valor)
            ) ;
END;
$function$
;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70012742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档