1

我在我的应用程序中嵌入了 derbyDB,我目前正在测试我的代码。

如果我发送以下 SQL 代码

set current schema  [newSchemaName];

从 ij 然后我可以设置模式和来自数据库的响应

show tables;

将仅报告先前确定的 newSchemaName 中存在的表(尽管这似乎并不总是有效!)

如果我从 java 代码做类似的事情,然后执行

getCurrentConection.getSchema();

从上面返回的值从不建议在 SQL 中传递 newSchemaName(尽管如果我使用准备好的语句,它会按预期返回 newSchemaName)。

这是一些额外的背景信息...

我有默认数据库名称“derbyTest”并创建了 3 个其他模式。管理员 S1 S2 从逻辑上分离/隐藏用户不需要知道的信息

我需要在操作期间更改架构(例如:如果需要查看更多“微妙”信息,管理员将更改架构)。

为此,我为 setSchema(String newSchemaName) 创建了一个方法,该方法创建模式(如果它不存在)然后连接到它。

但是在运行代码片段之后

/**
*method to change to a given schema
*@param newSchemaName the new schema to change to
/
public void SetSchema(String newSchemaName){

String sql = newSchemaName.toUpperCase();//make sure the newSchemaName is in upper case.

ResultSet rs;
        try
        {
            rs = this.sendQry("select schemaName from sys.sysschemas where schemaname = '" + sql + "'");//does this schema exist in the DB
        if (rs.next()) 
        {//the schema already exists
                //send some messages to the user about the change of schema
            errLog.setDevError(1, "derbyDB schema" +sql +" already exists ");
            errLog.add(2, "connecting to " + sql);
                //next line create the SQL for changing to the newSchemaName supplied
            this.sendSQL("set current schema " + sql);//connect to the schema
                //log a message to display the current schema in the DB
                //this next log never shows a change to the newSchemaName unless
                //I use a prepared statement in my java code.
            errLog.add(1, "current DB schema is " + getCurrentConection.getSchema();
    }
        else{//the schema does not exist
        //send a message to the user and output log
        errLog.setDevError(1, "derbyDB schema" +sql +" does not exist ");
        //code to send message asking if user wants to create the new schema....
        }

}//end try
        catch{
//catch errors


}
}//end method

如果我查看文档http://db.apache.org/derby/docs/dev/ref/rrefsqlj32268.html来设置架构,我的 SQL 是正确的,并且如果我直接从 ij 运行,代码就可以工作。

我知道 ij 和客户端之间存在一些差异(诸如 describe 之类的功能在客户端中不起作用,您需要使用元数据来放屁)。

设置模式语句的情况是否相同。或者这仅适用于我即将测试的准备好的语句。

如果是这样,那就引出了一个问题,为什么我只能从准备好的语句中更改模式?

想法和评论被极大地接受。

大卫

编辑:准备好的语句用于更改架构。所以现在只剩下第二个问题了。为什么准备好的陈述和普通陈述之间的区别......我认为谷歌的时间?

编辑:我不知道这是否会有所作为,但我在 Windows 平台上,使用标准 JDK (6),并且 eclipse indigo 在 eclipse 中运行 jUnit 测试。如果它可能有助于排除故障,我还可以使用 opendJDK 在 Linux(ubuntu) 上进行测试。

4

1 回答 1

0

我不确定你的问题是什么。

您可以在表引用中明确指定架构,如下所示:

SELECT * FROM S1.TABLE_NAME

或者

UPDATE S2.TABLE_NAME SET COL1=VALUE1

等等

或者,如果您愿意,您可以从表引用中省略模式名称,仅说:

SELECT * FROM TABLE_NAME

或者

UPDATE TABLE_NAME SET COL1=VALUE1

等等,在这种情况下,您需要为这些语句建立一个隐式模式,方法是发出 SET SCHEMA 语句,或者使用现有的默认模式,该模式与您登录时的用户名匹配。

我认为您关于准备好的语句与未准备好的语句的问题与这样一个事实有关,即如果您没有指定显式模式,则在准备语句时会建立默认模式名称。

如果是我,并且我关心我使用的是什么模式,我会在我的所有 SQL 语句中的所有表引用中明确指定模式,然后我会确定我什么时候使用的模式。

于 2012-08-15T02:24:21.797 回答