PostgreSql 过程 return 查询没有结果数据的目的地
PostgreSql procedure return query has no destination for result data
我正在构建一个过程,在插入后由触发器调用,当我在其主体中使用 select 语句时发生错误。
当我不使用 select 获取值时,触发器调用此过程时没有错误:
BEGIN;
CREATE OR REPLACE FUNCTION calc_virtual()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
DECLARE
_virtual RECORD;
_value_calc DECIMAL;
_complet BOOLEAN;
BEGIN
_value_calc = 0
FOR _virtual IN SELECT value
FROM virtual
WHERE id = NEW.id
LOOP
_value_calc = _value_calc-(value * 1.5);
END LOOP;
INSERT INTO appointment (value) VALUES (_value_calc);
RETURN NEW;
END;
$function$;
COMMIT;
当我使用select取值时,触发器调用此过程时发生错误:
BEGIN;
CREATE OR REPLACE FUNCTION calc_virtual()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
DECLARE
_virtual RECORD;
_value_calc DECIMAL;
_complet BOOLEAN;
BEGIN
FOR _virtual IN SELECT value
FROM virtual
WHERE id = NEW.id
LOOP
_value_calc = 0;
_complet = TRUE;
SELECT value_active
FROM appointment_virtual
WHERE name = _virtual.name;
IF FOUND THEN
_value_calc = _value_calc-(value_active * 1.5);
ELSE
_complet = False;
END IF;
END LOOP;
IF _complet THEN
INSERT INTO appointment (value) VALUES (_value_calc);
END IF;
RETURN NEW;
END;
$function$;
COMMIT;
感谢您的帮助!
您必须在 PL/pgSQL 中使用 SELECT ... INTO
。不会神奇地创建变量 value_active
。
SELECT value_active INTO _active
FROM appointment_virtual
WHERE name = _virtual.name;
IF FOUND THEN
_value_calc = _value_calc-(_active * 1.5);
...
您必须在 DECLARE
部分声明 _active
。
我正在构建一个过程,在插入后由触发器调用,当我在其主体中使用 select 语句时发生错误。
当我不使用 select 获取值时,触发器调用此过程时没有错误:
BEGIN;
CREATE OR REPLACE FUNCTION calc_virtual()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
DECLARE
_virtual RECORD;
_value_calc DECIMAL;
_complet BOOLEAN;
BEGIN
_value_calc = 0
FOR _virtual IN SELECT value
FROM virtual
WHERE id = NEW.id
LOOP
_value_calc = _value_calc-(value * 1.5);
END LOOP;
INSERT INTO appointment (value) VALUES (_value_calc);
RETURN NEW;
END;
$function$;
COMMIT;
当我使用select取值时,触发器调用此过程时发生错误:
BEGIN;
CREATE OR REPLACE FUNCTION calc_virtual()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
DECLARE
_virtual RECORD;
_value_calc DECIMAL;
_complet BOOLEAN;
BEGIN
FOR _virtual IN SELECT value
FROM virtual
WHERE id = NEW.id
LOOP
_value_calc = 0;
_complet = TRUE;
SELECT value_active
FROM appointment_virtual
WHERE name = _virtual.name;
IF FOUND THEN
_value_calc = _value_calc-(value_active * 1.5);
ELSE
_complet = False;
END IF;
END LOOP;
IF _complet THEN
INSERT INTO appointment (value) VALUES (_value_calc);
END IF;
RETURN NEW;
END;
$function$;
COMMIT;
感谢您的帮助!
您必须在 PL/pgSQL 中使用 SELECT ... INTO
。不会神奇地创建变量 value_active
。
SELECT value_active INTO _active
FROM appointment_virtual
WHERE name = _virtual.name;
IF FOUND THEN
_value_calc = _value_calc-(_active * 1.5);
...
您必须在 DECLARE
部分声明 _active
。