Oracle-已编译但有错误,命令行提交包不显示结果

2021年01月20日 11:00 · 阅读(1481) ·

开发环境

名称 版本
操作系统 Windows 10 X64
Oracle win64_11gR2_database
PLSQL Developer 11.0.4.1788(64 bit)01.179332 - Unlimited user license
Beyond Compare 4

问题-已编译但有错误

问题描述

开发环境和测试环境分别创建了一个包 P_OST_STAT_STAFF,开发环境调用无误,测试环境调用报错

  1. ORA-06550: 14 行, 3 列:
  2. PLS-00905: object P_OST_STAT_STAFF is invalid
  3. ORA-06550: 14 行, 3 列:
  4. PL/SQL: Statement ignored
  5. ORA-06550: 20 行, 3 列:
  6. PLS-00905: object P_OST_STAT_STAFF is invalid
  7. ORA-06550: 20 行, 3 列:
  8. PL/SQL: Statement ignored

查看包体和包定义,都显示 x

进入包定义,重新编译,报错

  1. PACKAGE BODY P_OST_STAT_STAFF 编译错误
  2. 错误:PLS-00905: object P_OST_STAT_STAFF is invalid
  3. 错误:PLS-00304: cannot compile body of 'P_OST_STAT_STAFF' without its specification
  4. 错误:PL/SQL: Compilation unit analysis terminated

问题分析

找到之前这个包的定义,和最新的定义使用 Beyond Compare 4 对比,发现之前的定义是

  1. CREATE OR REPLACE PACKAGE P_OST_STAT_STAFF IS
  2. -- 方法及存储过程
  3. END P_OST_STAT_STAFF;
  4. /
  5. CREATE OR REPLACE PACKAGE BODY P_OST_STAT_STAFF IS
  6. -- 方法及存储过程
  7. END P_OST_STAT_STAFF;

现在的定义是

  1. CREATE OR REPLACE PACKAGE P_OST_STAT_STAFF IS
  2. -- 方法及存储过程
  3. END P_OST_STAT_STAFF;
  4. CREATE OR REPLACE PACKAGE BODY P_OST_STAT_STAFF IS
  5. -- 方法及存储过程
  6. END P_OST_STAT_STAFF;

问题解决

在现在的定义包声明和包定义之间加上 /,再次创建

测试结果

查看包声明

查看包定义

调用也没有报错,问题解决

问题-命令行提交包不显示结果

问题描述

存储过程 01_tpsdata_alt_package_P_OST_STAT_STAFF.sql 如下

  1. CREATE OR REPLACE PACKAGE P_OST_STAT_STAFF IS
  2. -- 方法及存储过程
  3. END P_OST_STAT_STAFF;
  4. /
  5. CREATE OR REPLACE PACKAGE BODY P_OST_STAT_STAFF IS
  6. -- 方法及存储过程
  7. END P_OST_STAT_STAFF;

直接在界面中点击执行,提示执行成功

在命令行中运行 @D:\DBScript\01_tpsdata_alt_package_P_OST_STAT_STAFF.sql,提示一个创建提示成功的信息后,显示了一个数字,就没提示了

  1. SQL> @D:\DBScript\01_tpsdata_alt_package_P_OST_STAT_STAFF.sql
  2. Package created
  3. 678

问题分析

命令行下执行,需要提交,这个存储过程最后没有加上提交的代码,所以没有提示

问题解决

修改存储过程 01_tpsdata_alt_package_P_OST_STAT_STAFF.sql 如下

  1. CREATE OR REPLACE PACKAGE P_OST_STAT_STAFF IS
  2. -- 方法及存储过程
  3. END P_OST_STAT_STAFF;
  4. /
  5. CREATE OR REPLACE PACKAGE BODY P_OST_STAT_STAFF IS
  6. -- 方法及存储过程
  7. END P_OST_STAT_STAFF;
  8. /

在命令行中运行 @D:\DBScript\01_tpsdata_alt_package_P_OST_STAT_STAFF.sql,提示执行成功

  1. SQL> @D:\DBScript\01_tpsdata_alt_package_P_OST_STAT_STAFF.sql
  2. Package created
  3. Package body created

通过 show error 命令显示编译报错问题

在命令行中运行 @D:\DBScript\01_tpsdata_alt_package_P_OST_STAT_STAFF.sql,提示错误

  1. Package created
  2. Warning: Package body created with compilation errors

再次执行 show error 命令,显示错误原因

  1. SQL> show error
  2. Errors for PACKAGE BODY P_OST_STAT_STAFF:
  3. LINE/COL ERROR
  4. -------- ----------------------------------------------------------------
  5. 654/12 PLS-00905: 对象 XXXXX@TEST_DBLINK 无效
  6. 654/7 PL/SQL: Statement ignored