2011-11-29 55 views
0

我得到的錯誤,當我用這個:動態SQL和Oracle過程進行現場

PROCEDURE GET_BY_CRIT(vchFilter varchar2(500), 
         intCantTotal OUT INT, 
         curResult OUT sys_refcursor) 
IS 
BEGIN 

    OPEN curResult FOR 
    'SELECT COLUMN1,COLUMN2 FROM SOME_TABLE WHERE '||vchFilter 

    EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM SOME_TABLE WHERE '||vchFilter 
    INTO intCantTotal 
END 

錯誤:

ORA-00936: missed expression 

但是當我由單獨執行每個句子它正確地將運行。

+0

如果您希望共享錯誤描述,對某人來說可能更容易。 – Zohaib

+0

感謝您的意見,我添加了錯誤代碼 – eicruzado

+0

嘗試添加分號到語句結束。 – Krzysztof

回答

1

你得到的錯誤似乎沒有道理。 Oracle應該拋出一個編譯錯誤,因爲函數的參數沒有長度。 vchFilter應宣佈爲VARCHAR2,而不是VARCHAR2(500)

此外,正如Lolo在註釋中指出的,PL/SQL塊中的語句需要以分號結尾。

PROCEDURE GET_BY_CRIT(vchFilter varchar2, 
         intCantTotal OUT integer, 
         curResult OUT sys_refcursor) 
IS 
BEGIN 
    OPEN curResult FOR 
    'SELECT COLUMN1,COLUMN2 FROM SOME_TABLE WHERE '||vchFilter; 

    EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM SOME_TABLE WHERE '||vchFilter 
    INTO intCantTotal; 
END; 

要知道還有沒有保證第二個SQL語句將看到第一個SQL語句做,除非你能保證SOME_TABLE沒有被任何其他會話在同一時間修改了相同的數,您'正在查詢它。我通常會很擔心需要運行查詢並執行一個單獨的計數 - 這通常表示一個更基本的問題。如果您需要COUNT與您正在運行的查詢保持一致,那麼您需要爲查詢添加一個分析COUNT,並讓調用者讀取該列。

PROCEDURE GET_BY_CRIT(vchFilter varchar2, 
         curResult OUT sys_refcursor) 
IS 
BEGIN 
    OPEN curResult FOR 
    'SELECT COLUMN1,COLUMN2, COUNT(*) OVER() cnt FROM SOME_TABLE WHERE '||vchFilter; 
END; 
+0

感謝您的回答。 – eicruzado