首页 > 解决方案 > ORA-00907: 过程返回表缺少右括号

问题描述

我试图纠正一个返回表格的过程。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):警告:已编译但存在编译错误

标签: oraclestored-proceduresplsql

解决方案


您在这里使用了外星人代码,存在语法错误:

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;

推荐阅读