2013-04-22 38 views
0

我想根據從gui中選擇的標準動態構建查詢。這裏是我的Oracle包,函數返回varchar2給出錯誤結果

CREATE OR REPLACE PACKAGE TestPkg 
AS 
    g_lastnamelist VARCHAR2(50); 

    FUNCTION getLastName return VARCHAR2; 
    FUNCTION buildQuery(p_lastnamelist VARCHAR2); 
END; 

CREATE OR REPLACE PACKAGE BODY TestPkg 
AS 

    FUNCTION getLastName return VARCHAR2 
    IS 
    BEGIN 
     RETURN replace(g_lastnamelist, '''', ''); 
    END; 

    FUNCTION buildQuery(p_lastnamelist VARCHAR2); 
    IS 
     m_query varchar2(1000); 
    BEGIN 
     g_lastnamelist := p_lastnamelist; 
     m_query := 'SELECT * FROM emp WHERE last_name IN(TestPkg.getLastName)'; 
    END; 
END; 

這裏如果我使用'SELECT * FROM emp WHERE last_name IN('||p_lastnamelist||')';然後返回我正確的記錄,但如果我使用'SELECT * FROM emp WHERE last_name IN(TestPkg.getLastName)';這個樣子,那麼它失敗。什麼原因。

在此先感謝。

+0

好綽號! – 2013-04-22 12:39:00

+0

@EgorSkriptunoff謝謝。 :) – eatSleepCode 2013-04-22 13:14:37

回答

0

我假設你傳遞逗號分隔的引用值列表,例如p_lastnamelist'Smith','Jones',因爲這是您的第一個查詢的唯一方法,並且解釋了replace調用。 (如果你顯示輸入,輸出和你得到的任何錯誤,它會有所幫助,所以我們不必猜測和假設)。當查詢中使用它們時,它們看起來會有很大的不同。第一招:

​​

變爲:

SELECT * FROM emp WHERE last_name IN('Smith','Jones') 

...這將匹配和這兩個姓氏的任何記錄。但第二個:

'SELECT * FROM emp WHERE last_name IN(TestPkg.getLastName)' 

變,你已經從剝去引號後:

SELECT * FROM emp WHERE last_name IN('Smith,Jones') 

...這是尋找一個值,並且將只匹配,如果你有一個姓氏Smith,Jones的記錄,這是不可能的。無論返回的是TestPkg.getLastName都將被視爲單個字符串值。它必須是函數返回varchar2。但是,如果您按照Egor的建議使用綁定變量,情況也是如此。

+0

是的,我明白了這個問題,現在我從getLastName函數返回StringList,並使用查詢SELECT COLUMN_VALUE FROM TABLE(TestPkg.getLastName)。 – eatSleepCode 2013-04-22 13:18:23

+0

@eatSleepCode - 很好,我會停止尋找一個如何做到這一點的例子* 8-) – 2013-04-22 13:19:41

+0

感謝它的工作現在很好。 :) – eatSleepCode 2013-04-22 13:20:18