共用方式為


REF CURSORS 的訊息結構描述

REF CURSOR 是 Oracle PL/SQL 資料類型,代表 Oracle 資料庫中結果集的指標。 REF CURSOR 類型可啟用資料的輸入和輸出串流,非常適合用於在 PL/SQL 程式碼區塊中傳送大量資料。 Microsoft BizTalk Adapter for Oracle Database 支援將強型別和弱式類型的 REF CURSOR 參數傳遞至 PL/SQL 程式和函式做為 IN、OUT 和 IN OUT 參數。

在 Oracle 資料庫中,REF CURSOR 類型可以是強型別或弱型別:

  • 強型別的 REF CURSOR 是以 RETURN 子句宣告為 中的 TYPE StrongCurType IS REF CURSOR RETURN emp%ROWTYPE; 。 強型別的 REF CURSOR 變數只能代表結果集,其中包含符合其 REF CURSOR 類型宣告之型別的資料。 Oracle Database 配接器會傳回強型別 REF CURSOR 的強型別結果集。

  • 弱式類型的 REF CURSOR 在 中宣告時沒有 RETURN 子句 TYPE WeakCurType IS REF CURSOR; 。 Oracle 也提供稱為 SYS_REFCURSOR 的特殊 REF CURSOR 類型,可用來宣告弱式類型的 REF CURSOR 變數。 弱型別的 REF CURSOR 變數可以代表包含任何資料列資料的結果集。 Oracle Database 配接器會針對弱式類型 REF CURSOR 傳回一般記錄的弱型別結果集。

IN REF CURSOR 參數

沒有 ODP.NET API 可在 Oracle 伺服器上建立 REF CURSOR,因此 Oracle 資料庫配接器無法為用戶端程式提供建立和維護 REF CURSOR 變數的功能。

不過,Oracle Database 配接器可藉由指定傳回 REF CURSOR 的 PL/SQL 程式碼區塊,讓用戶端將 IN REF CURSOR 參數傳遞至函式或預存程式。 配接器會使用此程式碼在 Oracle 伺服器上建立和開啟 REF CURSOR 變數;然後它會使用這個變數做為 IN 參數來呼叫函式或預存程式。

Oracle Database 配接器會將 IN REF CURSOR 參數表示為包含 PL/SQL 程式碼區塊的字串。 在此區塊中,REF CURSOR 的位置是以問號指定 (?) 。 PL/SQL 程式碼區塊可以包含包含 SQL 查詢的 OPEN-FOR 語句;或者,它可以包含函式或程序呼叫,其中開啟的 REF CURSOR 會在 OUT 參數中傳回。

下列示範如何藉由呼叫預存程式或函式來開啟 REF CURSOR 來指定 IN REF CURSOR。

<[IN_REF_CURSOR_PARAM_NAME]>begin [SP_NAME]([SP_PARAMS...], ?, [SP_PARAMS...]); end;</[IN_REF_CURSOR_PARAM_NAME]>  
  
Example:  
<EMP_RC>begin GETEMP(1, ?); end; </EMP_RC>  

以下顯示如何使用 SELECT 查詢來開啟 REF CURSOR 來指定 IN REF CURSOR。

<IN_REF_CURSOR_PARAM_NAME>begin open ? for select [FIELD_NAMES] from [TABLE_NAME]; end;</IN_REF_CURSOR_PARAM_NAME>  
  
Example:  
<EMP_RC>begin open ? for select * from EMP; end;</EMP_RC>  

OUT REF CURSOR 參數

OUT REF CURSOR 參數會以強型別或弱式類型的結果集傳回。 傳回的結果集類型取決於 REF CURSOR 參數在 Oracle 伺服器上的預存程式或函式定義中宣告為強型別或弱型別 REF CURSOR。 強型別的 REF CURSOR 參數會傳回強型別的結果集,而弱型別的 REF CURSOR (參數則會傳回弱型別結果集,例如,以SYS_REFCURSOR類型宣告的參數) 。

以下顯示強型別 OUT REF CURSOR 參數的 XML。

<[PARAM_NAME]>  
 <[PARAM_NAME]RECORD>  
  <[COL1_NAME]>value1</[COL1_NAME]>  
  <[COL2_NAME]>value2</[COL2_NAME]>  
  ...  
 </[PARAM_NAME]RECORD>  
</[PARAM_NAME]>  
  
[PARAM_NAME] = OUT REF CURSOR parameter name; for example, EMP_REFCURSOR  
[COL_NAME] = Name of a column in the REF CURSOR type; for example, Name.  

以下顯示弱式型別 OUT REF CURSOR 參數的 XML。

<[PARAM_NAME]>  
 <GenRecordRow xmlns="oracledb">  
  <GenRecordColumn>  
   <ColumnName>COL_NAME</ColumnName>  
   <ColumnValue>COL_VALUE</ColumnValue>  
   <ColumnType>COL_TYPE</ColumnType>  
  </GenRecordColumn>  
  …  
 </GenRecordRow>  
 …  
</[PARAM_NAME]>  
  
[COL_NAME] = Name of column; for example, Name  
[COL_VALUE] = Column value; for example, Scott  
[COL_TYPE] = Column data type; for example, System.String  

IN OUT REF CURSOR 參數

因為 Oracle 資料庫配接器會將 REF CURSOR 參數模型化為字串,而 OUT REF CURSOR 參數做為複雜類型,所以它不支援 IN OUT REF CURSOR 參數的單一類型。 因此,它會將 IN OUT REF CURSOR 參數視為兩個不同的參數:要求訊息中的 IN 參數和回應訊息中的 OUT 參數。

為了避免服務模型程式設計發生名稱衝突,Oracle 資料庫配接器會將字串 「_IN」 附加至要求訊息中的 IN 參數,以便針對名為 [PARAM_NAME] 的指定參數建立兩個參數:

  • [PARAM_NAME]_IN是預存程式或函數要求訊息中的 IN REF CURSOR 參數。 它包含 PL/SQL 語句, (會傳回 REF CURSOR 的選取查詢或預存程式或函式呼叫) 。

  • [PARAM_NAME] 是預存程式或函式回應訊息中的 OUT REF CURSOR 參數。 它包含 OUT REF CURSOR 做為強型別或弱型別的結果集。

重要

配接器不支援包含名為 [PARAM_NAME] 之 IN 參數的程式或函式_IN,以及名為 [PARAM_NAME] 的 IN OUT REF CURSOR 參數。 這是因為配接器需要名為 [PARAM_NAME]的參數_IN來表示 REF CURSOR 參數的輸入,而且您無法在要求訊息中指定這兩個參數。

另請參閱

BizTalk Adapter for Oracle Database 的訊息和訊息結構描述