【问题标题】:Missing expression when using REF CURSOR with dynamic SQL in Oracle在 Oracle 中将 REF CURSOR 与动态 SQL 一起使用时缺少表达式
【发布时间】:2018-01-04 06:37:43
【问题描述】:

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

【问题讨论】:

    标签: oracle plsql cursor dynamic-sql


    【解决方案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';
    

    【讨论】:

    • 它将是一个数字,从应用程序传递的值是整数。我不确定我是否理解第二个问题。如果它们相同则为真,否则为假。但是 R.ID_NAJVISA_OC 是 NUMBER,如果它有帮助的话......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 2017-08-31
    • 1970-01-01
    相关资源
    最近更新 更多