我们正在实现数据库生产对象(如包,过程,触发器&co)的单元测试系统。为此,我们有一个容器,可以从https://github.com/oracle/docker-images/tree/master/OracleDatabase创建数据库。 然后,我们执行脚本来创建模式,用户,授予一些特权,创建良好的表空间...然后,我们使用Data Pump Oracle来Expdp和Impdp模式。这些步骤是成功的。
当我们尝试对过程和程序包执行测试时,出现问题。由于编译错误“ ORA-38824:CREATE或REPLACE命令可能无法更改现有对象的EDITIONABLE属性”,因此在架构中找不到它们。
但是,如果我们放弃测试的程序,然后重新创建它,该错误将不再出现。事情是我们不想手动删除并重新创建该过程。
我们的环境与容器数据库之间的唯一区别是,当我们从头开始创建过程/程序包时,对象详细信息中的Editionable参数在容器中的容器中为“ N”,而在我们的环境中为“ Y”。
似乎必须在数据库级别设置对象的可编辑参数。 但是问题是在哪里可以设置?
我们试图“更改USER X启用版本”;没有成功,因为它会导致“ ORA-38813:架构X不支持的版本”。
Impdp和Expdp是否引起麻烦?
我们尝试在expdp impdp流程中使用“ source_edition”和“ target_edition”。 我们显然缺少了某些东西或做错了什么,但是我们找不到。
我已经在互联网上进行搜索,但是没有太多人面临这个问题。
能否请您提供帮助?
先谢谢了。 文森特。
答案 0 :(得分:0)
我检查了Oracle支持网站(应该更早完成此操作),并且该错误与12c中的错误有关。例如,在一个这样的文档(Meta Link Document)中,它表示如下。因此,请通过提高SR将此问题转给Oracle,很有可能他们会提出有关Oracle版本升级的建议:
请应用合并补丁程序错误27314007:对于漏洞的12.2.0.1.0上的合并请求25557064 26645487
使用以下步骤进行升级:
谢谢
答案 1 :(得分:0)
我最近经历了此过程,并对其进行了分析,因此我们将不使用EDITIONABLE
功能,因此我在下面运行了命令,保留了NONEDITIONABLE
对象,因为那样就替换了这些对象。并且在DBA_OBJECTS
表中,EDITIONABLE
列为N
,因此,当需要进行展示时,就没有问题。
DECLARE
TYPE t_cursor IS REF CURSOR;
TYPE t_string_array IS TABLE OF VARCHAR2(1000) INDEX BY BINARY_INTEGER;
vcursor t_cursor;
varraystring t_string_array;
vstring VARCHAR2(500);
i BINARY_INTEGER;
BEGIN
OPEN vcursor FOR
select 'ALTER ' || do.object_type || ' ' || do.owner || '.' || do.object_name || ' NONEDITIONABLE'
from DBA_OBJECTS do
where do.editionable = 'Y'
and do.owner NOT IN('QS_CB','DIP','PERFSTAT','QS_ADM','PM','SH','HR','OE','ODM_MTR','WKPROXY','ANONYMOUS','OWNER','SYS','SYSTEM','SCOTT','SYSMAN','XDB','DBSNMP','EXFSYS','OLAPSYS','MDSYS','WMSYS','WKSYS','DMSYS','ODM','EXFSYS','CTXSYS','LBACSYS','ORDPLUGINS','SQLTXPLAIN','OUTLN','TSMSYS','XS$NULL','TOAD','STREAM','SPATIAL_CSW_ADMIN','SPATIAL_WFS_ADMIN','SI_INFORMTN_SCHEMA','QS','QS_CBADM','QS_CS','QS_ES','QS_OS','QS_WS','PA_AWR_USER','OWBSYS_AUDIT','OWBSYS','ORDSYS','ORDDATA','ORACLE_OCM','SPATIAL_CSW_ADMIN_USR','SPATIAL_WFS_ADMIN_USR','MGMT_VIEW','MDDATA','FLOWS_FILES','FLASHBACK','AWRUSER','APPQOSSYS','APEX_PUBLIC_USER','DVSYS')
and do.object_type IN ('FUNCTION','LIBRARY','PACKAGE BODY','PACKAGE','PROCEDURE','TRIGGER','TYPE','TYPE BODY','SYNONYM','VIEW');
LOOP
FETCH vcursor BULK COLLECT
INTO varraystring;
EXIT WHEN varraystring.count = 0;
FOR i IN varraystring.first .. varraystring.last LOOP
EXECUTE IMMEDIATE varraystring(i);
END LOOP;
EXIT WHEN vcursor%NOTFOUND;
END LOOP;
CLOSE vcursor;
END;