2016-07-30 90 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'可以正常工作,謝謝 –