必须声明标识符 '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;
/
我正在创建 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;
/