如何验证PLSQL中的列是否可为空

时间:2019-08-29 19:30:49

标签: oracle plsql

我正在研究Oracle SQL Developer,并且对oracle来说还比较陌生。我创建了一个带有“插入X ... select ...”查询类型的包。 代码如下:

  

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

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

它可以在开发环境中正常工作,但是在生产环境中运行时,会出现以下消息“ ORA-01400:无法将NULL插入(“ Schema_name”。“ table_name”。“ table_colum_name”)“。

我的理论是,表列在开发环境中而不是在生产环境中某种程度上可以为空。

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

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

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

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

谢谢您的帮助

2 个答案:

答案 0 :(得分:0)

您能否仅对生产运行select语句?只是为了确认在开发中没有看到相同输出的情况下它没有空值。其次,您的开发环境是否是生产环境的副本/备份?如果没有其他要求,您应该能够要求由管理您的生产实例的DBA将备份还原到开发中。

答案 1 :(得分:0)

您可能想要类似的东西

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