oracle 00936. 00000 -“缺少表达式”

ztyzrc3y  于 2023-11-17  发布在  Oracle
关注(0)|答案(2)|浏览(109)

我写了一个pl/sql函数getEmpNums('3A,5 B,6 B'),这个函数将返回这样的字符串“EMP_NO IN('3A','5 B','6 B')”。我想在where子句中使用这个函数。如下所示

SELECT EMP_NO FROM EMP_CUST_VALUES  WHERE (select getEmpNums('3A,5B,6B') from dual)

字符串
当我像下面这样调用时,得到“ORA-00936:missing expression”。如何像这样在where子句中调用函数
我试

SELECT EMP_NO FROM EMP_CUST_VALUES  WHERE (select getEmpNums('3A,5B,6B') from dual)


当我给予它的工作时,它不工作

SELECT EMP_NO FROM EMP_CUST_VALUES  WHERE (EMP_NO IN ('3A','5B','6B'))

xytpbqjk

xytpbqjk1#

虽然你写的函数可能会返回你想要的,但你选择的原则只适用于有限的情况(Oracle Forms,Reports,也许是其他地方),你可以用绑定变量 * 替换 * 函数结果。
通常情况下,你宁愿选择返回一个集合,并将其与table函数一起使用,无论是作为一个连接还是在一个子查询中。
函数优先;我使用了内置的数据类型:

SQL> create or replace function getempnums(par_str in varchar2)
  2    return sys.odcivarchar2list
  3  is
  4    retval sys.odcivarchar2list;
  5  begin
  6    select trim(regexp_substr(par_Str, '[^,]+', 1, level))
  7      bulk collect into retval
  8      from dual
  9      connect by level <= regexp_count(par_str, ',') + 1;
 10    return retval;
 11  end;
 12  /

Function created.

字符串
样品表:

SQL> select empno, ename from emp where rownum <= 5;

     EMPNO ENAME
---------- ----------
      7369 SMITH
      7499 ALLEN
      7521 WARD
      7566 JONES
      7654 MARTIN


函数返回什么?一个集合:

SQL> select getempnums('7369,7499, 7521') from dual;

GETEMPNUMS('7369,7499,7521')
--------------------------------------------------------------------------------
ODCIVARCHAR2LIST('7369', '7499', '7521')


使用方法:表函数

SQL> select e.empno, e.ename
  2  from emp e join table(getempnums('7369,7499, 7521')) t on t.column_value = e.empno;

     EMPNO ENAME
---------- ----------
      7369 SMITH
      7499 ALLEN
      7521 WARD

子查询:

SQL> select e.empno, e.ename
  2  from emp e
  3  where e.empno in (select * from table(getempnums('7369,7499, 7521')));

     EMPNO ENAME
---------- ----------
      7369 SMITH
      7499 ALLEN
      7521 WARD

SQL>

ttvkxqim

ttvkxqim2#

你不需要一个函数或IN表达式。
相反,您可以直接在查询中使用分隔列表并匹配子字符串(使用周围的分隔符来匹配整个术语):

SELECT EMP_NO
FROM   EMP_CUST_VALUES
WHERE  ',' || '3A,5B,6B' || ',' LIKE '%,' || emp_no || ',%';

字符串

相关问题