将控制台输出从insert汇总到docker oracle数据库

hmae6n7t  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(105)

使用Oracle 23 Docker镜像我有大量的测试数据,需要运行到数据库中,以便开发人员使用图像。
我知道我可以把.sql脚本放到图像上的/docker-entrypoint-initdb.d/startup中,它们将自动在图像上通过SQL Plus运行。
问题是我不想看到

db_1      | 1 row created.
db_1      |
db_1      |
db_1      | 1 row created.
db_1      |
db_1      |
db_1      | 1 row created.
db_1      |
db_1      |
db_1      | 1 row created.
db_1      |
db_1      |
db_1      | 1 row created.
db_1      |
db_1      |
db_1      | 1 row created.
db_1      |
db_1      |
(etc...)
db_1      | Commit complete.

在我的控制台输出中。我宁愿看到这样的东西:

db_1      | 10,000 rows created.
db_1      |
db_1      |
db_1      | Commit complete.

或者甚至分成100个或更多的组会大大减少输出量。
这可能吗?
我试过使用INSERT ALL...,但它仍然单独打印每个插入。
如果可能的话,最终的脚本应该向后兼容19c。

mftmpeh8

mftmpeh81#

选项一:多路复用(您当前的解决方案)

如果您这样做:

INSERT INTO table1 (a, b, c) VALUES (1, 2, 3);

INSERT INTO table1 (a, b, c) VALUES (4, 5, 6);

INSERT INTO table2 (d, e) VALUES (7, 8);

然后,你会得到每一行的语句:

选项二:使用INSERT ... SELECT插入多行

如果您这样做:

INSERT INTO table1 (a, b, c)
SELECT 1, 2, 3 FROM DUAL UNION ALL
SELECT 4, 5, 6 FROM DUAL;

INSERT INTO table2 (d, e) VALUES (7, 8);

然后,您将获得每个表的语句:

2 rows affected
1 rows affected

选项三:使用INSERT ALL插入多行

如果您这样做:

INSERT ALL
  INTO table1 (a, b, c) VALUES (1, 2, 3)
  INTO table1 (a, b, c) VALUES (4, 5, 6)
  INTO table2 (d, e) VALUES (7, 8)
SELECT 1 FROM DUAL;

然后你会得到一个针对所有表的语句:

3 rows affected

选项四:在PL/SQL块中 Package 插入

你还可以做的是将所有INSERT语句 Package 在一个PL/SQL匿名块中:

BEGIN
  INSERT INTO table1 (a, b, c) VALUES (1, 2, 3);
  INSERT INTO table1 (a, b, c) VALUES (4, 5, 6);
  INSERT INTO table2 (d, e) VALUES (7, 8);
END;
/

然后你会得到一个关于整个块成功(或失败)的声明:
所有这些陈述都应该与大多数(所有?)Oracle版本。
Oracle 11g Fiddle

相关问题