OK,首先,我是Caché的新手,所以代碼可能很差,但...自定義過程無法收集類參數的屬性;爲什麼?
我需要能夠查詢Java中的Caché數據庫以重建源文件走出工作室。
我可以轉儲方法等沒有麻煩,但有一件事逃脫我...出於某種原因,我不能轉儲類Samples.Person
(命名空間:SAMPLES
)參數EXTENTQUERYSPEC
的屬性。
類讀取像這樣的工作室:
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
!
我會預計後者在工作室中提到的價值...
那麼,爲什麼會出現這種情況?我的程序是否有些破裂?
那麼,對我來說,它不:(我也嘗試用戶'_SYSTEM',所以它看起來不像一個權限問題...起初我試着用一個只對樣本模式具有讀權限的用戶,其實我不知道你也可以用純SQL來做這件事,是的,參數是正確的 – fge
你試過在int SMP中做什麼? – DAiMor
任何你可以在studio中編輯這個類並添加一些調試的方式,如果該代碼無法打開對象,你應該得到%objlasterror wcich可以用$ system.Status.GetErrortext(%objlasterror)來解碼 – DAiMor