SQL> !cat /tmp/x1.sql
set serverout on size 999999
declare
p_query varchar2(32767) := '&1';
    l_theCursor     integer default dbms_sql.open_cursor;
    l_columnValue   varchar2(4000);
    l_status        integer;
    l_descTbl       dbms_sql.desc_tab;
    l_colCnt        number;
    n number := 0;
  procedure p(msg varchar2) is
    l varchar2(4000) := msg;
  begin
    while length(l) > 0 loop
      dbms_output.put_line(substr(l,1,80));
      l := substr(l,81);
    end loop;
  end;
begin
    execute immediate
    'alter session set nls_date_format=''dd-mon-yyyy hh24:mi:ss'' ';
    dbms_sql.parse(  l_theCursor,  p_query, dbms_sql.native );
    dbms_sql.describe_columns( l_theCursor, l_colCnt, l_descTbl );
    for i in 1 .. l_colCnt loop
        dbms_sql.define_column(l_theCursor, i, l_columnValue, 4000);
    end loop;
    l_status := dbms_sql.execute(l_theCursor);
    while ( dbms_sql.fetch_rows(l_theCursor) > 0 ) loop
        for i in 1 .. l_colCnt loop
            dbms_sql.column_value( l_theCursor, i, l_columnValue );
            p( rpad( l_descTbl(i).col_name, 30 )
              || ': ' || 
              l_columnValue );
        end loop;
        dbms_output.put_line( '-----------------' );
        n := n + 1;
    end loop;
    if n = 0 then
      dbms_output.put_line( chr(10)||'No data found '||chr(10) );
    end if;
end;
/
[oracle@vbox tmp]$ sqlplus scott/tiger@freepdb1
SQL*Plus: Release 23.0.0.0.0 - Production on Mon Aug 4 16:13:59 2025
Version 23.8.0.25.04
Copyright (c) 1982, 2025, Oracle.  All rights reserved.
Last Successful login time: Mon Aug 04 2025 12:39:29 +08:00
Connected to:
Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.8.0.25.04
SQL> @/tmp/x1.sql "select * from dept"
old   2: p_query varchar2(32767) := '&1';
new   2: p_query varchar2(32767) := 'select * from dept';
DEPTNO         : 10
DNAME         : ACCOUNTING
LOC         : NEW YORK
-----------------
DEPTNO         : 20
DNAME         : RESEARCH
LOC         : DALLAS
-----------------
DEPTNO         : 30
DNAME         : SALES
LOC         : CHICAGO
-----------------
DEPTNO         : 40
DNAME         : OPERATIONS
LOC         : BOSTON
-----------------
PL/SQL procedure successfully completed.
SQL> @/tmp/x1.sql 'select * from dept'
old   2: p_query varchar2(32767) := '&1';
new   2: p_query varchar2(32767) := 'select * from dept';
DEPTNO         : 10
DNAME         : ACCOUNTING
LOC         : NEW YORK
-----------------
DEPTNO         : 20
DNAME         : RESEARCH
LOC         : DALLAS
-----------------
DEPTNO         : 30
DNAME         : SALES
LOC         : CHICAGO
-----------------
DEPTNO         : 40
DNAME         : OPERATIONS
LOC         : BOSTON
-----------------
PL/SQL procedure successfully completed.
SQL> @/tmp/x1.sql '  select * from dept  '
old   2: p_query varchar2(32767) := '&1';
new   2: p_query varchar2(32767) := '  select * from dept  ';
DEPTNO         : 10
DNAME         : ACCOUNTING
LOC         : NEW YORK
-----------------
DEPTNO         : 20
DNAME         : RESEARCH
LOC         : DALLAS
-----------------
DEPTNO         : 30
DNAME         : SALES
LOC         : CHICAGO
-----------------
DEPTNO         : 40
DNAME         : OPERATIONS
LOC         : BOSTON
-----------------
PL/SQL procedure successfully completed.
and from scratch
[oracle@vbox tmp]$ sqlplus system/oracle@freepdb1
SQL*Plus: Release 23.0.0.0.0 - Production on Mon Aug 4 16:16:54 2025
Version 23.8.0.25.04
Copyright (c) 1982, 2025, Oracle.  All rights reserved.
Last Successful login time: Mon Aug 04 2025 12:40:29 +08:00
Connected to:
Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.8.0.25.04
SQL> grant db_developer_role to demo_user identified by demo_user;
Grant succeeded.
SQL> conn demo_user/demo_user@freepdb1
Connected.
SQL> @/tmp/x1 "select * from dual"
old   2: p_query varchar2(32767) := '&1';
new   2: p_query varchar2(32767) := 'select * from dual';
DUMMY         : X
-----------------
PL/SQL procedure successfully completed.