我正在尝试使用动态SQL查询执行存储过程。我终于得到它编译,但它返回以下错误:
ORA-00936 - 缺少表达
我哪里出错了?
包装规格:
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;
答案 0 :(得分: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';