2015-04-27 37 views
0

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

我會預計後者在工作室中提到的價值...

那麼,爲什麼會出現這種情況?我的程序是否有些破裂?

回答

2

首先,你應該檢查你發送正確的值爲className和paramName,全名,並在正確的情況下。爲什麼選擇存儲過程,何時可以使用select?您可以在System Management Portal中調用您的過程來查看可能的錯誤。

select description, type,_Default "Default" from %Dictionary.ParameterDefinition where id='Sample.Person||EXTENTQUERYSPEC' 

你的例子對我很好。

package javaapplication3; 

import com.intersys.jdbc.CacheDataSource; 
import java.sql.CallableStatement; 
import java.sql.Connection; 
import java.sql.SQLException; 
import java.sql.Types; 

public class JavaApplication3 { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) throws SQLException { 

     CacheDataSource ds = new CacheDataSource(); 
     ds.setURL("jdbc:Cache://127.0.0.1:56775/Samples"); 
     ds.setUser("_system"); 
     ds.setPassword("SYS"); 
     Connection dbconnection = ds.getConnection(); 

     String call = "{ ? = call CacheQc.getParamDesc(?, ?, ?, ?, ?)}"; 
     CallableStatement statement = dbconnection.prepareCall(call); 
     statement.registerOutParameter(1, Types.INTEGER); 

     statement.setString(2, "Sample.Person"); 
     statement.setString(3, "EXTENTQUERYSPEC"); 

     statement.registerOutParameter(4, Types.VARCHAR); 
     statement.registerOutParameter(5, Types.VARCHAR); 
     statement.registerOutParameter(6, Types.VARCHAR); 

     statement.executeUpdate(); 

     int ret = statement.getInt(1); 

     System.out.println("ret = " + ret); 

     System.out.println("  description: " + statement.getString(4)); 
     System.out.println("  type  : " + statement.getString(5)); 
     System.out.println("  default : " + statement.getString(6)); 

    } 

} 

最終結果

ret = 0 
    description: null 
    type  : null 
    default : Name,SSN,Home.City,Home.State 

UPD: 嘗試改變你的程序的代碼,並添加一些調試喜歡這裏

Class CacheQc.procgetParamDesc Extends %Library.RegisteredObject [ ClassType = "", DdlAllowed, Owner = {UnknownUser}, Not ProcedureBlock ] 
{ 

ClassMethod getParamDesc(className As %Library.String(MAXLEN=50), methodName As %Library.String(MAXLEN=50), Output description As %Library.String(MAXLEN=8192), Output type As %Library.String(MAXLEN=50), Output defaultValue As %Library.String(MAXLEN=1024)) As %Library.Numeric(SCALE=0) [ SqlName = getParamDesc, SqlProc ] 
{ 
    set ref = className _ "||" _ methodName 
    set row = ##class(%Dictionary.ParameterDefinition).%OpenId(ref) 
    set ^debug($i(^debug))=$lb(ref,row,$system.Status.GetErrorText($g(%objlasterror))) 
    if (row = "") { 
     quit 1 
    } 
    set description = row.Description 
    set type = row.Type 
    set defaultValue = row.Default 
    quit 0 
} 

} 

,並從Java一些測試後,檢查zw ^debug

SAMPLES>zw ^debug 
^debug=4 
^debug(3)=$lb("Sample.Person||EXTENTQUERYSPEC","[email protected]%Dictionary.ParameterDefinition","ERROR #00: (no error description)") 
+0

那麼,對我來說,它不:(我也嘗試用戶'_SYSTEM',所以它看起來不像一個權限問題...起初我試着用一個只對樣本模式具有讀權限的用戶,其實我不知道你也可以用純SQL來做這件事,是的,參數是正確的 – fge

+0

你試過在int SMP中做什麼? – DAiMor

+0

任何你可以在studio中編輯這個類並添加一些調試的方式,如果該代碼無法打開對象,你應該得到%objlasterror wcich可以用$ system.Status.GetErrortext(%objlasterror)來解碼 – DAiMor

0

恩,呃,我發現了這個問題......談論愚蠢。

碰巧我在Studio中打開了Samples.Person類,並對它進行了「修改」並在之後刪除它。因此該文件是「作爲新的」...

但該程序似乎不同意這一說法。

我關閉了該文件所在的Studio,選擇不修改「更改」,再次重新執行該過程,並且它可以正常工作...

奇怪的是,即使我的「假修改」SQL查詢工作。我想這是一個緩存問題的問題...

相關問題