CREATE OR REPLACE FUNCTION F_PROGRESS_QUERY (p_total_rows IN NUMBER,
p_rownum IN NUMBER,
p_portion IN NUMBER DEFAULT 12)
RETURN VARCHAR2
IS
v_i NUMBER := p_rownum;
v_prc NUMBER := 0;
v_mod NUMBER := 0;
v_return VARCHAR2 (10) := NULL;
BEGIN
IF p_total_rows > 0 AND p_portion > 0
THEN
v_mod := p_portion;
IF MOD (v_i, v_mod) = 0 AND (v_i < p_total_rows OR v_i = p_total_rows)
THEN
v_prc := ROUND (v_i*100/p_total_rows);
v_return := v_prc || '%';
ELSE
IF v_i = 1
THEN
v_return := 1 || '%';
ELSIF v_i = p_total_rows
THEN
v_return := 100 || '%';
END IF;
END IF;
ELSE
v_return := 0;
END IF;
RETURN v_return;
EXCEPTION
WHEN OTHERS
THEN
RETURN 0;
END F_PROGRESS_QUERY;
Function created.
DECLARE
v_result VARCHAR2 (30) := '';
v_total_emp NUMBER := 0;
v_i NUMBER := 0;
CURSOR cur_emp
IS
SELECT
employee_id,
first_name,
last_name,
salary
FROM hr.employees;
BEGIN
SELECT COUNT(*)
INTO v_total_emp
FROM hr.employees;
FOR rec IN cur_emp
LOOP
v_i := v_i + 1;
v_result := F_PROGRESS_QUERY (v_total_emp, v_i, 7);
DBMS_OUTPUT.PUT_LINE (v_result);
END LOOP;
END;
Statement processed.
1%
7%
13%
20%
26%
33%
39%
46%
52%
59%
65%
72%
79%
85%
92%
98%
100%