【问题标题】:How to verify if column is nullable in PLSQL如何验证列在 PLSQL 中是否可以为空
【发布时间】:2019-08-29 19:30:49
【问题描述】:

我正在开发 Oracle SQL Developer,对 oracle 还比较陌生。我创建了一个带有“插入 X...选择...”查询类型的包。 代码如下:

插入 my_table t1 (t1.a, t1.b, t1.c) 选择不同的 t2.a, t2.b, t2.c 来自 my_source t2 where ...

注意:my_table t1 和 my_source 的列都比 a、b 和 c 多,但理论上,或者至少在开发环境中,它们可以为空。我现在只对这些列感兴趣,但错误出现在“d”列上

它在开发环境中工作没问题,但是在生产环境中运行时会出现以下消息“ORA-01400: cannot insert NULL into ("Schema_name"."table_name"."table_colum_name")”。

我的理论是,不知何故,表格列在开发环境中可以为空,而不是在生产环境中。

我的问题是我无法直接访问生产环境表来验证这一点,因此我需要执行以下操作之一:

  1. 找到一种方法来查询 prod 中的表(很可能使用数据库链接)并验证该列是否可以为空) 或
  2. 为我的插入添加条件。但我插入第 1-3 列,它说第 4 列不能插入空值。因此,我认为这是不可行的。

我尝试了一些查询来检查:

  • 选择列属性(object_id('Schema.table','U'),'column','allowsnull');但这是针对 SQL 的。
  • 从 sys.colmns 中选择 is_nullable,其中 object_id = object_id('schema.table') 和 name = 'column';这告诉我该表不存在。我确定我的拼写(在我的真实代码中)。

感谢您的帮助

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    您能否仅针对生产运行您的选择语句?只是为了确认它没有空值,而您在开发中没有看到相同的输出。其次,您的开发环境是生产环境的副本/备份吗?如果不出意外,您应该能够请求管理您的生产实例的 DBA 将备份恢复到开发中。

    【讨论】:

    • select 语句在 prod 中按预期工作(使用 db 链接测试)。理论上环境是生产的副本,但绝非如此。在升级问题之前,这是我想要验证的(通过检查列在 prod 中是否可以为空)。关于如何做到这一点的任何建议?谢谢
    • 你可以试试这个,让我们检查一下默认值。我认为对于可空字段应该为空。从 DBA_TAB_COLUMNS 中选择 TABLE_NAME、COLUMN_NAME、DATA_DEFAULT,其中 TABLE_NAME = 'TABLE_NAME';
    【解决方案2】:

    你可能想要类似的东西

    select nullable
      from all_tab_columns
     where owner = '<<schema owner>>'
       and table_name = '<<table name>>'
       and column_name = '<<column name>>'
    

    注意

    • 在 99% 的情况下,ownertable_namecolumn_name 在数据字典中都应为大写。您可以在 Oracle 中使用区分大小写的标识符,但这种情况很少见。
    • 在 Oracle 中,有一种数据字典表模式,有 user_all_dba_ 变体。所以有一个user_tab_columns 显示有关您拥有的表的所有列的信息,一个dba_tab_columns 显示有关数据库中所有表的所有列的信息,还有一个all_tab_columns 显示有关所有列的信息您有权访问的所有表中。根据您拥有的权限和表的所有者,您可能能够使用dba_user_ 版本的数据字典表,而不是all_tab_columns

    【讨论】:

    • 这里有几个奇怪的概念: 1. 相信 DBMS。如果您遇到 NULL 约束违规,则该列被定义为 NOT NULL。 2. 要求 DBA 验证并纠正错误的环境。
    猜你喜欢
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多