必须声明标识符 'UTILS.IDENTITY_VALUE'

identifier 'UTILS.IDENTITY_VALUE' must be declared

我正在创建 DDL 脚本以基于现有数据库创建数据库模型。基本上完善了我从 expdp.

得到的内容

由于数据库是 Oracle 11gR2,它还不支持 12c 标识列 (https://oracle-base.com/articles/12c/identity-columns-in-oracle-12cr1)。 因此,导出的语句使用 https://community.oracle.com/thread/3677631?start=0&tstart=0 中提到的序列触发器 - 所以它可能最初是从 MS SQL 服务器转换而来的,我确定。

触发器看起来类似于

create or replace TRIGGER "TABLEX_TRG" BEFORE INSERT ON TABLEX
FOR EACH ROW
DECLARE
v_newVal NUMBER(12) := 0;
v_incval NUMBER(12) := 0;
BEGIN
  IF INSERTING AND :new.TABLEXId IS NULL THEN
    SELECT  TABLEX_TABLEXId_SEQ.NEXTVAL INTO v_newVal FROM DUAL;
    -- If this is the first time this table have been inserted into (sequence == 1)
    IF v_newVal = 1 THEN
      --get the max indentity value from the table
      SELECT NVL(max(TABLEXId),0) INTO v_newVal FROM TABLEX;
      v_newVal := v_newVal + 1;
      --set the sequence to that value
      LOOP
           EXIT WHEN v_incval>=v_newVal;
           SELECT TABLEX_TABLEXId_SEQ.nextval INTO v_incval FROM dual;
      END LOOP;
    END IF;
  -- save this to emulate @@identity
  utils.identity_value := v_newVal;
   -- assign the value from the sequence to emulate the identity column
   :new.TABLEXId := v_newVal;
  END IF;
END;

问题是 SQL 开发者抱怨 "Error(21,3): PLS-00201: identifier 'UTILS.IDENTITY_VALUE' must be declared"

奇怪的是,当我连接到原始数据库并检查触发器时,它是相同的,没有声明或 'UTILS.IDENTITY_VALUE' 的任何内容。并且是漂亮的绿色。

任何 explanation/advice 欢迎!

最有可能的是,您的新系统上应该缺少一个名为 UTILS 的软件包;您也必须从现有系统中复制它。也有可能该包存在,但您没有看到它(缺少同义词)或没有访问它的权限。

如果 UTILS 没有其他必要(不太可能但可能),您可以执行以下操作:

 create package UTILS as
    identity_value number(12);
 end UTILS;
 /