在SQL-oracle中的游标内使用游标
我在网上查找,看看是否可以找到一个示例,说明如何使用游标(在游标中)从两个表中获得所需的结果,但没有成功。所以我想知道是否有人可以给我举一些例子或者帮助我编写代码 数据:来自2个表在SQL-oracle中的游标内使用游标,sql,oracle,Sql,Oracle,我在网上查找,看看是否可以找到一个示例,说明如何使用游标(在游标中)从两个表中获得所需的结果,但没有成功。所以我想知道是否有人可以给我举一些例子或者帮助我编写代码 数据:来自2个表 DEPARTMENT_ID DEPARTMENT_NAME ------------- -------------------- 10 ACCOUNTING 50 EXECUTIVE 40 IT
DEPARTMENT_ID DEPARTMENT_NAME
------------- --------------------
10 ACCOUNTING
50 EXECUTIVE
40 IT
60 MARKETING
20 RESEARCH
30 SALES
选择6行
EMPLOYEE_ID EMPLOYEE_NAME SALARY DEPARTMENT_ID MAX_SAL MAX75SAL
----------- -------------------- ---------- ------------- ---------- ----------
8000 BREWSTER 2500 2500 1875
7603 CLARK 4000 50 5000 3750
7900 FISHER 3000 30 3000 2250
7921 JACKSON 2500 30 3000 2250
7566 JONES 3000 10 3000 2250
7596 JOST 4500 50 5000 3750
7839 KING 5000 50 5000 3750
7944 LEE 2400 20 3000 2250
7788 SCOTT 2500 40 2900 2175
7910 SMITH 2900 40 2900 2175
7886 STEEL 2500 10 3000 2250
7610 WILSON 3000 20 3000 2250
7999 WOLFE 2500 20 3000 2250
起初,我得到了这样的结果:
ACCOUNTING 3000 2250 JONES
ACCOUNTING 3000 2250 STEEL
EXECUTIVE 5000 3750 CLARK
EXECUTIVE 5000 3750 JOST
EXECUTIVE 5000 3750 KING
IT 2900 2175 SCOTT
IT 2900 2175 SMITH
RESEARCH 3000 2250 LEE
RESEARCH 3000 2250 WILSON
RESEARCH 3000 2250 WOLFE
SALES 3000 2250 FISHER
SALES 3000 2250 JACKSON
N/A 2500 1875 BREWSTER
但我需要它们像这样出现:
ACCOUNTING 3000 2250 JONES STEEL
EXECUTIVE 5000 3750 CLARK JOST KING
IT 2900 2175 SCOTT SMITH
RESEARCH 3000 2250 LEE WILSON WOLFE
SALES 3000 2250 FISHER JACKSON
其中,每个部门名称将只产生一行,但在末尾包含符合标准的员工姓名
我的代码:
DECLARE
-- First cursor
CURSOR c_get_dept IS
SELECT department_id, department_name
FROM department
ORDER BY department_name;
-- Second cursor
CURSOR c_get_emp (p_dept_id NUMBER) IS
select z.employee_id, z.employee_name, z.salary, z.department_id,
max_sal,(z.max_sal *.75) max75sal
from
(
SELECT employee_id, employee_name,salary,department_id,
max(salary) over (partition by department_id) as max_sal
FROM employee
ORDER BY employee_name
) z
WHERE salary > (max_sal*.75 )
order by z.employee_name;
v_flag NUMBER;
BEGIN
-- Open first cursor
FOR idx_1 IN c_get_dept LOOP
v_flag := 0;
-- Open second cursor `
FOR idx_2 IN c_get_emp(idx_1.department_id) LOOP
IF v_flag = 0 THEN
DBMS_OUTPUT.PUT_LINE(idx_1.department_name || ' ' || idx_2.max_sal ||
' ' || idx_2.max75sal || ' ' || idx_2.EMPLOYEE_NAME);
v_flag := 0;
END IF;
END LOOP;
IF v_flag = 0 THEN
DBMS_OUTPUT.PUT_LINE(' No output.');
END IF;
END LOOP;
END;
谢谢大家! 如果您使用的是Oracle 11.2,则可以使用listag函数()来帮助您完成所要做的事情。以下查询生成您要查找的结果:
SELECT d.DEPARTMENT_NAME,
MAX(e.SALARY) AS MAX_SALARY,
MAX(e.SALARY)*0.75 AS MAX75,
LISTAGG(e.EMPLOYEE_NAME, ' ')
WITHIN GROUP (ORDER BY d.DEPARTMENT_NAME) AS EMPLOYEES
FROM DEPARTMENT d
INNER JOIN EMPLOYEE e
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
GROUP BY d.DEPARTMENT_NAME
ORDER BY d.DEPARTMENT_NAME
如果目标是在PL/SQL块中使用多个游标,我建议尝试以下简单方法(注意并警告:未测试代码如下):
分享和享受。删除了我的“答案”,因为其他人认为这不是答案,而是澄清问题。总而言之:您正处于一个残酷的时期,试图让它与游标一起工作。并不是说这是不可能的,但是重新构造数据和使用双层功能要好得多。
DECLARE
nDepartment_max_salary NUMBER;
strEmployees VARCHAR2(32767);
BEGIN
FOR dept IN (SELECT *
FROM DEPARTMENT
ORDER BY DEPARTMENT_NAME)
LOOP
nDepartment_max_salary := 0;
strEmployees := NULL;
FOR emp IN (SELECT *
FROM EMPLOYEE e
WHERE e.DEPARTMENT_ID = dept.DEPARTMENT_ID)
LOOP
nDepartment_max_salary := GREATER(nDepartment_max_salary, emp.SALARY);
strEmployees := strEmployees || emp.EMPLOYEE_NAME || ' ';
END LOOP; -- emp
DBMS_OUTPUT.PUT_LINE(dept.DEPARTMENT_NAME || ' ' ||
nDepartment_max_salary || ' ' ||
nDepartment_max_salaray * 0.75 || ' ' ||
strEmployees);
END LOOP; -- dept
END;