【问题标题】:Bitwise operator in apache derbyapache derby 中的位运算符
【发布时间】:2012-06-19 12:51:37
【问题描述】:

我想知道 Derby 是否支持 SQL 语句中的位运算符。 我可以在功能列表中看到真值测试为“是”。 以下是相同的链接:

http://db.apache.org/derby/docs/10.2/ref/rrefsql9241891.html

我想执行这样的查询: 从 APP.TEST 中选择 a 和 b;

谢谢

尝试通过在derby中定义一个函数来实现上述功能:

CREATE FUNCTION BitAnd(a SMALLINT, b SMALLINT) RETURNS SMALLINT
    PARAMETER STYLE JAVA NO SQL LANGUAGE JAVA
    EXTERNAL NAME 'derby.routines.BitAnd.bitAnd';

接下来,我调用了以下函数在 derby 类路径上具有上述功能, 调用 SQLJ.install_jar

('path\to\db\functions.jar', 'APP.functions', 0);

调用 SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY

('derby.database.classpath', 'APP.functions');

成功执行上述sp调用,随后创建jar目录,文件为path\to\db\jar\APP\FUNCTIONS.jar.G1340195863482

但是当我尝试在我的 java 代码中调用这个函数时:

deleteAgentStats = dbConnection.prepareStatement("select bitAnd(a,b) AS \"result\" from APP.TEST");
ResultSet andResult = deleteAgentStats.executeQuery();
if(andResult.next()){
        System.out.println("heyyyyyyyyyyyyyyyyyyyyyyyyy :: 
"+andResult.getInt("result"));
}

我得到以下异常:

Caused by: java.sql.SQLSyntaxErrorException: The class 'derby.routines.BitAnd' does not exist or is inaccessible. This can happen if the class is not public.
    at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.Util.seeNextException(Unknown Source)
    at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown Source)
    at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedPreparedStatement.<init>(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedPreparedStatement20.<init>(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedPreparedStatement30.<init>(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedPreparedStatement40.<init>(Unknown Source)
    at org.apache.derby.jdbc.Driver40.newEmbedPreparedStatement(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(Unknown Source)
    at org.apache.commons.dbcp.DelegatingConnection.prepareStatement(DelegatingConnection.java:281)
    at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.prepareStatement(PoolingDataSource.java:313)
    at primary.db.AgentStatisticsDAO.deleteAgentStatistics(AgentStatisticsDAO.java:507)
    ... 11 more
Caused by: java.sql.SQLException: The class 'derby.routines.BitAnd' does not exist or is inaccessible. This can happen if the class is not public.
    at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown Source)
    ... 28 more
Caused by: java.sql.SQLException: Java exception: 'derby.routines.BitAnd: java.lang.ClassNotFoundException'.
    at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown Source)
    at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.Util.javaException(Unknown Source)
    at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source)
    ... 25 more
Caused by: java.lang.ClassNotFoundException: derby.routines.BitAnd
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1643)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1488)
    at java.lang.ClassLoader.loadClassInternal(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at org.apache.derby.impl.services.reflect.ReflectClassesJava2.loadClassNotInDatabaseJar(Unknown Source)
    at org.apache.derby.impl.services.reflect.DatabaseClasses.loadApplicationClass(Unknown Source)
    at org.apache.derby.iapi.services.loader.ClassInspector.getClass(Unknown Source)
    at org.apache.derby.iapi.services.loader.ClassInspector.accessible(Unknown Source)
    at org.apache.derby.impl.sql.compile.QueryTreeNode.verifyClassExist(Unknown Source)
    at org.apache.derby.impl.sql.compile.StaticMethodCallNode.bindExpression(Unknown Source)
    at org.apache.derby.impl.sql.compile.JavaToSQLValueNode.bindExpression(Unknown Source)
    at org.apache.derby.impl.sql.compile.ResultColumn.bindExpression(Unknown Source)
    at org.apache.derby.impl.sql.compile.ResultColumnList.bindExpressions(Unknown Source)
    at org.apache.derby.impl.sql.compile.SelectNode.bindExpressions(Unknown Source)
    at org.apache.derby.impl.sql.compile.DMLStatementNode.bindExpressions(Unknown Source)
    at org.apache.derby.impl.sql.compile.DMLStatementNode.bind(Unknown Source)
    at org.apache.derby.impl.sql.compile.CursorNode.bindStatement(Unknown Source)
    at org.apache.derby.impl.sql.GenericStatement.prepMinion(Unknown Source)
    at org.apache.derby.impl.sql.GenericStatement.prepare(Unknown Source)
    at org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement(Unknown Source)
    ... 21 more

请帮忙。

【问题讨论】:

    标签: function derby bitwise-operators


    【解决方案1】:

    这可能是使用 Derby 的 Java 可扩展性的好例子。考虑用 Java 编写位操作例程,然后从 Derby SQL 调用它们:http://wiki.apache.org/db-derby/DerbySQLroutines

    【讨论】:

    • 我创建了一个 derby 函数,但我无法调用该函数。我在调用该函数时总是得到“ClassNotFoundException”。
    • 好吧,您的代码必须在 Derby 类路径中可用,因为调用您的代码的是 Derby 引擎。在嵌入式配置中,这意味着它必须位于应用程序类路径中。在客户端/服务器配置中,这意味着它必须位于网络服务器的类路径中。这是一个涵盖这些主题的不错的博客:danvega.org/blog/2010/2/17/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 2021-05-14
    • 2012-11-09
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多