日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ORACLE HANDBOOK系列之六:ODP.NET与复杂的PL/SQL数据类型(Using ODP.NET To Deal With Complex PLSQL Data Types)...

發布時間:2025/3/15 asp.net 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ORACLE HANDBOOK系列之六:ODP.NET与复杂的PL/SQL数据类型(Using ODP.NET To Deal With Complex PLSQL Data Types)... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在開始介紹之前,先給出文章里用到的所有PL/SQL代碼:

(類型定義)

?

CREATE?OR?REPLACE?TYPE?T_Nested_Tab_Str?IS?TABLE?OF?VARCHAR2(25);
--
CREATE?OR?REPLACE?TYPE?T_Object?IS?OBJECT
(
?employee_id?
number(6),
?last_name?
varchar2(25)
);
--
CREATE?OR?REPLACE?TYPE?T_VARRAY_STR?IS?VARRAY(10)?OF?VARCHAR2(25);
--
CREATE?OR?REPLACE?TYPE?T_Nested_Tab_Obj?IS?TABLE?OF?T_Object;

(包的聲明)

?

CREATE?OR?REPLACE?PACKAGE?pkg_odp_dotnet?IS
?TYPE?T_Ref_Cursor?
IS?REF?CURSOR;
?TYPE?T_Asso_Array_Num?
IS?TABLE?OF?employees_bk.employee_id%TYPE?INDEX?BY?PLS_INTEGER;
?TYPE?T_Asso_Array_Str?
IS?TABLE?OF?employees_bk.last_name%TYPE?INDEX?BY?PLS_INTEGER;?
?
--
?PROCEDURE?proc_ref_cursor(p_ref_cursor?OUT?T_Ref_Cursor);
?
PROCEDURE?proc_sys_refcursor(p_sys_refcursor?OUT?SYS_REFCURSOR);
?
--
?PROCEDURE?proc_asso_array_num_in(p_asso_array_num????IN?T_Asso_Array_Num);
?
PROCEDURE?proc_asso_array_num_out(p_asso_array_num?OUT?T_Asso_Array_Num);
?
PROCEDURE?proc_asso_array_str_out(p_asso_array_str?OUT?T_Asso_Array_Str);
?
--
?PROCEDURE?proc_nested_tab_str_in(p_nested_tab_str?IN?T_Nested_Tab_Str);
?
PROCEDURE?proc_nested_tab_str_out(p_nested_tab_str?OUT?T_Nested_Tab_Str);
?
--
?PROCEDURE?proc_obj_in(p_obj?IN?T_Object);
?
--
?PROCEDURE?proc_nested_tab_obj_in(p_nested_tab_obj?IN?T_Nested_Tab_Obj);
?
--
?PROCEDURE?proc_varray_str_in(p_varray_str?IN?T_Varray_Str);
END;

(包體)

?

CREATE?OR?REPLACE?PACKAGE?BODY?pkg_odp_dotnet?IS
?
/*This?proc?is?invoked?by?.NET?to?test?the?ref?cursor
????Retrieve?the?employees?whose?id?less?than?105
*/
?
PROCEDURE?proc_ref_cursor(p_ref_cursor?OUT?T_Ref_Cursor)
?
IS
?
BEGIN
????
OPEN?p_ref_cursor?FOR
????
SELECT?employee_id,first_name,last_name?FROM?employees_bk?WHERE?employee_id<105;
?
END;
?
?
---------------------------------------------------------------------------------------------------------------------------------
?/*This?proc?is?invoked?by?.NET?to?test?the?pre-defined?sys_refcursor
????Retrieve?the?employees?whose?id?less?than?105
*/
?
PROCEDURE?proc_sys_refcursor(p_sys_refcursor?OUT?SYS_REFCURSOR)
?
IS
?
BEGIN
????
OPEN?p_sys_refcursor?FOR
????
SELECT?employee_id,first_name,last_name?FROM?employees_bk?WHERE?employee_id<105;
?
END;
?
?
---------------------------------------------------------------------------------------------------------------------------------
?/*This?proc?is?invoked?by?.NET?to?test?the?input?parameter?with?the?type?of?associative?array,?
????and?the?type?of?the?collection?element?is?number
????Loop?through?each?employee?id?in?the?given?associative?array,?then?update?its?salary
*/
?
PROCEDURE?proc_asso_array_num_in(p_asso_array_num????IN?T_Asso_Array_Num)
?
IS
????idx?PLS_INTEGER;
?
BEGIN
????idx:
=p_asso_array_num.FIRST;
????
WHILE(idx?IS?NOT?NULL)?LOOP
??????
UPDATE?employees_bk?SET?salary=salary+1?WHERE?employee_id=p_asso_array_num(idx);
??????idx:
=p_asso_array_num.NEXT(idx);
????
END?LOOP;
????
COMMIT;
?
END;
?
?
---------------------------------------------------------------------------------------------------------------------------------
?/*This?proc?is?invoked?by?.NET?to?test?the?output?parameter?with?the?type?of?associative?array,?
????and?the?type?of?the?collection?element?is?varchar2
????Retrieve?the?employees?whose?id?less?than?105
*/
?
PROCEDURE?proc_asso_array_str_out(p_asso_array_str?OUT?T_Asso_Array_Str)
?
IS
?
BEGIN
????
SELECT?last_name?BULK?COLLECT?INTO?p_asso_array_str?FROM?employees_bk?WHERE?employee_id<105;
?
END;
?
?
---------------------------------------------------------------------------------------------------------------------------------
?/*This?proc?is?invoked?by?.NET?to?test?the?output?parameter?with?the?type?of?associative?array,?
????and?the?type?of?the?collection?element?is?number
????Retrieve?the?employees?whose?id?less?than?105
*/
?
PROCEDURE?proc_asso_array_num_out(p_asso_array_num?OUT?T_Asso_Array_Num)
?
IS
?
BEGIN
????
SELECT?employee_id?BULK?COLLECT?INTO?p_asso_array_num?FROM?employees_bk?WHERE?employee_id<105;
?
END;
?
?
---------------------------------------------------------------------------------------------------------------------------------
?/*This?proc?is?invoked?by?.NET?to?test?the?input?parameter?with?the?type?of?nested?table,?
????and?the?type?of?the?collection?element?is?number
????Loop?through?each?last?name?in?the?given?nested?table,?then?update?its?salary
*/
?
PROCEDURE?proc_nested_tab_str_in(p_nested_tab_str?IN?T_Nested_Tab_Str)
?
IS
?
BEGIN
????FORALL?i?
IN?p_nested_tab_str.FIRST..p_nested_tab_str.LAST
?????
UPDATE?employees_bk?SET?salary=salary+1?WHERE?last_name=p_nested_tab_str(i);
????
COMMIT;
?
END;
?
?
---------------------------------------------------------------------------------------------------------------------------------
?/*This?proc?is?invoked?by?.NET?to?test?the?output?parameter?with?the?type?of?nested?table,?
????and?the?type?of?the?collection?element?is?varchar2
????Retrieve?the?employees?whose?id?less?than?105
*/
?
PROCEDURE?proc_nested_tab_str_out(p_nested_tab_str?OUT?T_Nested_Tab_Str)
?
IS
?
BEGIN
????
SELECT?last_name?BULK?COLLECT?INTO?p_nested_tab_str?FROM?employees_bk?WHERE?employee_id<105;
?
END;
?
?
---------------------------------------------------------------------------------------------------------------------------------
?/*This?proc?is?invoked?by?.NET?to?test?the?output?parameter?with?the?type?of?VARRAY,?
????and?the?type?of?the?collection?element?is?varchar2
????Loop?through?each?last?name?in?the?given?varray,?then?update?its?salary
*/
?
PROCEDURE?proc_varray_str_in(p_varray_str?IN?T_Varray_Str)
?
IS
?
BEGIN
????FORALL?i?
IN?p_varray_str.FIRST..p_varray_str.LAST
??????
UPDATE?employees_bk?SET?salary=salary+1?WHERE?last_name=p_varray_str(i);
????
COMMIT;
?
END;
?
?
---------------------------------------------------------------------------------------------------------------------------------
?/*This?proc?is?invoked?by?.NET?to?test?the?output?parameter?with?the?type?of?object
????Update?the?last_name?according?to?two?fields?last_name,?employee_id?in?the?given?object
*/
?
PROCEDURE?proc_obj_in(p_obj?IN?T_Object)
?
IS
?
BEGIN
????
UPDATE?employees_bk?SET?last_name=p_obj.last_name?WHERE?employee_id=p_obj.employee_id;
????
COMMIT;
?
END;
?
?
---------------------------------------------------------------------------------------------------------------------------------
?/*This?proc?is?invoked?by?.NET?to?test?the?output?parameter?with?the?type?of?nested?table,?
????and?the?type?of?the?collection?element?is?object
????Loop?through?each?object?in?the?given?nested?table,?then?update?the?last?name?of?employee
*/
?
PROCEDURE?proc_nested_tab_obj_in(p_nested_tab_obj?IN?T_Nested_Tab_Obj)
?
IS
?
BEGIN
????FORALL?idx?
IN?p_nested_tab_obj.FIRST..p_nested_tab_obj.LAST
??????
UPDATE?employees_bk?SET?last_name=p_nested_tab_obj(idx).last_name?WHERE?employee_id=p_nested_tab_obj(idx).employee_id;
????
COMMIT;
?
END;
END;

?

1.引用游標(REF Cursor

引用游標作為輸出參數的情況十分常見。相較于MS SQL ServerOracle存儲過程無法直接返回結果集,而需要借助REF CursorREF Cursor實際上是指向服務器內存的指針,也就是說客戶端調用獲取的是一個指針,它指向服務器內存中的結果集數據。

雖然可能令熟悉MS SQL Server平臺的開發者困惑,但是使用REF Cursor帶來兩個明顯的好處:1)它可以延遲數據的交付,客戶端獲取的只是指針,數據只有在被請求時才傳遞;2)使用REF Cursor在存儲過程之間傳遞結果集,可以最小化對性能影響,畢竟傳遞的只是指針而不是真實數據。

(使用DataReader

?

cmd.CommandText?=?"pkg_odp_dotnet.proc_ref_cursor";
cmd.CommandType?
=?CommandType.StoredProcedure;
//
OracleParameter?op?=?new?OracleParameter();
op.ParameterName?
=?"p_ref_cursor";
op.Direction?
=?ParameterDirection.Output;
op.OracleDbType?
=?OracleDbType.RefCursor;
cmd.Parameters.Add(op);
OracleDataReader?odr?
=?cmd.ExecuteReader();
//
if?(odr.HasRows)
{
????
while?(odr.Read())
????{
????????
string?s?=?odr.GetDecimal(odr.GetOrdinal("employee_id"))?+?"?"
????????????
+?odr.GetString(odr.GetOrdinal("first_name"))?+?"?"
????????????
+?odr.GetString(odr.GetOrdinal("last_name"));
????????Console.WriteLine(s);
????}
}

(使用DataAdapter

?

cmd.CommandText?=?"pkg_odp_dotnet.proc_ref_cursor";
cmd.CommandType?
=?CommandType.StoredProcedure;
//
OracleParameter?op?=?new?OracleParameter();
op.ParameterName?
=?"p_ref_cursor";
op.Direction?
=?ParameterDirection.Output;
op.OracleDbType?
=?OracleDbType.RefCursor;
cmd.Parameters.Add(op);
OracleDataAdapter?oda?
=?new?OracleDataAdapter(cmd);
DataSet?ds?
=?new?DataSet();
oda.Fill(ds);
//
for?(int?i?=?0;?i?<?ds.Tables[0].Rows.Count;?i++)
{
????
string?s?=?ds.Tables[0].Rows[i]["employee_id"]?+?"?"
????????????
+?ds.Tables[0].Rows[i]["first_name"]?+?"?"
????????????
+?ds.Tables[0].Rows[i]["last_name"];
????Console.WriteLine(s);
}

注意上面的Tables[0],如果有多個輸出參數是REF Cursor,則可以使用Tables[0]Tables[1],以此類推。DataReader似乎無法在有多個輸出的REF Cursor有情況下使用。

方便起見,可以使用Oracle預定義的SYS_REFCURSOR,這樣可以省去TYPE定義。在用法上與自定義的REF Cursor相同,就不再舉具體的實例了。

?

2.關聯數組(Associative array

關于PL/SQL中的集合類型,已經在上一篇文章《ORACLE HANDBOOK系統之三:PL/SQL中的集合類型(COLLECTIONS IN PL/SQL)》中介紹了(http://www.cnblogs.com/KissKnife/archive/2011/04/07/2008158.html),這里介紹C#Oracle交互時如何使用關聯數組。

(作為輸入參數)

?

cmd.CommandText?=?"pkg_odp_dotnet.proc_asso_array_num_in";
cmd.CommandType?
=?CommandType.StoredProcedure;
//
OracleParameter?op?=?new?OracleParameter();
op.ParameterName?
=?"p_asso_array_num";
op.Direction?
=?ParameterDirection.Input;
op.OracleDbType?
=?OracleDbType.Decimal;
//
op.CollectionType?=?OracleCollectionType.PLSQLAssociativeArray;
op.Value?
=?new?decimal[]?{?100,?101,?102?};
//
cmd.Parameters.Add(op);
cmd.ExecuteNonQuery();

相應的,如果定義的Associative array的元素是Varchar2,則OracleParameter.OracleDbType就是OracleDbType.Varchar2,為OracleParameter.value賦值要使用string[]

(作為輸出參數)

?

using?Oracle.DataAccess.Types;

cmd.CommandText?
=?"pkg_odp_dotnet.proc_asso_array_str_out";
cmd.CommandType?
=?CommandType.StoredProcedure;
//
OracleParameter?op?=?new?OracleParameter();
op.ParameterName?
=?"p_asso_array_str";
op.Direction?
=?ParameterDirection.Output;
op.OracleDbType?
=?OracleDbType.Varchar2;
//
op.CollectionType?=?OracleCollectionType.PLSQLAssociativeArray;
//
op.Size?=?12;
int[]?iArray?=?new?int[op.Size];
for?(int?i?=?0;?i?<?iArray.Length;?i++)
{
????iArray[i]?
=?25;
}
op.ArrayBindSize?
=?iArray;
//
cmd.Parameters.Add(op);
cmd.ExecuteNonQuery();
//
OracleString[]?osArray?=?(OracleString[])op.Value;
for?(int?i?=?0;?i?<=?osArray.GetUpperBound(0);?i++)
{
????Console.WriteLine(osArray[i].Value?
+?",");
}

OracleParameter.Size,如果給定的Size比實際查詢所得的行數小,則會報ORA-06513錯誤,所以如果無法確定實際返回的集合長度,需要往大了取。

OracleParameter.ArrayBindSize,這里集合元素是變長的VARCHAR2,因此需要為每個元素指定其長度,由于表中last_name的長度是25,所以這里定義成了25,比25小不會報錯,但是可能導致字符串被截斷。如果要返回的集合元素是NUMBER,則可以不指定ArrayBindSize

OracleString,不要天真地以為可以使用string[]數組來接收返回的集合,NO!需要OracleString[],使用string[]將導致轉化出錯。如果要返回的集合元素是NUMBER,通常用OracleDecimal[]而不能直接用decimal[]

通常來說,以集合類型作為輸出參數類型的情況相對較少,對于結果集,使用REF Cursor是更好的選擇。

?

3.嵌套表(Nested table

對于Nested table,有兩種方案可以選擇,1)直接映射成C#中的數組,2)映射成C#的自定義類型。

第一種方案,需要首先聲明一個Factory類并實現IOracleArrayTypeFactory接口,并使用OracleCustomTypeMappingAttribute(schema.type_name)指定需要映射的Nested table的名稱,schema.type_name需要大寫。

可以看到我們使用了OracleDbType.Array,并且指定了參數的UdtTypeName。賦值時直接使用了string[]

[OracleCustomTypeMappingAttribute("HR.T_NESTED_TAB_STR")]
public?class?Nested_Tab_Mapping_To_Array_Factory?:?IOracleArrayTypeFactory
{
????
public?Array?CreateArray(int?i)
????{
????????
return?new?string[i];
????}
????
//
????public?Array?CreateStatusArray(int?i)
????{
????????
return?new?OracleUdtStatus[i];
????}
}

(作為輸入參數)

?

cmd.CommandText?=?"pkg_odp_dotnet.proc_nested_tab_str_in";
cmd.CommandType?
=?CommandType.StoredProcedure;
//
OracleParameter?op?=?new?OracleParameter();
op.ParameterName?
=?"p_nested_tab_str";
op.Direction?
=?ParameterDirection.Input;
op.OracleDbType?
=?OracleDbType.Array;
op.UdtTypeName?
=?"HR.T_NESTED_TAB_STR";
op.Value?
=?new?string[]?{?"King",?"Olsen"?};
//
cmd.Parameters.Add(op);
cmd.ExecuteNonQuery();

(作為輸出參數,同樣需要上面的Factory類)

?

cmd.CommandText?=?"pkg_odp_dotnet.proc_nested_tab_str_out";
cmd.CommandType?
=?CommandType.StoredProcedure;
//
OracleParameter?op?=?new?OracleParameter();
op.ParameterName?
=?"p_nested_tab_str";
op.Direction?
=?ParameterDirection.Output;
op.OracleDbType?
=?OracleDbType.Array;
op.UdtTypeName?
=?"HR.T_NESTED_TAB_STR";
//
cmd.Parameters.Add(op);
cmd.ExecuteNonQuery();
//
if?(op.Value?!=?DBNull.Value)
{
????
string[]?result?=?(string[])op.Value;
????
foreach?(string?s?in?result)
????{
????????Console.WriteLine(s);
????}
}

對比而言,第一種方案中將Nested table映射成C#數組的做法更簡潔。下面我們介紹第二種方案,稍微繁雜一點,除了需要Factory類(需要同時實現IOracleArrayTypeFactoryIOracleCustomTypeFactory兩個接口)外,它還需要一個自定義類型:

[OracleCustomTypeMappingAttribute("HR.T_NESTED_TAB_STR")]
public?class?Nested_Tab_Mapping_To_Object_Factory?:?IOracleCustomTypeFactory,?IOracleArrayTypeFactory
{
????
public?IOracleCustomType?CreateObject()
????{
????????
return?new?Nested_Tab_Mapping_To_Object();
????}
????
//
????public?Array?CreateArray(int?i)
????{
????????
return?new?String[i];
????}
????
//
????public?Array?CreateStatusArray(int?i)
????{
????????
return?new?OracleUdtStatus[i];
????}
}
?
public?class?Nested_Tab_Mapping_To_Object?:?IOracleCustomType,?INullable
{
????[OracleArrayMapping()]
????
public?string[]?container;
????
//
????private?OracleUdtStatus[]?statusArray;
????
public?OracleUdtStatus[]?StatusArray
????{
????????
get
????????{
????????????
return?statusArray;
????????}
????????
set
????????{
????????????statusArray?
=?value;
????????}
????}
????
//
????private?bool?isNull;
????
public?bool?IsNull
????{
????????
get
????????{
????????????
return?isNull;
????????}
????}
????
//
????public?static?Nested_Tab_Mapping_To_Object?Null
????{
????????
get
????????{
????????????Nested_Tab_Mapping_To_Object?nt?
=?new?Nested_Tab_Mapping_To_Object();
????????????nt.isNull?
=?true;
????????????
return?nt;
????????}
????}
????
//
????public?void?ToCustomObject(OracleConnection?conn,?IntPtr?pUdt)
????{
????????
object?outStatusArray;
????????container?
=?(string[])OracleUdt.GetValue(conn,?pUdt,?0,?out?outStatusArray);
????????statusArray?
=?(OracleUdtStatus[])outStatusArray;
????}
????
public?void?FromCustomObject(OracleConnection?conn,?IntPtr?pUdt)
????{
????????OracleUdt.SetValue(conn,?pUdt,?
0,?container,?statusArray);
????}
}

(作為輸入參數)

?

cmd.CommandText?=?"pkg_odp_dotnet.proc_nested_tab_str_in";
cmd.CommandType?
=?CommandType.StoredProcedure;
//
OracleParameter?op?=?new?OracleParameter();
op.ParameterName?
=?"p_nested_tab_str";
op.Direction?
=?ParameterDirection.Input;
op.OracleDbType?
=?OracleDbType.Object;
op.UdtTypeName?
=?"HR.T_NESTED_TAB_STR";
Nested_Tab_Mapping_To_Object?nt?
=?new?Nested_Tab_Mapping_To_Object();
nt.container?
=?new?string[]?{?"King",?"Olsen"?};
op.Value?
=?nt;
//
cmd.Parameters.Add(op);
cmd.ExecuteNonQuery();

(作為輸出參數)

?

cmd.CommandText?=?"pkg_odp_dotnet.proc_nested_tab_str_out";
cmd.CommandType?
=?CommandType.StoredProcedure;
//
OracleParameter?op?=?new?OracleParameter();
op.ParameterName?
=?"p_nested_tab_str";
op.Direction?
=?ParameterDirection.Output;
op.OracleDbType?
=?OracleDbType.Object;
op.UdtTypeName?
=?"HR.T_NESTED_TAB_STR";
//
cmd.Parameters.Add(op);
cmd.ExecuteNonQuery();
//
if?(op.Value?!=?DBNull.Value)
{
????Nested_Tab_Mapping_To_Object?o?
=?(Nested_Tab_Mapping_To_Object)op.Value;
????
foreach?(string?s?in?o.container)
????{
????????Console.WriteLine(s);
????}
}

?

4.動態數組(VARRAY

Nested table用法相同。

?

5.對象(Object

OracleObject類型的定義可以參見文章開頭的T_Object。遇到T_Object時,處理起來類似于第4節中將Nested table映射成自定義對象的情況,同樣需要一個自定義類型以及一個Factory類。

[OracleCustomTypeMappingAttribute("HR.T_OBJECT")]
public?class?Ora_Object_Factory?:?IOracleCustomTypeFactory
{
????
public?virtual?IOracleCustomType?CreateObject()
????{
????????Ora_Object?o?
=?new?Ora_Object();
????????
return?o;
????}
}
?
public?class?Ora_Object?:?IOracleCustomType,?INullable
{
????
private?bool?isNull;
????
private?int?employeeId;
????
private?string?lastName;
????
//
????public?bool?IsNull
????{
????????
get
????????{
????????????
return?this.isNull;
????????}
????}
????
//
????public?static?Ora_Object?Null
????{
????????
get
????????{
????????????Ora_Object?mo?
=?new?Ora_Object();
????????????mo.isNull?
=?true;
????????????
return?mo;
????????}
????}
????
//
????[OracleObjectMappingAttribute("EMPLOYEE_ID")]
????
public?int?EmployeeId
????{
????????
get
????????{
????????????
return?employeeId;
????????}
????????
set
????????{
????????????employeeId?
=?value;
????????}
????}
????
//
????[OracleObjectMappingAttribute("LAST_NAME")]
????
public?string?LastName
????{
????????
get
????????{
????????????
return?lastName;
????????}
????????
set
????????{
????????????lastName?
=?value;
????????}
????}
????
//
????public?void?FromCustomObject(Oracle.DataAccess.Client.OracleConnection?conn,?System.IntPtr?pUdt)
????{
????????OracleUdt.SetValue(conn,?pUdt,?
"EMPLOYEE_ID",?this.EmployeeId);
????????OracleUdt.SetValue(conn,?pUdt,?
"LAST_NAME",?this.LastName);
????}
????
public?void?ToCustomObject(Oracle.DataAccess.Client.OracleConnection?conn,?System.IntPtr?pUdt)
????{
????????
this.EmployeeId?=?((int)(OracleUdt.GetValue(conn,?pUdt,?"EMPLOYEE_ID")));
????????
this.LastName?=?((string)(OracleUdt.GetValue(conn,?pUdt,?"LAST_NAME")));
????}
}

(作為輸入參數)

?

cmd.CommandText?=?"pkg_odp_dotnet.proc_obj_in";
cmd.CommandType?
=?CommandType.StoredProcedure;
//
OracleParameter?op?=?new?OracleParameter();
op.ParameterName?
=?"p_obj";
op.Direction?
=?ParameterDirection.Input;
op.OracleDbType?
=?OracleDbType.Object;
op.UdtTypeName?
=?"HR.T_OBJECT";
//
Ora_Object?mo?=?new?Ora_Object();
mo.EmployeeId?
=?100;
mo.LastName?
=?"abcd";
op.Value?
=?mo;
//
cmd.Parameters.Add(op);
cmd.ExecuteNonQuery();

作為輸出參數的情況很簡單,這里就不重復了。

?

6.對象集合(Object collection

來到終極篇,所謂對象集合,這里指的是本身是個集合類型,并且集合元素是OracleObject,例如我們在最開始定義的T_Nested_Tab_Obj

由于它是Nested table,則我們可以按照第3節中的作法將其轉化成C#中的Array,于是,我們需要一個Factory類并實現IOracleArrayTypeFactory接口:

[OracleCustomTypeMappingAttribute("HR.T_NESTED_TAB_OBJ")]
public?class?Nested_Tab_Obj_Mapping_To_Array_Factory?:?IOracleArrayTypeFactory
{
????
public?Array?CreateArray(int?i)
????{
????????
return?new?Ora_Object[i];
????}
????
//
????public?Array?CreateStatusArray(int?i)
????{
????????
return?new?OracleUdtStatus[i];
????}
}

又由于集合的元素是OracleObject類型,仿照第5節中的做法,我們分別需要一個自定義類型以及一個Factory類,由于集合元素也是使用的T_Object,所以這兩個類與第5節中相同,這里不再重復寫了。下面我們看看具體的調用代碼:

cmd.CommandText?=?"pkg_odp_dotnet.proc_nested_tab_obj_in";
cmd.CommandType?
=?CommandType.StoredProcedure;
//
OracleParameter?op?=?new?OracleParameter();
op.ParameterName?
=?"p_nested_tab_obj";
op.Direction?
=?ParameterDirection.Input;
op.OracleDbType?
=?OracleDbType.Array;
op.UdtTypeName?
=?"HR.T_NESTED_TAB_OBJ";
//
Ora_Object?mo?=?new?Ora_Object();
mo.EmployeeId?
=?100;
mo.LastName?
=?"00000";
Ora_Object?mo2?
=?new?Ora_Object();
mo2.EmployeeId?
=?102;
mo2.LastName?
=?"00000";
op.Size?
=?2;
op.Value?
=?new?Ora_Object[]?{?mo,?mo2?};
//
cmd.Parameters.Add(op);
cmd.ExecuteNonQuery();

作為輸出參數的情況也很容易寫,這里就不舉例子了,VARRAY的情況與Nested table基本一樣,也不舉例了。到這里,關于在C#中如何處理幾類主要的復雜參數類型,已經基本介紹完了,對于一些更為復雜的,比如Object中包含Object等等情況,不太常見,就不介紹了。

PS,雖然Associative array中的元素也可以是Object,但在與C#類型做映射時似乎不能成功,可能根Associative arrayPL/SQL類型(即不能通過CREATE TYPE創建獨立的類型)有關,還沒有找到相關的文檔。

?

?

總結

以上是生活随笔為你收集整理的ORACLE HANDBOOK系列之六:ODP.NET与复杂的PL/SQL数据类型(Using ODP.NET To Deal With Complex PLSQL Data Types)...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

久久国产精品影片 | 91成人久久 | 日本高清免费中文字幕 | 日韩理论在线播放 | 精品99在线观看 | 香蕉日日 | 国产成年人av| 在线观看成人毛片 | 国产一区在线免费观看 | 亚洲欧洲xxxx | 久久香蕉一区 | 国产手机在线视频 | 99久久网站 | 欧美日韩69 | 久草视频免费看 | 色妞色视频一区二区三区四区 | 在线观看中文字幕2021 | 91精品国产自产91精品 | 五月情婷婷 | 综合激情婷婷 | 欧美精品免费在线 | 日本三级大片 | 国产亚洲无 | 国产视频在线观看一区二区 | 国产九色在线播放九色 | 亚洲动漫在线观看 | 国产精品久久久久久久久久ktv | 欧美亚洲免费在线一区 | av在线之家电影网站 | 丝袜制服天堂 | 国产做a爱一级久久 | 久久婷婷亚洲 | 国产专区在线 | 久久精品亚洲综合专区 | 五月婷婷在线视频观看 | 伊人国产在线播放 | 久久久免费 | 亚洲精品免费在线观看视频 | 在线小视频你懂得 | 天天干天天上 | 99热这里只有精品久久 | 91黄色免费网站 | 免费在线激情电影 | 99精品在线视频播放 | 久久精品三级 | 五月天综合在线 | 久久99久久99精品免视看婷婷 | 五月婷婷久久丁香 | 午夜久久久久久久久久影院 | 四虎8848免费高清在线观看 | 免费99视频| 成人av教育| 美女精品在线观看 | 久99热| 天天夜夜狠狠操 | 香蕉国产91| 五月婷婷在线观看视频 | 91成人精品在线 | 欧美一级久久久 | 久久夜色精品国产欧美乱 | 免费在线激情电影 | 日韩精品一区在线播放 | 99热在线看 | 射射色 | 国产在线传媒 | 91九色国产 | 亚洲黄色免费在线看 | 狠狠色香婷婷久久亚洲精品 | 久久精品国产精品亚洲精品 | 国产h片在线观看 | 成人h视频在线播放 | 成人小视频在线播放 | 欧美精品一区二区三区一线天视频 | 激情综合五月天 | 五月婷婷天堂 | 在线免费黄 | 日韩在线观看中文字幕 | 天天av综合网 | 国产精品免费视频一区二区 | 91试看| 欧美一级电影免费观看 | 免费视频国产 | 91亚洲精品国产 | 亚洲人在线7777777精品 | 丝袜制服综合网 | 婷婷www| 不卡精品视频 | 亚洲一级性 | 亚洲老妇xxxxxx | av免费看在线 | av电影中文| www.狠狠色.com | 91精品视频在线看 | 免费日韩在线 | 久久免费99 | 日本护士三级少妇三级999 | 天天射天天干天天插 | 精品一区二区久久久久久久网站 | 欧美精品在线观看 | 欧美成人精品三级在线观看播放 | 91精品久久久久久久久久久久久 | 婷婷精品国产一区二区三区日韩 | 色综合天天狠天天透天天伊人 | 久久视频免费在线 | 麻豆视频大全 | 9在线观看免费高清完整版 玖玖爱免费视频 | 最近日本中文字幕a | 青青河边草免费观看完整版高清 | 中国一级片在线 | 二区三区av | 欧美一进一出抽搐大尺度视频 | 国产精品 日韩 | av成人动漫| 欧美日韩在线观看一区二区 | 天天干天天做天天操 | 视频在线99 | 日本精品一 | 午夜精品久久一牛影视 | 天天操天天草 | 欧美 日韩 国产 中文字幕 | 五月天色综合 | 天天操天天干天天 | 尤物97国产精品久久精品国产 | 亚洲年轻女教师毛茸茸 | 免费高清无人区完整版 | 成人久久免费 | 精品国产人成亚洲区 | 日日操天天操夜夜操 | 这里只有精品视频在线 | 中文字幕国产精品一区二区 | 国产成人精品在线 | 性色xxxxhd| 日韩婷婷 | 日韩高清在线一区二区三区 | 欧美日韩国产精品一区二区 | 亚洲精品乱码久久久久久蜜桃不爽 | 亚洲电影图片小说 | 中文字幕在线看人 | 久久国产福利 | 免费在线观看中文字幕 | 五月激情五月激情 | av短片在线| 三日本三级少妇三级99 | 久久国产精品成人免费浪潮 | 午夜视频99 | 国产精品精品久久久久久 | 中文字幕在线观看第二页 | 日韩免费高清在线观看 | 91超在线 | 日韩电影一区二区三区在线观看 | 欧美一区在线看 | 日韩网站在线免费观看 | 国产一级片播放 | 久久电影网站中文字幕 | 一区二区不卡高清 | 99久久精品久久久久久动态片 | 国产日韩精品在线观看 | 99久久精品国产免费看不卡 | 亚洲最大成人网4388xx | 国产精品不卡 | 色视频网站免费观看 | 五月天天色 | 久久男人影院 | 欧美激情va永久在线播放 | 久久久久国产a免费观看rela | 国产中文字幕亚洲 | 亚洲国产日韩av | 岛国精品一区二区 | 国产色 在线 | 美女视频黄免费的久久 | 中文字幕在线国产精品 | avove黑丝 | 久久伦理电影网 | 在线播放 亚洲 | 玖玖玖影院 | 人人干狠狠操 | 91精品无人成人www | 中文字幕高清 | 亚洲视频免费 | 国产美女免费观看 | 五月天激情综合网 | 欧美激情视频一二区 | 久久久精品国产免费观看一区二区 | 久久久久久99精品 | 91日韩精品| 免费看三片| 特级毛片网站 | 中文字幕高清免费日韩视频在线 | 91免费在线播放 | 狠狠色狠狠色终合网 | 亚洲精区二区三区四区麻豆 | 色天天中文 | 成人av一区二区三区 | 中文字幕精品三级久久久 | av视屏在线| 日本中文不卡 | 91久久人澡人人添人人爽欧美 | 国产91精品久久久久久 | 精品国产一区二区三区四 | 欧美性色黄 | 99精品欧美一区二区 | 91在线九色| 91香蕉嫩草 | 婷五月天激情 | www.eeuss影院av撸 | 亚洲激情六月 | 日韩一区正在播放 | 成人av av在线 | 天天干天天搞天天射 | 亚洲国产色一区 | 黄色网址中文字幕 | 久草在线网址 | 亚洲精品玖玖玖av在线看 | 五月婷婷在线播放 | 婷婷午夜 | 99国产在线 | 99久久久久久国产精品 | 日韩精品一区二区在线视频 | 午夜性福利 | 日韩高清www | 91免费在线播放 | 一区二区不卡高清 | 午夜精品一区二区三区在线观看 | 国产一区在线视频观看 | 日韩精品一区二区三区免费观看视频 | 精品国产欧美一区二区 | 欧美a级在线播放 | 国产精品一区二区三区久久久 | 精品在线观看国产 | 国产精品乱码一区二区视频 | 操久 | 最近乱久中文字幕 | 91精品资源 | 91精品国产福利在线观看 | 国产玖玖精品视频 | 日韩欧美高清不卡 | 九九久久久 | 91av在线视频播放 | 欧美色插| 国产最新在线视频 | 激情开心站 | 1000部18岁以下禁看视频 | 中文字幕视频在线播放 | 亚洲精品国产综合久久 | 精品国产_亚洲人成在线 | 日韩视频免费观看高清 | 久草在线视频网站 | 亚洲国产精品传媒在线观看 | 99r国产精品 | 久久综合精品国产一区二区三区 | 丁香婷婷综合色啪 | 国产视频在线播放 | 最新日韩电影 | 日韩欧美国产视频 | 欧美九九九 | 中文字幕在线观看第二页 | 天天操天天色天天 | 一区二区三区视频网站 | 国产成人福利在线观看 | 91在线一区二区 | 久久精品电影 | 色视频成人在线观看免 | 91亚洲精品久久久久图片蜜桃 | 高清av免费看 | 久久久99精品免费观看乱色 | 亚洲欧美色婷婷 | 日韩中文在线播放 | 水蜜桃亚洲一二三四在线 | 激情小说网站亚洲综合网 | 国产精品欧美激情在线观看 | 日韩av影视在线观看 | 亚洲精品黄色片 | 久草视频免费看 | 亚洲综合在线一区二区三区 | 成人午夜性影院 | 欧美一区二区三区在线视频观看 | 国产精品二区三区 | 在线视频麻豆 | av成年人电影 | 欧美日韩一区二区视频在线观看 | av免费网| 久久免费一 | 亚洲一区二区黄色 | 亚洲中字幕 | 日韩艹 | .国产精品成人自产拍在线观看6 | 免费看三级 | 国产在线观看h | 91系列在线观看 | 99久久国产免费免费 | 视频二区 | 国产精品不卡视频 | 国产免费黄视频在线观看 | 亚洲视频456 | 免费高清在线观看电视网站 | 99久久er热在这里只有精品66 | 天天做天天爱天天综合网 | 九色精品免费永久在线 | 国产第一页精品 | 婷婷久久精品 | 久久美女电影 | 日本精品视频在线 | 九色最新网址 | 一级黄色片在线观看 | 国产亚洲视频中文字幕视频 | 亚洲资源 | 久久视频国产精品免费视频在线 | 国产精品激情在线观看 | 亚洲精品美女在线观看 | 免费看三级黄色片 | 国产小视频福利在线 | 在线观看视频一区二区 | 操操操夜夜操 | 免费观看性生交大片3 | 国产一区二区在线播放视频 | 黄色电影在线免费观看 | 天堂va在线高清一区 | 国产传媒一区在线 | av大片网址| 国产亚洲aⅴaaaaaa毛片 | 成人av高清在线 | 小草av在线播放 | 亚州国产精品视频 | 91看国产| 天天操夜夜操夜夜操 | 美女视频黄是免费的 | a电影免费看 | 激情视频免费观看 | 亚洲天天做 | 国产在线观看免费av | 一区二区三区高清在线 | 精品国产伦一区二区三区观看体验 | 国产日韩欧美视频 | 人人艹人人 | 成人久久久久久久久 | 欧美日韩国产区 | 欧美日韩在线观看一区二区 | 四虎国产精品永久在线国在线 | 999视频在线播放 | 久草电影在线观看 | 又黄又刺激视频 | 91av电影网 | www.久久91| 日本久久久久久久久久 | 97视频在线 | 国产69久久 | 国产一卡二卡四卡国 | 欧美午夜精品久久久久久孕妇 | 日本黄色一级电影 | 国产三级午夜理伦三级 | 韩国一区二区在线观看 | 在线 国产 日韩 | 一二区av | 五月在线视频 | 天天干夜夜干 | 久久色网站 | 久久99精品一区二区三区三区 | 国产裸体永久免费视频网站 | 午夜电影av | 免费在线观看中文字幕 | 国内精品在线观看视频 | 99re中文字幕 | 国产一区在线观看免费 | 精品国产一区二区三区噜噜噜 | 午夜视频播放 | 激情一区二区三区欧美 | 99免费国产 | 99久久99久久免费精品蜜臀 | 久久久国产精品一区二区三区 | 五月天综合激情 | 婷婷综合影院 | 一区二区三区在线免费播放 | 一区二区三区高清在线观看 | aaa亚洲精品一二三区 | 欧美性脚交 | 日韩欧美视频免费观看 | 欧美日本不卡 | 1024手机在线看 | 亚洲成人频道 | 国产99区 | 福利网址在线观看 | 成人免费视频网址 | 久草在线观看 | 丝袜精品视频 | 最近中文字幕完整高清 | 国产一级久久 | 久久精品视频5 | 欧美一级淫片videoshd | 成人资源在线 | 亚洲丝袜一区 | 天堂av在线7| 日韩精品中文字幕在线不卡尤物 | 国产成人三级一区二区在线观看一 | 久久免费av | 日韩欧美网址 | 国产在线国偷精品产拍 | 2022久久国产露脸精品国产 | 亚洲精品视频二区 | 国产超碰97 | 天天色草| 一级免费观看 | 夜又临在线观看 | 久久久久久久久久久久av | 久久久久久久久影院 | 麻豆视频一区 | 久久婷五月 | 亚洲春色成人 | 国产日韩精品在线 | 久草网视频 | 免费日韩av电影 | 免费观看视频的网站 | 成人在线播放免费观看 | 国产精品免费一区二区三区在线观看 | 国产亚洲精品精品精品 | 91一区二区三区在线观看 | 亚洲在线视频播放 | 天堂网一区| 在线免费观看成人 | 亚洲综合欧美日韩狠狠色 | 黄色大片网 | 91精品夜夜| 一级黄色毛片 | 亚洲成人频道 | 日韩精品一区电影 | www.xxxx欧美| 欧美日韩不卡在线视频 | 欧美日韩亚洲在线 | 99精品国产一区二区三区麻豆 | www免费在线观看 | 久久这里精品视频 | 超碰人人舔 | 91看片在线| 欧美 亚洲 另类 激情 另类 | 国产亚州av| 久久精品一二三区白丝高潮 | 久久99精品久久只有精品 | 久久久免费毛片 | 美女网站久久 | 黄色av成人在线 | www国产亚洲精品 | 国产综合婷婷 | 中文字幕免费高清av | 精品亚洲视频在线观看 | 国产在线观看免费观看 | 精品女同一区二区三区在线观看 | 人人射网站 | 久久久久久久久综合 | 成人黄色电影视频 | 91免费看黄| 狠狠色丁香婷综合久久 | 一区二区三区久久 | 久草在线手机观看 | 人人爽久久涩噜噜噜网站 | 99久久久久久久久 | 福利一区二区 | 成人免费一区二区三区在线观看 | 日本在线观看中文字幕 | 亚洲电影影音先锋 | 国内精品久久天天躁人人爽 | 美女一区网站 | 韩国av在线播放 | 免费在线观看成人小视频 | 久久中文字幕导航 | 久久美女精品 | av成人免费在线 | 91福利视频在线 | 在线观看成人小视频 | 超碰在线公开免费 | 国产亚洲精品久久久久久无几年桃 | 在线国产专区 | 欧美一级视频一区 | 午夜精品久久久久久久99无限制 | 人人插人人插 | 久久人人爽爽人人爽人人片av | 国产二区精品 | 最近高清中文字幕在线国语5 | 久久久久高清 | 免费91在线 | 99精品在这里 | 欧美一区二区三区激情视频 | 国产成人精品一区二 | 亚洲国产高清视频 | 日韩欧美综合视频 | 色姑娘综合天天 | 中文字幕在线乱 | 亚洲欧美经典 | 日韩av女优视频 | 丁香婷婷综合激情五月色 | 三级a毛片 | 狠狠狠色丁香综合久久天下网 | 国产小视频福利在线 | 国产精品无av码在线观看 | 黄色网在线免费观看 | 国产免费叼嘿网站免费 | 亚洲精品日韩在线观看 | 91成人精品观看 | 美女精品国产 | 天天躁日日躁狠狠躁 | 久久你懂得 | 国产一区在线视频播放 | 成人在线观看免费 | 色婷久久 | 亚洲国产精品视频在线观看 | 91人人视频在线观看 | 中文字幕在线视频国产 | 人人玩人人添人人澡超碰 | 96国产在线 | 四虎成人精品永久免费av九九 | 免费91麻豆精品国产自产在线观看 | 久久伦理电影网 | 欧美aⅴ在线观看 | 亚洲五月婷 | 国产在线播放观看 | 99色99| 亚洲视频综合 | 成人av网站在线播放 | 不卡视频一区二区三区 | 国偷自产中文字幕亚洲手机在线 | 久久精品国产亚洲精品2020 | 91人人澡人人爽人人精品 | 欧美成人视 | 久久国产精品99精国产 | 黄色国产在线观看 | 久久久久久久久久久综合 | 日韩在线免费 | 2022久久国产露脸精品国产 | 夜夜澡人模人人添人人看 | 天天操·夜夜操 | 久久夜色精品国产欧美乱 | 97视频在线看| 91av电影在线观看 | 啪啪激情网 | 久久婷亚洲五月一区天天躁 | 中文亚洲欧美日韩 | 精品久久久久久综合日本 | 麻豆传媒电影在线观看 | 在线免费中文字幕 | 在线观看成人福利 | 国产人在线成免费视频 | 99999精品 | 91精品伦理 | 五月天中文字幕mv在线 | 久久精品之| 国精产品999国精产品岳 | 久久久久久久久久久久99 | 免费在线观看av电影 | 探花国产在线 | 色多多视频在线观看 | 久久理伦片 | 日韩欧美99| 91精品国产99久久久久久红楼 | 一级黄网 | a在线视频v视频 | 久久伊人操 | 91大神视频网站 | 特级西西444www大胆高清无视频 | 香蕉网在线播放 | www.午夜视频| 四虎影视精品 | 伊人欧美 | 国产二区av | 狠狠的干 | 公开超碰在线 | 成人精品一区二区三区电影免费 | 国产乱码精品一区二区蜜臀 | 午夜影视av| 天天操天天色天天 | 午夜视频色| 久久久综合电影 | 亚洲japanese制服美女 | 亚洲视频免费在线观看 | 亚洲成人免费在线 | 天堂在线视频中文网 | 久久五月天色综合 | 国产视频精品免费播放 | 国产黄色成人av | 国产伦精品一区二区三区无广告 | 四虎影视成人永久免费观看视频 | 91久久偷偷做嫩草影院 | 97超碰人人网| 日韩毛片在线免费观看 | 天天射日 | 视频三区 | 毛片网站免费在线观看 | 日韩| 麻豆91网站| 99操视频 | 精品视频免费看 | 免费91麻豆精品国产自产在线观看 | 久久成人毛片 | 美女久久久 | 狂野欧美激情性xxxx欧美 | 最近2019年日本中文免费字幕 | 亚洲精品理论 | 黄色99视频 | 99久久久久久久久 | 精品久久久一区二区 | 国产精品美女久久久久aⅴ 干干夜夜 | 中文字幕视频一区二区 | 成人免费视频播放 | 亚洲精品视频免费在线观看 | 9久久精品| 国产成人亚洲在线观看 | 麻豆mv在线观看 | 日本久久中文字幕 | 91高清免费看 | 免费在线观看黄网站 | 丝袜美腿av | 亚洲欧美国产精品久久久久 | 青草视频在线免费 | 天天躁天天操 | 久久 地址 | 中文字幕国产一区二区 | 国语精品视频 | 亚洲va韩国va欧美va精四季 | 激情av在线播放 | 欧美电影黄色 | 亚州欧美视频 | 超碰人人超 | av在线看片 | 日韩在线视频观看 | 久久综合狠狠狠色97 | 国产精品尤物视频 | 久久久免费精品视频 | 亚洲精品美女久久久 | 五月天色丁香 | 免费美女久久99 | 91久久久久久久一区二区 | av高清免费| 久久久久久久久久久综合 | 日韩在线观看一区二区三区 | 久草免费电影 | av+在线播放在线播放 | 色激情在线 | 中文国产在线观看 | 久久久网页 | 精品国产欧美一区二区三区不卡 | 亚州精品天堂中文字幕 | 久草在线中文视频 | 国产日产精品一区二区三区四区的观看方式 | 日日碰狠狠躁久久躁综合网 | 嫩草伊人久久精品少妇av | 久草在线免费资源站 | 日韩一区二区免费在线观看 | 91久久久久久久一区二区 | 午夜国产一区二区三区四区 | 久久视频精品在线 | 欧美日韩在线免费观看视频 | 午夜色影院| 婷婷国产一区二区三区 | 国产精品入口66mio女同 | 午夜精品一区二区三区在线播放 | 国产日韩欧美中文 | 麻豆视传媒官网免费观看 | 五月天激情婷婷 | 成人免费观看视频网站 | 午夜黄色一级片 | 国产精品黄色影片导航在线观看 | 国产精品国产三级国产aⅴ9色 | 欧美日韩久久一区 | 在线视频观看亚洲 | 国产视频一区二区在线观看 | 精品视频久久 | 日韩xxx视频 | 成人久久久电影 | 色婷婷婷| 国产亚洲婷婷 | 九九九九精品九九九九 | 福利在线看片 | 午夜精品一区二区三区在线视频 | 91夫妻自拍 | 最近最新中文字幕 | 亚洲闷骚少妇在线观看网站 | 在线免费高清一区二区三区 | 欧美成人精品在线 | 婷婷丁香在线视频 | 免费高清男女打扑克视频 | 日韩av电影免费在线观看 | 天天躁天天狠天天透 | 国产福利91精品张津瑜 | 亚洲伦理一区 | 亚洲永久精品在线观看 | 97超碰在线免费观看 | 婷婷视频导航 | 久久66热这里只有精品 | 91麻豆精品久久久久久 | 亚洲少妇自拍 | 特级大胆西西4444www | 碰超在线观看 | 国产色在线 | 国产午夜精品一区二区三区四区 | 色瓜 | 99在线精品视频观看 | 91麻豆传媒 | 九色琪琪久久综合网天天 | 久久 亚洲视频 | 亚洲综合激情小说 | 天天色视频 | 亚洲香蕉在线观看 | 色噜噜噜噜 | 欧美激情另类 | 国产精品亚洲片在线播放 | 天天综合网久久综合网 | 国产精品国产三级在线专区 | 日韩专区av | 色在线视频网 | 超碰人人做 | 精品人人爽 | 成人免费视频网 | 国产福利免费在线观看 | 国产精品五月天 | 99精品热 | 日韩在线免费观看视频 | 久久国产成人午夜av影院宅 | 久久在线看 | av中文天堂 | 免费在线黄| 3d黄动漫免费看 | 国产精品欧美在线 | 国产免费不卡 | 婷婷在线不卡 | 成人黄色小说视频 | 一区 二区电影免费在线观看 | 久久国内精品视频 | 欧美在线视频不卡 | 亚洲国产网站 | 亚洲电影院 | 天天插天天狠 | 亚洲视频在线观看网站 | 久久久精品免费观看 | 免费福利小视频 | 五月天堂网 | 午夜视频在线观看一区二区三区 | 亚洲欧美激情精品一区二区 | 久久99国产精品免费网站 | 久久午夜精品 | 亚洲国产精品第一区二区 | 四虎国产精品成人免费影视 | 久久精品一区二区三 | 午夜成人影视 | 国偷自产视频一区二区久 | 日韩高清在线一区二区 | 婷婷av色综合 | 天天操天天操天天操天天 | 国产一线二线三线在线观看 | 玖玖视频精品 | 久久久午夜精品理论片中文字幕 | 欧日韩在线视频 | 国产破处在线播放 | 五月激情五月激情 | 国产精品亚洲人在线观看 | 久热免费在线观看 | 黄色日视频 | 亚洲无吗av| 亚洲成人家庭影院 | 日韩在线视频国产 | 三级黄色片在线观看 | 色a4yy| 亚洲精品乱码久久久久久蜜桃91 | 国产精品久久久影视 | 日韩视频免费在线 | 国产成人久久77777精品 | 久久国内精品视频 | 国产一区在线免费观看 | 狠狠撸电影 | 精品国产精品国产偷麻豆 | 97超碰在线视 | 27xxoo无遮挡动态视频 | 久草在线免费在线观看 | av在线一级| 亚洲高清在线观看视频 | 国产理论片在线观看 | 中文字幕视频网 | 国产精品对白一区二区三区 | 天天综合网在线 | 欧美激情操 | 天天操夜夜曰 | 亚洲精品久久久蜜臀下载官网 | www.久久精品视频 | 国产精品99精品久久免费 | 久久久久成人精品免费播放动漫 | 天天操天天干天天摸 | 91精品1区2区 | 四虎在线免费 | 免费在线色视频 | 久久不卡免费视频 | 欧美日韩不卡一区 | 综合激情av | 97超碰中文| 成人小视频免费在线观看 | 国产美女精品视频 | 国产不卡毛片 | 青青草国产精品视频 | 99综合影院在线 | 久久影院亚洲 | 亚洲精品乱码久久久久 | 亚洲色图激情文学 | 日韩a在线 | 日韩av高清 | 97精品国产97久久久久久春色 | 日韩美在线观看 | 亚洲免费高清视频 | 欧美做受高潮 | 免费在线色电影 | 国产成人精品一区二区三区在线观看 | 午夜丁香网 | 爱爱av网站| 91福利在线观看 | av经典在线 | 欧美日韩精品免费观看视频 | 在线国产一区二区三区 | 婷婷网址| 伊人网综合在线观看 | 国产成人精品综合 | 99精品国自产在线 | 日韩一区二区三免费高清在线观看 | 激情自拍av | 国产精品一区二区久久久 | 国产成人一区二区三区免费看 | 国产精品黄网站在线观看 | 国产成人99久久亚洲综合精品 | 婷婷激情五月综合 | 国产成人精品一区二区三区在线观看 | 伊人婷婷| 国产精品久久久久免费观看 | 国产精品久久久区三区天天噜 | 精品国产免费一区二区三区五区 | 婷婷六月天天 | 五月天婷婷在线视频 | 精品久久一区二区三区 | 五月天天天操 | 夜色成人网 | 国产手机视频在线 | 久久久久免费网 | 日韩欧美一区二区三区视频 | 亚洲国内在线 | 久久国产精品系列 | 国产高清视频在线免费观看 | www日日夜夜 | 国产亚洲久一区二区 | 久久歪歪 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 麻豆极品 | 午夜国产一区二区三区四区 | 日韩区在线观看 | 亚洲一级黄色av | 成人国产精品免费观看 | 亚洲伦理中文字幕 | 国产精品成人av久久 | 国产精品久久久久久久久费观看 | 天堂av免费在线 | 久久亚洲私人国产精品 | 久久精品一区二区三区视频 | 国产一区二区影院 | 亚洲精品高清视频在线观看 | 日本不卡一区二区三区在线观看 | 免费看网站在线 | 欧美精品乱码久久久久 | 丁香花在线视频观看免费 | 久久免费视频网站 | 中文字幕av影院 | 国产录像在线观看 | 国产精品久久久久久69 | 久久天天躁狠狠躁夜夜不卡公司 | 亚洲一区 影院 | 中文字幕一区二区三区在线视频 | 亚洲欧洲中文日韩久久av乱码 | 91免费看黄 | 99久久99久久精品免费 | 黄色一级大片在线免费看产 | 国产亚洲精品bv在线观看 | 日韩啪视频 | 天天色 天天 | 91在线一区| 免费a v在线 | 精品久久久久久久久亚洲 | 国内精品视频免费 | 五月天激情视频在线观看 | a天堂最新版中文在线地址 久久99久久精品国产 | 91在线观看欧美日韩 | 久久国产精品一区二区三区四区 | 96国产在线 | 亚洲 欧美 精品 | 中文字幕文字幕一区二区 | a级黄色片视频 | 久久人视频 | 久草网站在线 | 亚洲欧美久久 | 欧美精品久久久久性色 | 最近日本韩国中文字幕 | 色综合久久88色综合天天人守婷 | 九九免费在线观看视频 | 热re99久久精品国产99热 | 精品国产99 | 91免费观看视频在线 | 6699私人影院 | 国内精品久久久久久久97牛牛 | 免费久草视频 | 五月婷丁香网 | 99热精品在线观看 | 日韩精品视频免费在线观看 | 亚洲乱码在线 | 开心激情婷婷 | 色免费在线| 久操视频在线播放 | 欧美日韩电影在线播放 | 伊人热 | 香蕉视频在线网站 | 天天天天爱天天躁 | 激情小说网站亚洲综合网 | 一级片免费观看 | 狠狠的干狠狠的操 | 久久久久99999 | 天堂中文在线视频 | 在线观看视频黄色 | 国产高清视频在线免费观看 | 亚洲影院色 | 久久久久久久久久久网站 | 久久精品一区二区三区中文字幕 | 国产伦精品一区二区三区高清 | 国产精品久久久久久吹潮天美传媒 | 久草网视频 | 91av大全| 免费在线观看一区二区三区 | 射射射综合网 | 色吊丝av中文字幕 | 国产亚洲高清视频 | 中文字幕免费观看视频 | 在线免费观看国产 | 视频在线观看国产 | 国产精品99精品久久免费 | 91亚洲激情 | 99在线精品视频在线观看 | 日韩特级毛片 | 91精品国产三级a在线观看 | 日韩精品视频免费专区在线播放 | 久久99婷婷 | 成人在线观看资源 | 韩国一区在线 | 久久国产网站 | av播放在线| 国产成人免费网站 | 伊人婷婷在线 | 久久久久久美女 | 国产尤物一区二区三区 | 久久资源在线 | 成人动图 | 久久免费视频一区 | 91成人精品一区在线播放69 | 亚洲日本精品视频 | av片在线观看免费 | 国产喷水在线 | 九九免费在线观看视频 | 国产在线观看99 | 精品少妇一区二区三区在线 | 亚洲精品字幕在线 | 91精品国产91p65 | 免费色av | 中文字幕免费看 | 日韩欧美在线综合网 | 69精品在线 | 日本字幕网 | 午夜精品久久久久久久久久 | 在线高清一区 | 国产精品久免费的黄网站 | 国产高清精品在线观看 | 九九九九热精品免费视频点播观看 | 狠狠操综合网 | 黄色三级网站在线观看 | av中文字幕亚洲 | 国产成人精品免费在线观看 | 99久久激情视频 | 视频成人永久免费视频 | 天天射网站 | 国产午夜精品免费一区二区三区视频 | 久久久久国产成人免费精品免费 | 一区二区三区日韩在线观看 | 在线 视频 亚洲 | 91国内在线 | 一区二区三区四区五区六区 | 香蕉在线观看视频 | 久久欧美综合 | 中文在线√天堂 | 亚洲五月激情 | 亚洲黄色软件 | 久久国产精品电影 | 91精品办公室少妇高潮对白 | 国产精品久久一区二区三区, | 欧美天天射 | 中文字幕亚洲高清 | 亚洲一区 av| 亚洲成年片 | 成片视频免费观看 | 免费看久久久 | 日韩高清精品免费观看 | 亚洲激情小视频 | 成人三级黄色 | 亚洲草视频|