postgresql - 如何在函数中将参数作为表发送?

问题描述 投票:1回答:2

我正在使用postgresql,我想知道如何在函数中将参数作为表发送。

我已经创建了type_detalle_ac类型:

CREATE TYPE public.type_detalle_ac AS
(
 id_componente integer,
 precio numeric(10,2),
 cantidad integer,
 sub_total numeric(10,2)
);

我在以下函数中使用它:

CREATE OR REPLACE FUNCTION public.sp_adm_artefacto(
v_serie character varying DEFAULT NULL::character varying,
v_tipo_artefacto integer DEFAULT NULL::integer,
v_modelo character varying DEFAULT NULL::character varying,
v_marca integer DEFAULT NULL::integer,
v_detalle type_detalle_ac DEFAULT NULL::type_detalle_ac,
v_usuario integer DEFAULT NULL::integer,
v_id_artefacto integer DEFAULT NULL::integer,
v_tipo_operacion character DEFAULT NULL::bpchar)
RETURNS void
LANGUAGE 'plpgsql'

COST 100
VOLATILE 
ROWS 0
AS $BODY$

DECLARE 

    VL_ID_ARTEFACTO INTEGER;
BEGIN
    IF V_TIPO_OPERACION = 'I' THEN

        INSERT INTO DETALLE_AC(ID_DETALLE_AC,ID_ARTEFACTO,ID_COMPONENTE,PRECIO,CANTIDAD,SUB_TOTAL,
                               USUARIO_CREACION,FECHA_CREACION)
        SELECT 1,1,ID_COMPONENTE,PRECIO,CANTIDAD,SUB_TOTAL,v_usuario,NOW() FROM V_DETALLE;

    END IF;

END;


$BODY$;

但是在调用函数时:

SELECT "sp_adm_artefacto"('1321321',1,'F-14',1,(1,10,5,50),1,NULL,'I')

我收到一个错误:

ERROR:  no existe la relación «v_detalle»
LINE 3: ...NTE,PRECIO,CANTIDAD,SUB_TOTAL,v_usuario,NOW() FROM V_DETALLE

谢谢

sql postgresql
2个回答
0
投票

FROM条款中有五个数据源:

  • 视图
  • 价值观(select * from (values(1,'a'),(2,'b')) as t(x,y);
  • 设置返回函数(link
  • 子查询

对于你的问题:Laurenz already answered about values way

另一种方式,更短,更一般,但可能更慢一点:

select * from (select variable.*) as t;

它将您的变量转换为类似于表的子查询。


1
投票

v_detalle不是表,因此您不能在查询的FROM子句中使用它。

你应该写

INSERT INTO detalle_ac (...)
VALUES (1, 1, v_detalle.id_componente, v_detalle.precio, ...);
© www.soinside.com 2019 - 2024. All rights reserved.