Plsql 如何获取输出以显示PL/SQL游标
我试图使用光标来标识每种工作类型的计数。如果可能的话,我只想显示具有最高计数的作业类型,但也可以让输出显示每个作业类型的计数。到目前为止,我有以下代码,但不确定如何创建输出。任何帮助都将不胜感激Plsql 如何获取输出以显示PL/SQL游标,plsql,Plsql,我试图使用光标来标识每种工作类型的计数。如果可能的话,我只想显示具有最高计数的作业类型,但也可以让输出显示每个作业类型的计数。到目前为止,我有以下代码,但不确定如何创建输出。任何帮助都将不胜感激 DECLARE CURSOR job_cursor IS SELECT job, count(job) from BANK_DATA group by job; v_job job_cursor%rowtype; BEGIN OPEN job_cursor; fetch job_cursor int
DECLARE
CURSOR job_cursor IS
SELECT job, count(job) from BANK_DATA group by job;
v_job job_cursor%rowtype;
BEGIN
OPEN job_cursor;
fetch job_cursor into v_job;
CLOSE JOB_CURSOR;
END;
根据“显示”的含义,一个选项是简单地在屏幕上显示它 该示例基于Scott的示例模式,即其EMP表。店员和推销员是最常见的工作,所以-你应该把它们都展示出来
SQL> set serveroutput on
SQL> select job, count(*) cnt
2 from emp
3 group by job
4 order by cnt desc;
JOB CNT
--------- ----------
CLERK 4
SALESMAN 4
MANAGER 3
ANALYST 2
PRESIDENT 1
以下是方法:
内联视图第6-10行使用秩分析函数,该函数。。。嗯,按发生次数对工作进行排序
listagg函数聚合它们,即连接值
结果存储到本地声明的变量中,该变量使用dbms_output.put_行显示
我已经稍微修改了您的代码以符合您的要求
SET SERVEROUTPUT ON; -- To enable printing on console
DECLARE
CURSOR job_cursor IS
SELECT job, count(job) as count_job from BANK_DATA group by job; --An alias has been added to count(job) for smooth functioning with cursor
v_job job_cursor%rowtype;
job_typ varchar(20); -- name of job with highest count
job_cnt number; -- frequency of job with highest count
BEGIN
job_typ := '';
job_cnt := 0;
--OPEN job_cursor; -- FOR Loop takes care of opening cursor so you don't need to explicitly do that via your code
--fetch job_cursor into v_job; -- FOR Loop takes care of fetching cursor so you don't need to explicitly do that via your code
FOR v_job IN job_cursor
LOOP
dbms_output.put_line( v_job.job || ' ' || v_job.count_job ); -- It prints all jobs with the count of each job type
IF(job_cnt<v_job.count_job) THEN
job_cnt:= v_job.count_job;
job_typ := v_job.job;
END IF;
END LOOP;
dbms_output.put_line( 'Highest counted job is ' || job_typ || ' ' || job_cnt); -- It prints job with the highest count
--CLOSE job_cursor; -- FOR Loop takes care of opening and closing cursor so you don't need to explicitly do that via your code
END;
希望有帮助!: 如果需要游标,只需使用游标语句即可。那么您就不需要变量了:
BEGIN
FOR ds IN (
SELECT job
FROM (
SELECT job, RANK() OVER (ORDER BY COUNT(1) DESC) as rnk
FROM bank_data
GROUP BY job
)
WHERE rnk = 1
)
LOOP
DBMS_OUTPUT.PUT_LINE(ds.job);
END LOOP;
END;
/
BEGIN
FOR ds IN (
SELECT job
FROM (
SELECT job, RANK() OVER (ORDER BY COUNT(1) DESC) as rnk
FROM bank_data
GROUP BY job
)
WHERE rnk = 1
)
LOOP
DBMS_OUTPUT.PUT_LINE(ds.job);
END LOOP;
END;
/