まず第一に、私はCachéの新人なので、コードはおそらく貧弱ですが...
Studio からソース ファイルを再構築するには、Java で Caché データベースにクエリを実行できる必要があります。
メソッドなどを問題なくダンプできますが、1つだけ避けられないことがあります... 何らかの理由で、EXTENTQUERYSPEC
クラスSamples.Person
(namespace: 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));
}
}
さて、前述のクラス/パラメーターのペアでは、マークされた条件が常にトリガーされるため、例外がスローされます...行全体をコメントすると、3つのパラメーターすべてがnullであることが// HERE
わかります.OUT
defaultValue
後者にはスタジオで言及されている値があると予想していました...
それで、なぜこれが起こるのですか?私の手順は多少壊れていますか?