PL/SQL查询表空间信息格式化输出及PRINT_TABLE报错处理
Oracle表空间查询输出格式化及PRINT_TABLE报错处理
问题场景
查询表空间信息时最初使用如下SQL:
select tablespace_name "GITBRANCHES", Initial_extent "initial_ext", Next_extent "next_ext", Min_extents "min_ext", Max_extents "max_ext", Pct_increase From dba_tablespaces;
执行时存在三个排版问题:
- 列宽设置不合理,单列表格占宽过大
- 行与行之间存在空分隔行
- 单行内容超出终端宽度时自动折行,内容错位混乱
为了实现规整的格式化输出,尝试调用print_table存储过程,执行语句如下:
exec print_table('select tablespace_name "GITBRANCHES",Initial_extent "initial_ext",Next_extent "next_ext",Min_extents "min_ext",Max_extents "max_ext" Pct_increase From dba_tablespaces');
执行后持续返回报错:
ERROR at line 1: ORA-06550: line 1, column 7: PLS-00201: identifier 'PRINT_TABLE' must be declared ORA-06550: line 1, column 7: PL/SQL: Statement ignored
报错原因
PRINT_TABLE不是Oracle数据库内置的存储过程,是第三方开发的自定义工具过程,默认不会随数据库预装,因此直接调用会触发标识符未定义的错误。另外传入存储过程的SQL语句本身存在语法错误:Max_extents "max_ext"和Pct_increase之间缺失逗号,就算存储过程存在也会触发语法报错。
解决方法
方法一:修复PRINT_TABLE调用问题
- 使用具备CREATE PROCEDURE权限的管理员账号(如SYS、SYSTEM)登录数据库,创建PRINT_TABLE存储过程。
- 给需要调用该存储过程的业务用户授予执行权限,必要时创建公有同义词避免跨用户访问时找不到对象。
- 修正传入的SQL语法,补上缺失的逗号,修正后语句如下:
exec print_table('select tablespace_name "GITBRANCHES",Initial_extent "initial_ext",Next_extent "next_ext",Min_extents "min_ext",Max_extents "max_ext", Pct_increase From dba_tablespaces');
方法二:使用SQL*Plus原生参数格式化(无需创建自定义对象,推荐)
不需要依赖任何自定义存储过程,直接在执行查询前设置SQL*Plus环境参数即可输出规整的表格格式:
- 先执行参数设置命令:
-- 设置单行总显示宽度,可根据终端大小调整,避免内容折行 SET LINESIZE 180; -- 设置单页显示行数,设置为较大值消除分页带来的空分隔行 SET PAGESIZE 1000; -- 关闭行尾多余空格、关闭超长内容自动折行 SET TRIMSPOOL ON; SET WRAP OFF; -- 单独设置每个列的显示宽度,A开头代表字符型宽度,数字串代表数值型显示格式 COL GITBRANCHES FOR A25; COL initial_ext FOR 9999999999; COL next_ext FOR 9999999999; COL min_ext FOR 999999; COL max_ext FOR 9999999999; COL Pct_increase FOR 999;
- 执行原本的表空间查询语句,即可得到对齐规整、无多余空行、无乱折行的输出结果。
内容的提问来源于stack exchange,提问作者sumaaiiiaaaa
相关产品推荐
相关产品推荐

