|
36 | 36 | import oracle.r2dbc.OracleR2dbcTypes;
|
37 | 37 | import oracle.r2dbc.OracleR2dbcWarning;
|
38 | 38 | import oracle.r2dbc.test.DatabaseConfig;
|
| 39 | +import oracle.r2dbc.test.TestUtils; |
39 | 40 | import oracle.sql.json.OracleJsonFactory;
|
40 | 41 | import oracle.sql.json.OracleJsonObject;
|
41 | 42 | import org.junit.jupiter.api.Test;
|
@@ -3092,6 +3093,78 @@ public void testReturnParameterJsonDualityView() {
|
3092 | 3093 | }
|
3093 | 3094 | }
|
3094 | 3095 |
|
| 3096 | + /** |
| 3097 | + * Verifies inserts and queries with a JSON Duality View. |
| 3098 | + */ |
| 3099 | + @Test |
| 3100 | + public void testJsonDualityView() { |
| 3101 | + // JSON Duality Views were introduced in Oracle Database version 23c, so |
| 3102 | + // this test is skipped if the version is older than 23c. |
| 3103 | + assumeTrue(databaseVersion() >= 23, |
| 3104 | + "JSON Duality Views are not supported by database versions older than" + |
| 3105 | + " 23"); |
| 3106 | + |
| 3107 | + Connection connection = awaitOne(sharedConnection()); |
| 3108 | + try { |
| 3109 | + awaitExecution(connection.createStatement( |
| 3110 | + "CREATE TABLE testJsonDualityViewTable (" + |
| 3111 | + "id NUMBER PRIMARY KEY, value VARCHAR(1000))")); |
| 3112 | + awaitExecution(connection.createStatement( |
| 3113 | + "CREATE JSON DUALITY VIEW testJsonDualityView AS" + |
| 3114 | + " SELECT JSON {'id' : t.id, 'value' : t.value}" + |
| 3115 | + " FROM testJsonDualityViewTable t" + |
| 3116 | + " WITH INSERT UPDATE DELETE")); |
| 3117 | + |
| 3118 | + // Verify an insert |
| 3119 | + OracleJsonObject insertObject = new OracleJsonFactory().createObject(); |
| 3120 | + insertObject.put("id", 1); |
| 3121 | + insertObject.put("value", "a"); |
| 3122 | + Statement insert = connection.createStatement( |
| 3123 | + "INSERT INTO testJsonDualityView VALUES (?)") |
| 3124 | + .bind(0, insertObject); |
| 3125 | + awaitUpdate(1, insert); |
| 3126 | + |
| 3127 | + // Verify a query |
| 3128 | + Statement query = connection.createStatement( |
| 3129 | + "SELECT data FROM testJsonDualityView"); |
| 3130 | + Result queryResult = awaitOne(query.execute()); |
| 3131 | + OracleJsonObject queryObject = |
| 3132 | + awaitOne(queryResult.map(row -> row.get(0, OracleJsonObject.class))); |
| 3133 | + queryObject = |
| 3134 | + new OracleJsonFactory().createObject(queryObject); |
| 3135 | + queryObject.remove("_metadata"); // Remove this field for assertEquals |
| 3136 | + assertEquals(insertObject, queryObject); |
| 3137 | + |
| 3138 | + // Verify an update that returns generated keys |
| 3139 | + OracleJsonObject updateObject = new OracleJsonFactory().createObject(); |
| 3140 | + updateObject.put("id", 1); |
| 3141 | + updateObject.put("value", "b"); |
| 3142 | + Statement update = connection.createStatement( |
| 3143 | + "UPDATE testJsonDualityView v" + |
| 3144 | + " SET data = ?" + |
| 3145 | + " WHERE v.data.id = ?"); |
| 3146 | + update.bind(0, updateObject); |
| 3147 | + update.bind(1, 1); |
| 3148 | + update.returnGeneratedValues("data"); |
| 3149 | + Result updateResult = awaitOne(update.execute()); |
| 3150 | + OracleJsonObject generatedUpdateObject = |
| 3151 | + awaitOne(updateResult.map(row -> row.get(0, OracleJsonObject.class))); |
| 3152 | + generatedUpdateObject = |
| 3153 | + new OracleJsonFactory().createObject(generatedUpdateObject); |
| 3154 | + generatedUpdateObject.remove("_metadata"); // Remove this field for assertEquals |
| 3155 | + assertEquals(updateObject, generatedUpdateObject); |
| 3156 | + |
| 3157 | + } |
| 3158 | + finally { |
| 3159 | + tryAwaitExecution(connection.createStatement( |
| 3160 | + "DROP VIEW testJsonDualityView")); |
| 3161 | + tryAwaitExecution(connection.createStatement( |
| 3162 | + "DROP TABLE testJsonDualityViewTable")); |
| 3163 | + tryAwaitNone(connection.close()); |
| 3164 | + } |
| 3165 | + |
| 3166 | + } |
| 3167 | + |
3095 | 3168 | /**
|
3096 | 3169 | * Connect to the database configured by {@link DatabaseConfig}, with a
|
3097 | 3170 | * the connection configured to use a given {@code executor} for async
|
|
0 commit comments