ORA-00907: 过程返回表缺少右括号
Posted
技术标签:
【中文标题】ORA-00907: 过程返回表缺少右括号【英文标题】:ORA-00907: Missing right parenthesis with procedure returning table 【发布时间】:2020-07-01 09:53:52 【问题描述】:我试图纠正一个返回表的过程。
当emp_num
参数等于SSN
时,该过程应返回包含员工信息的列表,否则返回包含所有员工信息的列表。
首先我创建如下记录:
CREATE OR REPLACE TYPE emp_record IS OBJECT(emp_lname VARCHAR2(30),
emp_ssn CHAR(9),
emp_sal NUMBER(6));
然后我创建emp_record
类型的表,如下所示:
CREATE OR REPLACE TYPE emp_table IS TABLE OF emp_record;
然后我创建一个带有两个参数的过程get_employee
:
CREATE OR REPLACE PROCEDURE get_employee(emp_num IN NUMBER , output_emp OUT emp_table) AS
CURSOR emp_cur IS
SELECT LNAME,SSN,SALARY
FROM EMPLOYEE
WHERE NVL((emp_num = SSN),(SSN = SSN));
BEGIN
IF NOT (emp_cur%ISOPEN) THEN
OPEN emp_cur;
END IF;
LOOP
FETCH emp_cur BULK COLLECT INTO output_emp;
EXIT WHEN output_emp.count=0;
CLOSE emp_cur;
END LOOP;
END;
当我运行该代码时,出现以下错误:
[警告] ORA-24344: 编译错误成功 6/20 PL/SQL:ORA-00907:缺少右括号 4/1 PL/SQL:忽略 SQL 语句 (1:0):警告:已编译但存在编译错误
【问题讨论】:
您尝试使用NVL((emp_num = SSN),(SSN = SSN))
实现什么目标?
顺便说一下,CHAR
应该是VARCHAR2
。
【参考方案1】:
你在这里使用了外星人代码,出现语法错误:
WHERE
NVL(
(EMP_NUM = SSN),
(SSN = SSN)
);
NVL
可以将两列/常量作为输入参数,而不是布尔值。
你想要一个 WHERE
条件 - EMP_NUM
是满的,或者如果它不为空,那么它等于 SSN
然后你需要使用这样的东西:
WHERE
NVL(EMP_NUM,SSN) = SSN;
或者更好的使用OR
条件如下:
WHERE EMP_NUM IS NULL OR EMP_NUM = SSN;
【讨论】:
【参考方案2】:请参考Oracle Documentation 了解NVL 语法。基于语法的相似性,我觉得您可能想改用DECODE。如果是这样,CASE 就是要走的路。
【讨论】:
以上是关于ORA-00907: 过程返回表缺少右括号的主要内容,如果未能解决你的问题,请参考以下文章
将 XML 数据存储在表中的 PL/SQL 过程抛出错误(23,102):PL/SQL:ORA-00907:缺少右括号