【问题标题】:Insert statement with blank values without defining all columns插入带有空白值的语句而不定义所有列
【发布时间】:2021-03-12 20:00:34
【问题描述】:

我需要将 100 多行数据插入一个包含 25 个文本列的表中。 我只想在这些列中插入一些数据,其余的用空格表示。

(注意:PeopleSoft 表上的文本字段定义为 NOT NULLABLE,使用单个空格字符表示没有数据,而不是 null。)

有没有办法编写一个不定义所有列以及空格的插入语句。举个例子:

INSERT INTO CUST.RECORD(BUSINESS_UNIT, PROJECT_ID, EFF_STATUS, TMPL, DESCR) VALUES('TOO1','PROJ1','A','USA00','USA00 CONTRACT');

对于 CUST.RECORD 中的所有其他列,我想插入“”而不定义插入中的列或空格。

【问题讨论】:

  • 如果您只是想为单个 SQL 语句节省一些输入,那么您可能不走运。但是,如果这是您想要为许多插入或许多表重复的模式,那么有一些选项可以提供帮助。但是任何解决方案都需要创建 PL/SQL 对象,并且还取决于数据库版本。 (例如,可能有一种使用多态表函数的方法,但至少需要 18c 版本。)

标签: oracle peoplesoft


【解决方案1】:

一种方法是在表定义中设置一个默认值,如下所示:

CREATE TABLE CUST.RECORD(
  id          NUMBER DEFAULT detail_seq.NEXTVAL,
  master_id   varchar2(10) DEFAULT ' ',
  description VARCHAR2(30)
);

编辑:对于您的表格,您可以使用:

alter table  CUST.RECORD modify( col2 varchar2(10) default ' ' );

【讨论】:

  • 这可以工作,但表存在并且不能被删除/重新创建,而不仅仅是手动写出插入。我会把它放在我的后口袋里以备将来使用!
  • “一种方法是在表定义中设置默认值”不正确。只要一列可以为空——定义没有'not null'子句,它就可以在没有数据的情况下插入。
  • @EdStevens 看看这个blog.pythian.com/…
  • @FarshidShekari - 你的意思是什么?这篇文章展示了 oracle 如何改进其关于向表中添加 'not null with default' 列的内部处理。 OP 询问不必为每一列指定数据。也就是说,在第二次阅读时,我确实看到您在哪里写了“一种方法是设置默认值”,不知何故,我将“一种”读作“唯一”——“唯一的方法是……”我很抱歉。
【解决方案2】:

您不必为特定列提供值如果任一条件为真:

  1. 该列被定义为可为空。也就是说,它不是用“not null”子句定义的。

  1. 该列使用默认值定义

    SQL> 创建表 my_test(my_id 编号不为空, 2 fname varchar2(10), -- 可以为空 3 dob date default sysdate -- 默认值 4) 5 ;

    表已创建。

    SQL> -- SQL> -- 只为 my_id 提供值 SQL> 插入 my_test(my_id) 值 (1);

    已创建 1 行。

    SQL> -- SQL> -- 并查看结果 SQL> 选择 * 2 来自 my_test;

      MY_ID FNAME      DOB
    

          1            12-MAR-21
    

    已选择 1 行。

    SQL> -- SQL> 选择 my_id, 2 nvl(fname,'NULL'), 3 出生日期 4 来自 my_test;

      MY_ID NVL(FNAME, DOB
    

          1 NULL       12-MAR-21
    

    已选择 1 行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 2013-02-01
    • 2019-03-06
    • 2016-04-15
    • 1970-01-01
    相关资源
    最近更新 更多