我有以下问题: 我正在尝试将数据插入表中,但是我的触发器阻止了我执行插入操作。我的触发器是在输入给定的'year'<'2000'时将codigolle插入到日志表中,但是遇到以下错误:
”错误:查询没有结果数据的目的地 提示:如果要放弃SELECT的结果,请改用PERFORM。 上下文:PL / pgSQL函数funcaotriggerxx()在SQL语句“
的第5行TRIGGER
const spawn = require('child_process').exec;
const doEcho = spawn('echo "hello world"');
doEcho.stdout.on('data', (data) => {
if (data.includes('world')) {
// run some other commands
}
});
步骤
CREATE FUNCTION funcaoTriggerXX() RETURNS trigger AS $valor$
DECLARE
cod INT;
BEGIN
SELECT codigolivro
FROM edicao
WHERE ano < '2000';
cod = codigolivro;
INSERT INTO log (codigolivro) VALUES (cod);
RETURN cod;
END;
$valor$ LANGUAGE plpgsql;
CREATE TRIGGER codigoLivros AFTER INSERT ON edicao
EXECUTE PROCEDURE funcaoTriggerXX();
选择
CREATE OR REPLACE FUNCTION seculoxx()
RETURNS integer AS $total2$
declare
total2 integer;
BEGIN
SELECT count(*) into total2
FROM edicao
WHERE ano < 2000;
RETURN total2;
END;
$total2$ LANGUAGE plpgsql;
插入
SELECT seculoxx();
表的结构也很简单: edicao
日志
有人可以帮我吗?
答案 0 :(得分:2)
首先,您的触发函数说它实际上返回trigger
时返回INTEGER
(NULL / OLD / NEW)。然后如错误所示,如果没有目标,就无法在plpgsql函数中执行SELECT
。换句话说,您需要将SELECT
语句的结果分配给变量。
SELECT codigolivro
INTO cod
FROM edicao
WHERE ano < '2000';
您的seculoxx()
函数很好,但不需要中间变量:
RETURN count(*)
FROM edicao
WHERE ano < 2000;
答案 1 :(得分:0)
看看您在funcaoTriggerXX
和seculoxx
中选择的查询有何不同。如果要存储来自选择查询的值,则需要SELECT column_name INTO variable_name
。如果您不想保存结果,则需要使用PERFORM
。例如。 PERFORM SELECT ...
。
您的语言与将执行的代码之间也存在差异。那就是你说的:
我的触发器是在输入给定的'year'<'2000'时将codigolle插入到日志表中
我认为您的意思是刚刚插入的行的codigolivro
。但是,按现状。如果year < 2000
表中的 any 行满足该条件,则该触发器实际上将在edicao
处插入一个随机行。
相反,您可以使用NEW
特殊变量来获取刚刚插入的行,并且可以使用WHEN
的{{1}}子句来控制触发触发器的时间。
由于您只关心刚刚插入的行(不是整个表中的所有行),因此可以使用CREATE TRIGGER
特殊变量。
NEW