2 votes

Pourquoi puis-je invoquer une fonction HSQL avec SELECT mais pas avec CALL ?

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

2voto

fredt Points 10785

La syntaxe correcte pour sélectionner la table retournée par cette fonction est la suivante :

SELECT * FROM TABLE(F())

0voto

jalogar Points 316

Il semble qu'elle ne soit pas encore mise en œuvre.

Actuellement, une FONCTION HSQLDB ne peut pas avoir de paramètres de sortie. Elle peut retourner un résultat ou tableau à valeur unique, qui est renvoyé par l'appel execute().

http://sourceforge.net/tracker/index.php?func=detail&aid=3530755&group_id=23316&atid=378134

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X