Oracle Shell脚本调用dbms_metadata.get_ddl变量报错求助
问题描述
我有一段脚本片段,原本用来提取符合条件的视图对应的DDL,运行时虽然能生成指定路径的spool文件,但文件里出现了SP2系列错误,麻烦帮忙排查。
代码片段:
RESULT1=`sqlplus -s 'system/'$DBSYS'@PROD' 2>/dev/null <<EOF set feedback off set heading off select view_name from dba_views where view_name like '%DB2%'; EOF` VIEWS_DDL=`sqlplus -s 'system/'$DBSYS'@PROD' 2>/dev/null <<EOF|tail -1 set feedback off heading off long 99999 linesize 1234 pages 1234 spool $LOCSC/DB2_VIEWS_$RQNUM.sql select dbms_metadata.get_ddl('VIEW','$RESULT1','DATA_OWNER') from dual; spool off EOF`
错误输出:
SP2-0044: For a list of known commands enter HELP and to leave enter EXIT. SP2-0734: unknown command beginning "DB2_OPORTR..." - rest of line ignored. SP2-0734: unknown command beginning "DB2_DGORDP..." - rest of line ignored. SP2-0734: unknown command beginning "DB2_DGORDP..." - rest of line ignored. SP2-0734: unknown command beginning "DB2_SOPOGI..." - rest of line ignored. SP2-0044: For a list of known commands enter HELP and to leave enter EXIT.
问题排查与解决
核心问题原因:第一个SQLPlus查询返回的
RESULT1是多个视图名称的集合(like '%DB2%'匹配到了多个视图),直接将这个集合代入第二个SQLPlus的get_ddl调用时,Shell会把多个视图名拆成多行/多个参数,导致SQLPlus把这些视图名当成独立的命令执行,从而抛出SP2错误(把视图名识别成了未知SQLPlus命令)。修复方案:
- 遍历
RESULT1中的每个视图名,逐个生成DDL:
修改脚本,将第二个SQL*Plus调用放到循环里,针对每个视图单独执行get_ddl:# 获取所有符合条件的视图名,去除多余空格和空行 RESULT1=$(sqlplus -s 'system/'$DBSYS'@PROD' 2>/dev/null <<EOF set feedback off heading off trimspool on trimout on pages 0 select view_name from dba_views where view_name like '%DB2%'; EOF ) # 初始化spool文件(清空或创建) > $LOCSC/DB2_VIEWS_$RQNUM.sql # 遍历每个视图名生成DDL for VIEW in $RESULT1; do sqlplus -s 'system/'$DBSYS'@PROD' 2>/dev/null <<EOF >> $LOCSC/DB2_VIEWS_$RQNUM.sql set feedback off heading off long 99999 linesize 1234 pages 0 trimspool on trimout on select dbms_metadata.get_ddl('VIEW','$VIEW','DATA_OWNER') from dual; -- 加分隔符区分不同视图的DDL select '------------------------------' from dual; EOF done - 额外优化点:
- 新增
trimspool on和trimout on去除输出中的多余空格和空行 - 设置
pages 0避免分页符干扰DDL内容 - 用
$(...)替代反引号`...`,这是更现代的Shell语法,可读性与兼容性更好 - 初始化spool文件时用
>清空,避免多次运行时内容叠加 - 每个视图DDL后加分隔符,方便后续区分查看
- 新增
- 遍历
内容的提问来源于stack exchange,提问作者Mohammeddba
相关产品推荐
相关产品推荐

