Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

summarising console output from inserts into a docker oracle database

I am using the official Oracle 23 Docker image. I have a large amount of test data which needs to be run into the database so it’s available for developers using the image.

I know I can put the .sql scripts into /docker-entrypoint-initdb.d/startup on the image, and they will be run through SQL Plus on the image automatically.

The thing is, I don’t want to see:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

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.

In my console output. I’d rather instead just see something like:

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

Or even batching into groups of 100 or something would greatly reduce the amount of output.

Is this possible?

I have tried using INSERT ALL... but this still prints each insert individually.

The final script should be backwards compatible with 19c if possible.

>Solution :

Option 1: Multiple Inserts (your current solution)

If you do:

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);

Then you get statements for each row:

1 rows affected
1 rows affected
1 rows affected

Option 2: Multiple row inserts using INSERT ... SELECT

If you do:

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);

Then you get statements for each table:

2 rows affected
1 rows affected

Option 3: Multiple row inserts using INSERT ALL

If you do:

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;

Then you get a single statement for all tables:

3 rows affected

Option 4: Wrap inserts in a PL/SQL block

What you can also do is wrap all the INSERT statements in a PL/SQL anonymous block:

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;
/

Then you get a single statement for success (or failure) of the entire block:

1 rows affected

All these statements should be compatible with most (all?) Oracle versions.

Oracle 11g Fiddle

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading