好的,首先,我是 Caché 的菜鸟,所以代码可能会很差,但是......
我需要能够在 Java 中查询 Caché 数据库,以便从 Studio 中重建源文件。
我可以毫无问题地转储方法等,但是有一件事让我无法理解……出于某种原因,我无法EXTENTQUERYSPEC
从类Samples.Person
(命名空间:)中转储参数的属性SAMPLES
。
该课程在 Studio 中如下所示:
Class Sample.Person Extends (%Persistent, %Populate, %XML.Adaptor)
{
Parameter EXTENTQUERYSPEC = "Name,SSN,Home.City,Home.State";
// etc etc
}
这是程序的代码:
CREATE PROCEDURE CacheQc.getParamDesc(
IN className VARCHAR(50),
IN methodName VARCHAR(50),
OUT description VARCHAR(8192),
OUT type VARCHAR(50),
OUT defaultValue VARCHAR(1024)
) RETURNS NUMBER LANGUAGE COS {
set ref = className _ "||" _ methodName
set row = ##class(%Dictionary.ParameterDefinition).%OpenId(ref)
if (row = "") {
quit 1
}
set description = row.Description
set type = row.Type
set defaultValue = row.Default
quit 0
}
和Java代码:
private void getParamDetail(final String className, final String paramName)
throws SQLException
{
final String call
= "{ ? = call CacheQc.getParamDesc(?, ?, ?, ?, ?) }";
try (
final CallableStatement statement = connection.prepareCall(call);
) {
statement.registerOutParameter(1, Types.INTEGER);
statement.setString(2, className);
statement.setString(3, paramName);
statement.registerOutParameter(4, Types.VARCHAR);
statement.registerOutParameter(5, Types.VARCHAR);
statement.registerOutParameter(6, Types.VARCHAR);
statement.executeUpdate();
final int ret = statement.getInt(1);
// HERE
if (ret != 0)
throw new SQLException("failed to read parameter");
System.out.println(" description: " + statement.getString(4));
System.out.println(" type : " + statement.getString(5));
System.out.println(" default : " + statement.getString(6));
}
}
现在,对于前面提到的类/参数对,标记的条件// HERE
总是被触发,因此抛出异常......如果我评论整行,那么我看到所有三个OUT
参数都是空的,甚至defaultValue
!
我本来希望后者具有 Studio 中提到的价值......
那么,为什么会发生这种情况?我的程序是否有些损坏?