oracle - 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):警告:已编译但存在编译错误
解决方案
您在这里使用了外星人代码,存在语法错误:
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;
推荐阅读
- python-3.x - 使用 LSTM 训练的模型只预测所有相同的值
- reactjs - 如何用 jest 测试反应请求参数?
- python - 你如何在python中使用beautifulsoup从带有“data-reactid”的“span”标签中抓取数据?
- vhdl - 在 vhdl 中循环
- javascript - 在 iOS 上调整大小时 React Native Image Resizer 包接收 null
- wildfly - Wildfly14 + 无法查找 invm 队列
- docker - 如何在 Docker 中请求 NGINX 反向代理后面的 Jenkins API REST?
- python-3.x - 如何从代码中检测 EOF 解析器错误?
- java - IDE 中的代码正确,但 CodeChef 中出现错误
- ruby-on-rails - 如何编写允许部分更新的graphQL突变?