在postgresql中有一组指令的函数中,查询没有结果数据的目标
我正在尝试自动化一组我一天执行几次的句子。为此,我想把它们放在一个postgres函数中,然后调用该函数来连续执行句子。如果一切正常,那么最后返回成功值。以下函数复制了我的想法和执行该函数时遇到的错误:在postgresql中有一组指令的函数中,查询没有结果数据的目标,sql,postgresql,function,Sql,Postgresql,Function,我正在尝试自动化一组我一天执行几次的句子。为此,我想把它们放在一个postgres函数中,然后调用该函数来连续执行句子。如果一切正常,那么最后返回成功值。以下函数复制了我的想法和执行该函数时遇到的错误: CREATE OR REPLACE FUNCTION createTable() RETURNS int AS $$ BEGIN DROP TABLE IF EXISTS MY_TABLE; CREATE TABLE MY_TABLE
CREATE OR REPLACE FUNCTION createTable() RETURNS int AS $$
BEGIN
DROP TABLE IF EXISTS MY_TABLE;
CREATE TABLE MY_TABLE
(
ID integer
)
WITH (
OIDS=FALSE
);
insert into MY_TABLE values(1);
select * from MY_TABLE;
RETURN 'SUCCESS';
END;
$$ LANGUAGE plpgsql;
调用:
select * from createTable();
由于我对postgresql一无所知,如果一切运行都没有错误,我希望获得成功值作为回报。但是返回的消息让我感到困惑,它与任何其他编程语言中的函数不一样吗?执行函数时,我收到以下消息:
查询没有结果数据的目标提示:如果要
放弃选择的结果,改用执行
查询没有结果数据的目标提示:如果要放弃SELECT的结果,请改用“执行”
出现此错误是因为未将结果分配给函数中的任何变量。在函数中,通常会执行以下操作:
select * into var1 from MY_TABLE;
因此,您的函数将如下所示:
CREATE OR REPLACE FUNCTION createTable() RETURNS int AS $$
DECLARE
var1 my_table%ROWTYPE;
BEGIN
DROP TABLE IF EXISTS MY_TABLE;
CREATE TABLE MY_TABLE
(
ID integer
)
WITH (
OIDS=FALSE
);
insert into MY_TABLE values(1);
select * into var1 from MY_TABLE;
<do something with var1>
RETURN 'SUCCESS';
END;
$$ LANGUAGE plpgsql;
否则,如果你不把结果放入变量中,那么你很可能希望得到一些副作用,比如推进一个序列或以某种方式触发一个触发器。在这种情况下,plpgsql希望您使用PERFORM而不是SELECT
另外,顺便说一句,函数返回int,但在定义的底部返回“SUCCESS”。SUCCESS是一个文本类型,而不是int,所以一旦您通过了第一条错误消息,您最终将得到这个错误-请确保根据需要更改它 为什么希望SELECT会抛出错误?忽略它,您不需要它-并且您没有使用它的结果,正如消息所告诉您的。感谢Bergi,我理解了错误的原因,解释帮助我在实际代码中找到了错误,在实际代码中,我使用了多个select和INTO指令,但我使用了无目标select来初始化序列,将SELECT更改为按消息建议执行,我可以执行该函数而不会带来任何不便。如何从我的_表中选择*初始化序列?代码不属于我,我只是尝试创建一个调用所有语句的函数,从某处调用该函数并使其自动化。发送我推断的错误的select根据另一个表的值初始化序列,语句是:select setval‘seq_temporal’,select min ID*-1+1 from OTHER_table;用户执行的解决方案:执行setval‘seq_temporal’,从其他表中选择min ID*-1+1;啊,是的,作为表演来执行是有道理的。您在问题中发布的SELECT没有。如果变量未在任何地方使用,则将其放入变量中有什么意义?这就是我们正在尝试解决的问题。其他人提到你要么把它拿出来,要么用它做点什么。如果您试图返回它,也许可以返回它而不是字符串SUCCESS。我只是想帮助你理解这个错误并找出克服它的方法。您需要进行必要的更改以满足您的需求Hanks richyen,事实上,由于不知道应用于函数的pgsql规则,我主要无法理解这一点。我想我可以在一个函数中执行在IDE上执行的任何语句。现在我明白了,任何SQL查询都必须分配给变量,就像在其他语言中一样如果不指定变量,就不能有文字。对于不分配给变量的查询,我必须使用PERFORM。