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: 过程返回表缺少右括号的主要内容,如果未能解决你的问题,请参考以下文章

创建表并收到错误,因为 ora 00907 缺少右括号

获取“ORA-00907:缺少右括号”,找不到错误

ORA-00907: 两个子查询的左连接缺少右括号

将 XML 数据存储在表中的 PL/SQL 过程抛出错误(23,102):PL/SQL:ORA-00907:缺少右括号

错误报告 - ORA-00907: 缺少右括号 00907. 00000 - “缺少右括号

第 10 行:错误:ORA-00907 缺少右括号 |甲骨文 11g