在Oracle中使用REF CURSOR和动态SQL时缺少表达式

时间:2017-07-28 09:06:18

标签: oracle plsql cursor dynamic-sql

我正在尝试使用动态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;

1 个答案:

答案 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';