每插入一个+1就增加一个值

时间:2019-06-06 04:20:46

标签: sql oracle plsql

我正在尝试在表中插入18000个值,对于order_id列,该值将增加1,对于其余列,只需插入select返回的内容即可。 当我尝试运行查询时,它将返回存储该值的变量,该变量似乎为null。

这是我尝试过的:

  DECLARE

    order_id1 number := 1;
    OrderID   VARCHAR2(100);
    i         number := 1;

  begin

    WHILE i < 18000 LOOP

      INSERT INTO Dummy_Table
        SELECT OrderID,
               CREATION_DATE,
               email,
               FIRST_NAME,
               FIX_NO,
               mobile_no,
               SECOND_NAME,
               SECOND_PHONE_NO,
               TITLE

          from Dummy_Table

      i := i + 1;
      OrderID := 'ABC' || to_char(order_id1 + 1);

    END LOOP;
  END;

在OrderID变量中存储了我希望以1递增的字符串,并将其插入到dummy_Table的order_id列中。

错误消息是:

  

ORA-01400无法将null插入(“ Dummy_Table”。“ order_id”   在第11行

3 个答案:

答案 0 :(得分:1)

您声明了orderID但未设置值

然后您尝试插入此空值(此处发生错误)

然后您为orderID设置一个值


交换操作顺序(分配在插入上方),以便在首次尝试插入操作之前为它提供一个值,或者像在其他两个变量中一样,在声明部分为orderID提供初始值


顺便说一句,我相信这段代码只会插入17999个值,比您的“我的表中需要18000个值”少了

答案 1 :(得分:1)

似乎因为您仅在循环结束时分配了一个值。在第一次迭代中,OrderId始终为null。您必须在运行insert语句之前分配一个值。

While 
  OrderId := 'ABC' || to_char(order_id);
  Insert ...;
  order_id ++;

答案 2 :(得分:0)

public IEnumerator GetEnumerator() { yield return data[0]; yield return data[1]; yield return data[2]; yield return data[3]; yield return data[4]; } 在循环的第一次迭代中为null。

您可能要初始化OrderID

OrderID

,或在插入之前分配一个值:

OrderID   VARCHAR2(100) := 'ABC1'

,或者您可以摆脱两个OrderID := 'ABC' || to_char(order_id1 + 1); order_id1:= order_id1 +1; -- you didn't increment order_id1 for some reason INSERT INTO Dummy_Table OrderID变量:

order_id1

,或者您可以generate a list of numbers并一次插入所有记录,而无需使用循环:

INSERT INTO Dummy_Table
    SELECT 'ABC'||i,
           CREATION_DATE,
           email,
           FIRST_NAME,
           FIX_NO,
           mobile_no,
           SECOND_NAME,
           SECOND_PHONE_NO,
           TITLE
     from Dummy_Table;
i:=i+1;