将测试数据插入 Oracle 中的表/生成具有不同值的插入语句 (SQL) 的快速方法是什么?

问题描述

我正在尝试用测试数据填充我的表,但我正在寻找一种方法,无需为每个表重复复制和粘贴相同的插入语句并更改值。

是否有一种简单快速方法可以为每列创建一组具有不同数据的 INSERT 语句,例如从电子表格中获取数据并将它们插入到插入语句中?

解决方法

您可以使用 DBMS_RANDOM 包中的各种函数非常轻松地创建示例数据。

CREATE TABLE test_data
AS
        SELECT DBMS_RANDOM.VALUE (),DBMS_RANDOM.string ('x',20)
          FROM DUAL
    CONNECT BY LEVEL <= 100;
,

创建 2 个表,一个包含您要在测试中使用的数据,第二个是您的查询实际要使用的数据:

CREATE TABLE test_data_sources (
  test_id NUMBER,column1 NUMBER,column2 DATE,column3 VARCHAR2(20)
);

CREATE TABLE my_table (
  column1 NUMBER,column3 VARCHAR2(20)
);

然后,如果您想为第一次测试设置数据:

DELETE FROM my_table;
-- or TRUNCATE my_table;

INSERT INTO my_table ( column1,column2,column3 )
SELECT column1,column3
FROM   test_data_sources 
WHERE  test_id = 1;          -- replace with the id of whichever test you want to perform.

然后,您可以使用适当的数据对 MY_TABLE 表运行测试,然后重复并将表中的数据替换为下一次测试的数据。

您需要使用每次测试的适当数据填充 TEST_DATA_SOURCES 一次(如果需要,您可以从电子表格生成 DML 语句),但随后每次您想重新使用时都可以重复使用- 运行测试。

,

如果您有权访问目录对象和电子表格,则可以将该电子表格转换为 CSV,然后将其作为外部表加载。一旦它在外部表中,您就可以执行类似

INSERT INTO my_table ( column1,column3
FROM   <EXTERNAL-TABLE-NAME-GOES-HERE>
WHERE  test_id = 1; 

如果您使用的是 Oracle 18 或更高版本,则可以使用此处提供的答案:https://stackoverflow.com/a/49077724/1257557 看起来像这样:

SELECT time_id,prod_id,quantity_sold,amount_sold
FROM   EXTERNAL (   
    (time_id        DATE NOT NULL,prod_id        INTEGER NOT NULL,quantity_sold  NUMBER(10,2),amount_sold    NUMBER(10,2))     
    TYPE ORACLE_LOADER     
    DEFAULT DIRECTORY data_dir1 
    ACCESS PARAMETERS (
      RECORDS DELIMITED BY NEWLINE
      FIELDS TERMINATED BY '|')  -- You'll want to change this to a comma,if it's a CSV   
   LOCATION ('sales_9.csv') REJECT LIMIT UNLIMITED) sales_external;

值得注意的是,此解决方案要求您有权访问数据库服务器上的文件系统,以便您可以将文件放在数据库需要从中读取它们的任何文件夹中。如果您没有该访问权限,则此选项将不起作用。

如果您正在使用电子表格,您可以考虑创建列或宏,以便在您更新电子表格后为您生成插入语句,然后您只需将您的语句从那里复制/粘贴到 SQL Developer/SQLPlus/随便。