Skip to content

Instantly share code, notes, and snippets.

@guestart
Last active December 10, 2021 02:36
Show Gist options
  • Save guestart/0ca72e5344aa3ecaf26b905337e1dcd8 to your computer and use it in GitHub Desktop.
Save guestart/0ca72e5344aa3ecaf26b905337e1dcd8 to your computer and use it in GitHub Desktop.
Two anonymous plsql blocks checking those tables (starting with "DBA_HIST_" in SYS schema of oracle database) returned line is 0.
SET SERVEROUTPUT ON;
DECLARE
v_sql VARCHAR2(200);
v_tablename VARCHAR2(50);
tab_num NUMBER;
v_ref_cursor SYS_REFCURSOR;
BEGIN
OPEN v_ref_cursor FOR
SELECT table_name
FROM dict
WHERE table_name LIKE '%DBA_HIST_%'
ORDER BY 1;
LOOP
FETCH v_ref_cursor INTO v_tablename;
v_sql := 'SELECT COUNT(*) INTO tab_num FROM ' || v_tablename.table_name;
EXECUTE IMMEDIATE v_sql;
IF tab_num = 0 THEN
DBMS_OUTPUT.PUT_LINE('The lines of ' || v_tablename.table_name || ' has been returned 0.');
END IF;
EXIT WHEN v_ref_cursor%NOTFOUND;
END LOOP;
CLOSE v_ref_cursor;
END;
/
DECLARE
*
ERROR at line 1:
ORA-00905: missing keyword
ORA-06512: at line 18
-- The updated version after replied to me on https://www.freelists.org/post/oracle-l/Why-these-two-methods-using-cursor-to-acquire-table-name-and-then-using-this-table-name-to-select-its-returned-lines-is-always-encoutered-a-weird-error,1.
-- on Oracle-L with FreeLists.org.
SET SERVEROUTPUT ON;
DECLARE
v_sql VARCHAR2(200);
v_tablename VARCHAR2(50);
tab_num NUMBER;
v_ref_cursor SYS_REFCURSOR;
BEGIN
OPEN v_ref_cursor FOR
SELECT table_name
FROM dict
WHERE table_name LIKE '%DBA_HIST_%'
ORDER BY 1;
LOOP
FETCH v_ref_cursor INTO v_tablename;
v_sql := 'SELECT COUNT(*) FROM ' || v_tablename.table_name;
EXECUTE IMMEDIATE v_sql INTO tab_num;
IF tab_num = 0 THEN
DBMS_OUTPUT.PUT_LINE('The lines of ' || v_tablename.table_name || ' has been returned 0.');
END IF;
EXIT WHEN v_ref_cursor%NOTFOUND;
END LOOP;
CLOSE v_ref_cursor;
END;
/
v_sql := 'SELECT COUNT(*) FROM ' || v_tablename.table_name;
*
ERROR at line 15:
ORA-06550: line 15, column 53:
PLS-00487: Invalid reference to variable 'V_TABLENAME'
ORA-06550: line 15, column 5:
PL/SQL: Statement ignored
ORA-06550: line 18, column 59:
PLS-00487: Invalid reference to variable 'V_TABLENAME'
ORA-06550: line 18, column 7:
PL/SQL: Statement ignored
-- Replacing "v_tablename.table_name" with "v_tablename" on lines 15 and 18 is right.
SET SERVEROUTPUT ON;
DECLARE
v_sql VARCHAR2(200);
v_tablename VARCHAR2(50);
tab_num NUMBER;
v_ref_cursor SYS_REFCURSOR;
BEGIN
OPEN v_ref_cursor FOR
SELECT table_name
FROM dict
WHERE table_name LIKE '%DBA_HIST_%'
ORDER BY 1;
LOOP
FETCH v_ref_cursor INTO v_tablename;
v_sql := 'SELECT COUNT(*) FROM ' || v_tablename;
EXECUTE IMMEDIATE v_sql INTO tab_num;
IF tab_num = 0 THEN
DBMS_OUTPUT.PUT_LINE('The lines of ' || v_tablename || ' has been returned 0.');
END IF;
EXIT WHEN v_ref_cursor%NOTFOUND;
END LOOP;
CLOSE v_ref_cursor;
END;
/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment