Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在postgresql中有一组指令的函数中,查询没有结果数据的目标_Sql_Postgresql_Function - Fatal编程技术网

在postgresql中有一组指令的函数中,查询没有结果数据的目标

在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

我正在尝试自动化一组我一天执行几次的句子。为此,我想把它们放在一个postgres函数中,然后调用该函数来连续执行句子。如果一切正常,那么最后返回成功值。以下函数复制了我的想法和执行该函数时遇到的错误:

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。