2017-06-22 292 views
0

该代码有100.so它给这个错误“缺少右括号”PL/SQL SQL语句忽视和缺失右括号

DECLARE 
v_department_name VARCHAR(100); 
v_department_manager VARCHAR(100); 
v_totalsalary NUMBER(30); 

BEGIN 

SELECT departments.department_name, concat(employees.first_name, 
employees.last_name), employees.salary INTO v_department_name, 
v_department_manager, v_totalsalary 
FROM employees JOIN departments ON employees.department_id = 
departments.department_id 
WHERE employees.salary = (SELECT departments.department_id, 
sum(employees.salary) 
FROM EMPLOYEES 
where departments.department_id=100 
GROUP BY DEPARTMENT_ID 
ORDER BY DEPARTMENT_ID); 

DBMS_OUTPUT.PUT_LINE ('Department Name is : ' || v_department_name || 'And 
Department Manager is : ' || v_department_manager || 'Total Amount of Salary 
is : ' || v_totalsalary); 

END; 
+0

这让我想起了这篇文章,https://stackoverflow.com /问题/ 44619715/SQL-失踪右括号上阶的语句/ 44622376#44622376。你的问题非常非常接近。正如mathguy声称的那样,子句中没有order by子句。此外,子查询中的列department_id不应该在那里(并且是不必要的)。您应该使用'in'运算符来与子查询进行比较。在很多方面,这是重复的。 –

+1

可能重复[SQL按命令排序的右括号](https://stackoverflow.com/questions/44619715/sql-missing-right-parenthesis-on-order-by-statement) –

回答

1

“丢失右括号”错误是总结部门标识的员工的工资显然是由子查询中的ORDER BY子句引起的(不允许)。

一旦你明确指出错误,你得到的“值过多”的错误,因为你是从返回两个值(department_idsum(salary))的子查询比较的单一变量(salary)的输出。不知道为什么您认为您需要在子查询的SELECT子句中包含department_id

当您在你的问题的错误消息,包括消息的全文(其显示的行号,并在发生错误的位置 - 一个关键的细节)

把它在一个小步时间。暂时忘掉PL/SQL;你是否能够在SQL中编写正确的查询,这将返回部门名称,经理姓名以及部门中所有员工的薪水总和?如果你能做到这一点,那么围绕它的PL/SQL很容易。

这里,就是以一个SQL语句中的所有值的一种方法:

select d.department_name, 
     m.first_name || ' ' || m.last_name as manager_name, 
     sum(e.salary) as sum_salary 
from  departments d 
     join 
     employees m on d.manager_id = m.employee_id 
     join 
     employees e on d.department_id = e.department_id 
where d.department_id = 100 
group by d.department_id, d.department_name, m.first_name, m.last_name 
; 

DEPARTMENT_NAME MANAGER_NAME  SUM_SALARY 
--------------- --------------- ---------- 
Finance   Nancy Greenberg  51608 

也许80编写好的PL/SQL代码只是编写好的,高效的SQL语句%。如果您对此查询有任何疑问,那么您应该在接下来的几天或几周内花大部分时间编写SQL语句;当你觉得这个查询(在我的答案中)是“简单”,“容易”,“标准”(这是!)时返回到PL/SQL