2013-02-27 65 views
0

我需要檢索遊標內(在Oracle中)的SELECT COUNT(*)語句中的行數。在Oracle中檢索Oracle中的select count(*)

下面的代碼應該解釋清楚:

PROCEDURE Save(CF_CURSOR OUT "VPA"."CF_#Runtime".CF_CURSOR_TYPE) AS 
    V_CF_CURSOR "VPA"."CF_#Runtime".CF_CURSOR_TYPE; 
    CF_ROWCOUNT NUMBER; 
    BEGIN 
     OPEN V_CF_CURSOR FOR 
     SELECT COUNT(*) INTO CF_ROWCOUNT FROM (
      SELECT * FROM "VPA"."Employee" -- returns 1 row 
     ) WHERE ROWNUM <= 1; 
     IF(CF_ROWCOUNT = 0) THEN 
      -- DO SOMETHING BUT NEVER GOES HERE 
     END IF; 
     COMMIT; 
    CF_CURSOR := V_CF_CURSOR; 
    END; 

這裏,CF_ROWCOUNT的值永遠不會設置。如果我刪除光標,一切都按預期工作。我試圖使用SQL%ROWCOUNT,但它也不起作用。 而且,我不能刪除光標...

在此先感謝!

+0

首先它不會工作,因爲你的語法不正確。其次,當你寫_「我試圖使用SQL%ROWCOUNT,但它不工作」_什麼不工作?你有錯誤信息嗎?你跑了什麼?最後,你只是想獲得一個計數,或者你是否也想在員工中使用這些數據? – Ben 2013-02-27 08:57:20

+0

在得到結果之前,你不應該在光標上做一個'FETCH'嗎? – 2013-02-27 09:18:21

回答

2

您是否嘗試打開遊標 - 執行COUNT(*),然後將其獲取到CF_ROWCOUNT變量中,而不是將其作爲INTO在ref-cursor語句中執行。

例如:

OPEN V_CF_CURSOR FOR SELECT COUNT(*) FROM "VPA"."Employee"; -- returns 1 row 
FETCH V_CF_CURSOR INTO CF_ROWCOUNT; 
+0

感謝您使用此解決方案。 主要的問題是這個代碼是自動生成的,我不能完全控制生成的內容。你的解決方案有效但我已經決定刪除​​遊標(並且工作正常),因爲我只需要檢索用select語句獲取的行數,而不是其他任何東西。 – Vincium 2013-03-01 08:52:18