2017-07-28 56 views
-1

我正嘗試使用動態SQL查詢執行存儲過程。我終於得到它編譯,但它返回以下錯誤:在Oracle中使用帶有動態SQL的REF CURSOR時缺少表達式

ORA-00936 - Missing expression

我哪裏出錯了?

包裝規格:

TYPE T_CURSOR IS REF CURSOR; 

PROCEDURE RADNIK 
(
    P_ID_OC_NAJVISA IN RADNIK.ID_NAJVISA_OC%TYPE, --1 
    P_IME_PREZIME IN RADNIK.IME%TYPE, --2 
    REF_TABELA IN VARCHAR2, --3 
    P_ID_OPERATER IN Z_TRANSAKCIJA.ID_OPERATER%TYPE, 

    P_CURSOR OUT T_CURSOR 
); 

包體:

PROCEDURE RADNIK 
(
    P_ID_OC_NAJVISA IN RADNIK.ID_NAJVISA_OC%TYPE, 
    P_IME_PREZIME IN RADNIK.IME%TYPE, 
    REF_TABELA IN VARCHAR2, 
    P_ID_OPERATER IN Z_TRANSAKCIJA.ID_OPERATER%TYPE, 

    P_CURSOR OUT T_CURSOR 
) 
IS 
    radnikRed RADNIK%ROWTYPE; 
BEGIN 

    OPEN P_CURSOR FOR 
    'SELECT * 
    FROM (SELECT DISTINCT 
    R.ID_RADNIK, 
    R.PREZIME || '' ('' || R.IME_RODITELJA || '') '' || R.IME || '', '' || R.LICNI_BROJ 
    IME_PREZIME 
    FROM RADNIK R, 
    (
    SELECT DISTINCT RT.ID_RADNIK FROM '||REF_TABELA||' RT WHERE RT.ID_OC_NAJVISA='||P_ID_OC_NAJVISA||') RT 
    WHERE 
    (R.ID_NAJVISA_OC = '||P_ID_OC_NAJVISA||' and R.STORNO=''N'') OR R.ID_RADNIK=RT.ID_RADNIK) 
    WHERE IME_PREZIME LIKE ''%'' || '||P_IME_PREZIME||' || ''%'' 
    OR '||P_IME_PREZIME||' IS NULL'; 
    LOOP 
    FETCH P_CURSOR INTO radnikRed; 
END LOOP; 
CLOSE P_CURSOR; 
END RADNIK; 

回答

1

這是不容易說不清楚,但我會懷疑某些參數值。

  • 它可能是參數P_ID_OC_NAJVISA的值。你在那裏通過什麼價值?它看起來像你在那裏期待一個數字。否則,這可能是一個問題。 (這是什麼結果:(R.ID_NAJVISA_OC = '||P_ID_OC_NAJVISA||'?)
  • 它也可能是P_IME_PREZIME的值。看看你如何連接P_IME_PREZIME。它是一個varchar字符串還是一個列名?

如果P_IME_PREZIME是字符串,那麼你需要的,而不是:

WHERE IME_PREZIME LIKE ''%'' || '||P_IME_PREZIME||' || ''%'' 
    OR '||P_IME_PREZIME||' IS NULL'; 

,而這一點:

WHERE IME_PREZIME LIKE ''%'||P_IME_PREZIME||'%'' 
    OR '''||P_IME_PREZIME||''' IS NULL'; 
+0

這將是一個數字,從應用程序傳遞的值是整數。我不確定我是否理解第二個問題。如果它們是相同的,那將是真的,否則就是錯誤的。但是R.ID_NAJVISA_OC是NUMBER,如果它幫助任何... – dzenesiz