2016-07-30 105 views
0

我在SQL Postgres的查询,以获得数Postgres的PERFORM COUNT(*)总是返回0

SELECT COUNT(*) AS count_variable FROM user WHERE something=something; 

当我执行,它返回计数。然后,按规定被要求Postgres的功能。当这里面查询我用内部功能此查询,Postgres的回答

ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT: PL/pgSQL function myfuntion(integer,integer) line 11 at SQL statement

我搜索了这个错误,结果发现,出现这种情况,如果查询同时使用SELECT返回null,但当直接在命令行上执行时,我已经获得了价值。

还有一些帖子告诉丢弃它,我们应该使用PERFORM而不是SELECT。所以我在同一个函数中的新查询是

PERFORM COUNT(*) AS count_variable FROM user WHERE something=something; 

此函数开始工作后,但count_variable总是为零。我在PERFORM查询后使用raise检查它。

raise notice 'count_variable: %', count_variable; 

count_variable被声明为

DECLARE 
    count_variable int; 
    ... 
BEGIN 
    count_variable := 0; 

有什么我失踪或者做错了,或COUNT()函数内部功能不工作。如果count()不可用,那么它们是用于计数行的任何替代方法。在某处我看到@@ROWCOUNT也是一个获取行数的变量,但它给出错误。

帮助将不胜感激。

+0

可能你和MSSQL一起工作 - PostgreSQL中的存储过程有很大不同 - 更像是Oracle--请先阅读文档 - 它只是几页https://www.postgresql.org/docs/current/ static/plpgsql.html –

+0

感谢您的信息先生。问题发现在接受答案给出的解释。根据需要,我使用'AS'而不是'INTO'来将其放入变量中。 –

回答

2

你不想丢弃select的结果,所以执行是错误的选择。要存储在变量中查询的结果,所以你需要一个INTO条款:


DECLARE 
    count_variable int; 
    ... 
BEGIN 
    SELECT COUNT(*) INTO count_variable 
    FROM "user" 
    WHERE something=something; 
    ... 

只是因为你给该列的别名是相同的名称作为一个变量,并不意味着结果是存储在该变量中。列名与变量没有关系。

这一切都在手册中详细解释。特别是章节Executing a Query with a Single-row Result

+0

将'AS'更改为'INTO'可以正常工作,谢谢 –