【问题标题】:How to insert 1000 rows into an Oracle database如何在 Oracle 数据库中插入 1000 行
【发布时间】:2021-07-30 12:06:20
【问题描述】:

我有这个存储过程:

create or replace procedure InsertProduct
    (product_name VARCHAR2, 
     product_price int, 
     product_description varchar2) 
as
begin
    insert into PRODUCT (name, price, description, create_date) 
    values (product_name, product_price, product_description, sysdate);
end;

我用它一次插入1000行:

begin
    for insert_loop in 1..1000 loop
        InsertProduct(dbms_random.string('x', 10), DBMS_RANDOM.value(low => 1, high => 100000) , dbms_random.string('x', 10));
        end loop;
        commit;
end;

delete from PRODUCT;

但是这个循环添加了随机记录,是否可以添加真实的产品记录,如果可以,怎么做?

【问题讨论】:

  • 这取决于。记录从何而来?应用程序是用什么语言和/或框架构建的?该过程是否公开为 REST 端点?您的过程可以在许多情况下工作,但不适用于其他情况(某些框架不允许您调用自定义 pl/sql 过程)。在您详细解释您的应用程序、您已经尝试过的内容(通过可重现的示例)以及遇到的错误之前,我不确定这里的任何人都可以为您提供帮助。
  • 真正的问题是:“如何在数据库中获取真实的产品名称?”这个问题无法回答,与 Oracle 或任何其他 DBMS 无关。此外,程序代码无法知道是不是真实。为什么你认为产品“gjngdl14525ayerlkblskfkl”是不真实的?
  • 因为你拼错了,@astentx。应该是“gjngdl14525ayerFkblskfkl”。

标签: oracle loops insert


【解决方案1】:

是否可以添加真实的产品记录

是的,只需使用真实数据调用您的程序 1000 次。

例如:

begin
  InsertProduct('Apple',    45, 'A red fruit');
  InsertProduct('Banana',   33, 'A yellow fruit');
  InsertProduct('Cucumber', 70, 'A green vegetable');
  InsertProduct('Date',      5, 'A brown fruit');
  commit;
end;

【讨论】:

    【解决方案2】:

    您是否考虑过使用FORALL?如果您能够为要插入的数据创建记录集合,则可以使用类似于以下示例的一条语句将它们全部插入。

    使用FORALL 也会使您的代码执行得更快,因为它只有 1 个包含所有记录的 INSERT 语句,而 1000 个单独的 INSERT 语句。

    DECLARE
        TYPE product_t IS TABLE OF product%ROWTYPE;
    
        l_products   product_t := product_t();
    BEGIN
        l_products.extend(3); --number of items we'll be creating
        l_products (1).name := 'name1';
        l_products (1).price := 1;
        l_products (1).description := 'description1';
        l_products (2).name := 'name2';
        l_products (2).price := 2;
        l_products (2).description := 'description2';
        l_products (3).name := 'name3';
        l_products (3).price := 3;
        l_products (3).description := 'description3';
    
        FORALL i IN 1 .. l_products.COUNT
            INSERT INTO product (name,
                                 price,
                                 description,
                                 create_date)
                 VALUES (l_products (i).name,
                         l_products (i).price,
                         l_products (i).description,
                         SYSDATE);
    END;
    

    如果您想了解如何创建示例数据,下面的示例将创建 1500 行示例数据。同样,这将比您提供的代码执行得更快,因为使用您的代码需要 1 INSERT 与 1500 INSERTs。

    DECLARE
        TYPE product_t IS TABLE OF product%ROWTYPE;
    
        l_products   product_t := product_t ();
    BEGIN
        FOR i IN 1 .. 1500
        LOOP
            l_products.EXTEND;
            l_products (i).name := DBMS_RANDOM.string ('x', 10);
            l_products (i).price := DBMS_RANDOM.VALUE (low => 1, high => 100000);
            l_products (i).description := DBMS_RANDOM.string ('x', 10);
        END LOOP;
    
        FORALL i IN 1 .. l_products.COUNT
            INSERT INTO product (name,
                                 price,
                                 description,
                                 create_date)
                 VALUES (l_products (i).name,
                         l_products (i).price,
                         l_products (i).description,
                         SYSDATE);
    END;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-07
      • 2014-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多