ODAC使用技巧:使用VARRAY數(shù)據(jù)類型

字號:

在使用對象時建議使用數(shù)組。ODAC 的一個字段創(chuàng)建大量數(shù)組時,也會創(chuàng)建大量的 TField 字段,這會導致程序的性能大大降低。 因此, ODAC 限制僅能為字段創(chuàng)建 1000 個成員。 但不管怎樣,你都可以使用 TOraArray 對象來存取所有的成員。 當然,你也可以通過其它方法來實現(xiàn)。比如,設(shè)置 TOraQuery.SparseArray 為 True 并且通過 TArrayField 對象來存取數(shù)組成員。
    如果創(chuàng)建了下面的類型:
    CREATE TYPE TODACArray1 AS VARRAY (5) OF NUMBER;
    CREATE TYPE TODACArray2 AS VARRAY (4) OF CHAR(10);
    CREATE TABLE ODAC_Array (
    Code NUMBER,
    Title VARCHAR2(10),
    Arr1 TODACArray1,
    Arr2 TODACArray2,
    );
    要存取數(shù)組成員,你需要調(diào)用方法 FieldByName 。例如:
    Value := Query.FieldByName(''''Arr1[0]'''').AsInteger;
    If ObjectField property is True this code is right
    Value := TArrayField(Query.FieldByName(''''Arr1'''')).Fields[0].AsInteger;
    Using TOraDataSet.GetArray you can access to array items through TOraArray object
    Value:= Query.GetArray(''''Arr1'''').ItemAsInteger[0];
    你能夠在 SQL 以及 PL/SQL 語句使用使用 VARRAY 類型作為參數(shù)。你需要指定 dtArray 到 TOraParam.DataType 并且使用 TOraParam.AsArray 屬性來存取數(shù)組成員。
    例如:
    var
    OraSQL: TOraSQL;
    . . .
    OraSQL.SQL.Text := ''''INSERT INTO ODAC_Array (Code, Arr1, Arr2)''''
    ''''VALUES (:Code, :Arr1, :Arr2)'''';
    OraSQL.ParamByName(''''Code'''').AsInteger := 10;
    with OraSQL.ParamByName(''''Arr1'''').AsArray do begin
    AllocObject(OraSession.OCISvcCtx, ''''TODACArray1'''');
    ItemAsInteger[0] := 12;
    AttrAsInteger[''''[1]''''] := 10;
    ItemAsInteger[3] := 133;
    end;
    with OraSQL. ParamByName(''''Arr2'''').AsArray do begin
    OCISvcCtx:= OraSession.OCISvcCtx;
    AllocObject(''''TODACArray2'''');
    AttrAsString[''''[2]'''']:= ''''eeee'''';
    ItemAsString[0]:= ''''FFFFF'''';
    end;
    OraSQL.Execute;