Selon le Documentation HSQL seules les procédures SQL nécessitent CALL
la syntaxe. J'écris une fonction SQL mais je ne peux pas SELECT
d'elle. Je ne peux que CALL
il. Quelqu'un peut-il voir quelque chose que j'ai manqué ? Voici mon code
public static void main(String[] args) throws Exception {
Class<?> driverClass = Class.forName("org.hsqldb.jdbcDriver");
JDBCDriver driver = (JDBCDriver) driverClass.newInstance();
Properties props = new Properties();
props.setProperty("user", "sa");
props.setProperty("password", "");
Connection c = driver.connect("jdbc:hsqldb:mem:aname", props);
execute(c, "CREATE TABLE T (i INT)");
execute(c, "INSERT INTO T VALUES (1)");
execute(c, "CREATE FUNCTION f() RETURNS TABLE (i INT) READS SQL DATA " +
" RETURN TABLE (SELECT * FROM T)");
System.out.println("Call returns the ResultSet:");
execute(c, "{ CALL f() }");
try {
execute(c, "SELECT * FROM f()");
} catch (Exception e) {
System.out.println("Select throws the exception:");
System.out.println(e);
}
}
private static void execute(Connection c, String sql) throws SQLException {
Statement s = c.createStatement();
try {
s.execute(sql);
ResultSet rs = s.getResultSet();
if (rs != null) {
printResultSet(rs);
}
} finally {
s.close();
}
}
private static void printResultSet(ResultSet rs) throws SQLException {
try {
while (rs.next()) {
int columnCount = rs.getMetaData().getColumnCount();
for (int i = 1; i <= columnCount; i++) {
System.out.println(rs.getObject(i));
}
}
} finally {
rs.close();
}
}
J'obtiens le résultat :
Call returns the ResultSet:
1
Select throws the exception:
java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: F