Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle11g Liquibase未编译oracle pkb/pks包,_Oracle11g_Liquibase - Fatal编程技术网

Oracle11g Liquibase未编译oracle pkb/pks包,

Oracle11g Liquibase未编译oracle pkb/pks包,,oracle11g,liquibase,Oracle11g,Liquibase,我正在为数据库部署实现liquibase,这是liquibase的新手,正在学习它。 问题:我有pks/pkb包,我想使用liquibase部署它们,我故意在pkb包中添加错误更改pks中不存在的函数名。Liquibase总是以成功状态将这些包部署到数据库中,但当我使用Oracle SQL developer查看包时,发现它有编译错误。如果包中有错误,则应在部署失败时使用Liquibase。 我的感觉是:如果pks/pkb有任何编译错误,liquibase不应该部署它们,应该通过一个错误来完成

我正在为数据库部署实现liquibase,这是liquibase的新手,正在学习它。 问题:我有pks/pkb包,我想使用liquibase部署它们,我故意在pkb包中添加错误更改pks中不存在的函数名。Liquibase总是以成功状态将这些包部署到数据库中,但当我使用Oracle SQL developer查看包时,发现它有编译错误。如果包中有错误,则应在部署失败时使用Liquibase。 我的感觉是:如果pks/pkb有任何编译错误,liquibase不应该部署它们,应该通过一个错误来完成

注意:我使用的是包文件路径, 我的变更日志文件
这里的问题是,到目前为止,Liquibase只在JDBC驱动程序从创建或更新包体返回错误代码时报告错误。。。陈述但是,Oracle RDBMS不会将包或包体编译期间的错误计算为语句错误。对于复杂的项目,尤其是当存在循环类型依赖关系时,即使代码很好,也常常无法完全避免编译错误。这就是为什么在每个过程/包/函数之后立即检查对象状态不一定是个好主意的原因

在我们的软件项目中,我们使用了一个额外的变更集,它实际上只执行每次在部署结束时运行的验证runAlways=true。在这里,我们在DBMS_实用程序下面执行PL/SQL块,它不需要任何特殊的执行特权IIRC。如果架构中存在任何无效对象,这些对象也可能是不同的对象类型,例如同义词。。。将引发语句/运行时异常。在我们的开发团队中,我们制定了一条规则,即在每次成功的模式迁移之后,不可能存在无效对象

注意:如果使用一个Liquibase会话来更改多个模式中的对象,则需要修改下面的脚本以支持该操作。该脚本是为单模式部署而创建的

DECLARE
  v_num_errors INTEGER;
BEGIN
  /* Executing this twice seems to be necessary with Oracle on occasion, cannot really say why */
  DBMS_UTILITY.COMPILE_SCHEMA(schema => USER, compile_all => FALSE);
  DBMS_UTILITY.COMPILE_SCHEMA(schema => USER, compile_all => FALSE);

  SELECT COUNT(*) INTO v_num_errors FROM user_objects WHERE status<>'VALID';

  IF v_num_errors > 0 THEN
    RAISE_APPLICATION_ERROR(-20000, 'At least one object in the schema is invalid. Please execute '
      || 'SELECT * FROM user_errors to see the details.');
  END IF;
END;
/

上面的代码将编译数据库中的所有包。我想部署test1.pkb和test2.pkb,因此如果在任何包中存在任何编译错误,它应该会使部署失败并抛出编译错误。根据您的建议,我正在尝试的代码是,BEGIN DBMS\u UTILITY.COMPILE\u SCHEMAschema=>PKG\u ENTITYNOTESORDSDEVOPS,COMPILE\u all=>FALSE;终止如果我做错了什么,请告诉我