I am trying to create an alias for json_table command for H2 database so that i can wirte Unit tests for the same but when i tried various ways of creating it getting error everytime.
DROP ALIAS if exists JSON_TABLE;
CREATE ALIAS IF NOT EXISTS JSON_TABLE AS '
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import org.h2.tools.SimpleResultSet;
import org.json.JSONArray;
import org.json.JSONObject;
import java.lang.String;
java.sql.ResultSet jsonTable(java.lang.String json, java.lang.String key) throws java.sql.SQLException {
org.h2.tools.SimpleResultSet rs = new org.h2.tools.SimpleResultSet();
rs.addColumn("FIELD", Types.VARCHAR, 255, 0);
rs.addColumn("OLD_VALUE", Types.VARCHAR, 255, 0);
rs.addColumn("NEW_VALUE", Types.VARCHAR, 255, 0);
org.json.JSONArray jsonArray = new org.json.JSONArray(json);
for (int i = 0; i < jsonArray.length(); i++) {
org.json.JSONObject obj = jsonArray.getJSONObject(i);
rs.addRow(
obj.optString("field", null),
obj.optString("oldValue", null),
obj.optString("newValue", null)
);
}
return rs;
}';```
this is what I tried for the view below also tried creating separate class and writing path here for the alias in that case it is not able to find the class.
the view:
CREATE
OR REPLACE VIEW dummy.V AS
SELECT ROWNUM AS ID,
a.changed_at AS “CHANGED_AT”,
a.changed_by AS “CHANGED_BY”,
a.object_id AS “OBJECT_ID”,
a.order_id AS “ORDER_ID”,
a.order_type AS “ORDER_TYPE”,
a.object_type AS “OBJECT_TYPE”,
a.action AS “ACTION”,
a.task_id AS “TASK_ID”,
jt.FIELD AS FIELD,
jt.OLD_VALUE AS OLD_VALUE,
jt.NEW_VALUE AS NEW_VALUE
FROM dummy.Table a,
json_table(
a.changes, ‘$[*]’
COLUMNS (
FIELD VARCHAR2(255 CHAR) PATH ‘$.field’,
OLD_VALUE VARCHAR2(255 CHAR) PATH ‘$.oldValue’,
NEW_VALUE VARCHAR2(255 CHAR) PATH ‘$.newValue’
)
) jt
Error is :
`Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "/org/h2/dynamic/JSON_TABLE.java:7: error: illegal start of type00d00aimport java.sql.ResultSet;00d00a^00d00a/org/h2/dynamic/JSON_TABLE.java:7: error: <identifier> expected00d00aimport java.sql.ResultSet;00d00a ^00d00a/org/h2/dynamic/JSON_TABLE.java:8: error: illegal start of type00d00aimport java.sql.SQLException;00d00a^00d00a/org/h2/dynamic/JSON_TABLE.java:8: error: <identifier> expected00d00aimport java.sql.SQLException;00d00a ^00d00a/org/h2/dynamic/JSON_TABLE.java:9: error: illegal start of type00d00aimport java.sql.Types;00d00a^00d00a/org/h2/dynamic/JSON_TABLE.java:9: error: <identifier> expected00d00aimport java.sql.Types;00d00a ^00d00a/org/h2/dynamic/JSON_TABLE.java:10: error: illegal start of type00d00aimport org.h2.tools.SimpleResultSet;00d00a^00d00a/org/h2/dynamic/JSON_TABLE.java:10: error: <identifier> expected00d00aimport org.h2.tools.SimpleResultSet;00d00a ^00d00a/org/h2/dynamic/JSON_TABLE.java:11: error: illegal start of type00d00aimport org.json.JSONArray;00d00a^00d00a/org/h2/dynamic/JSON_TABLE.java:11: error: <identifier> expected00d00aimport org.json.JSONArray;00d00a ^00d00a/org/h2/dynamic/JSON_TABLE.java:12: error: illegal start of type00d00aimport org.json.JSONObject;00d00a^00d00a/org/h2/dynamic/JSON_TABLE.java:12: error: <identifier> expected00d00aimport org.json.JSONObject;00d00a ^00d00a/org/h2/dynamic/JSON_TABLE.java:13: error: illegal start of type00d00aimport java.lang.String;00d00a^00d00a/org/h2/dynamic/JSON_TABLE.java:13: error: <identifier> expected00d00aimport java.lang.String;00d00a ^00d00a14 errors00d00a"; SQL statement:
CREATE ALIAS IF NOT EXISTS JSON_TABLE AS '
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import org.h2.tools.SimpleResultSet;
import org.json.JSONArray;
import org.json.JSONObject;
import java.lang.String;
java.sql.ResultSet jsonTable(java.lang.String json, java.lang.String key) throws java.sql.SQLException {
org.h2.tools.SimpleResultSet rs = new org.h2.tools.SimpleResultSet();
rs.addColumn("FIELD", Types.VARCHAR, 255, 0);
rs.addColumn("OLD_VALUE", Types.VARCHAR, 255, 0);
rs.addColumn("NEW_VALUE", Types.VARCHAR, 255, 0);
org.json.JSONArray jsonArray = new org.json.JSONArray(json);
for (int i = 0; i < jsonArray.length(); i++) {
org.json.JSONObject obj = jsonArray.getJSONObject(i);
rs.addRow(
obj.optString("field", null),
obj.optString("oldValue", null),
obj.optString("newValue", null)
);
}
return rs;
}' [42000-224]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:514)
at org.h2.message.DbException.getJdbcSQLException(DbException.java:489)
at org.h2.message.DbException.get(DbException.java:223)
at org.h2.message.DbException.get(DbException.java:199)
at org.h2.util.SourceCompiler.handleSyntaxError(SourceCompiler.java:458)
at org.h2.util.SourceCompiler.javaxToolsJavac(SourceCompiler.java:361)
at org.h2.util.SourceCompiler$1.findClass(SourceCompiler.java:165)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:592)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
at org.h2.util.SourceCompiler.getClass(SourceCompiler.java:179)
at org.h2.util.SourceCompiler.getMethod(SourceCompiler.java:244)
at org.h2.schema.FunctionAlias.loadFromSource(FunctionAlias.java:134)
at org.h2.schema.FunctionAlias.load(FunctionAlias.java:122)
at org.h2.schema.FunctionAlias.init(FunctionAlias.java:109)
at org.h2.schema.FunctionAlias.newInstanceFromSource(FunctionAlias.java:101)
at org.h2.command.ddl.CreateFunctionAlias.update(CreateFunctionAlias.java:49)
at org.h2.command.CommandContainer.update(CommandContainer.java:169)
at org.h2.command.Command.executeUpdate(Command.java:256)
at org.h2.command.dml.RunScriptCommand.execute(RunScriptCommand.java:120)
at org.h2.command.dml.RunScriptCommand.update(RunScriptCommand.java:71)
at org.h2.command.CommandContainer.update(CommandContainer.java:169)
at org.h2.command.Command.executeUpdate(Command.java:256)
at org.h2.engine.Engine.openSession(Engine.java:280)
at org.h2.engine.Engine.createSession(Engine.java:201)
at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:343)
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:125)
at org.h2.Driver.connect(Driver.java:59)
at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138)
at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359)
at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201)
at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470)
at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561)
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:100)
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112)
at org.springframework.jdbc.datasource.DelegatingDataSource.getConnection(DelegatingDataSource.java:99)
at com.avaloq.crypto.repository.rls.delegates.RlsDataSource.getConnection(RlsDataSource.java:22)
at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:160)
at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:118)
at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:81)
... 114 more`
Ishank is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.