问题描述
我正在尝试用测试数据填充我的表,但我正在寻找一种方法,无需为每个表重复复制和粘贴相同的插入语句并更改值。
是否有一种简单快速的方法可以为每列创建一组具有不同数据的 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/随便。