使用ODAC在Delphi上获取Oracle Query的Multiset字段值

时间:2016-12-08 14:07:30

标签: oracle delphi odac

Hellо! 我想在Delphi 7上获得Oracle Query的Multiset字段值。

例如关于Delphi:

var seetings = new JsonSerializerSettings()
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver(),
            Formatting = Newtonsoft.Json.Formatting.Indented,
            TypeNameHandling = TypeNameHandling.Objects
        };

string json=JsonConvert.SerializeObject(objectToWrite, seetings);

我写了这段代码:

QSQl.SQL.Text := "select cast (multiset (select id, summa from temp) as nach_table) t from dual";

但是没有AsTable属性

如何在表中检索多重查询字段?

1 个答案:

答案 0 :(得分:1)

我碰到了这个问题,寻找相同的答案。我意识到这个问题有点老了,OP已经停用了2年多了,但是关于此的信息很少,所以我还是想回答。这是我发现的。由于例子太少了,所以我不知道这是否是 the 方式,但是仅用两行代码,并且看似性能出色,所以我认为这并不坏。 :o)

答案

TOraQuery有一个GetTable方法,您可以向其传递一个字段名(在您的情况下为t)。这将返回一个TNestTable对象,您可以将其分配给TOraNestedTable组件的table属性。请注意,我使用AfterScroll事件,因此只要您在主级别中更改记录,就分配该事件。

由于您是从双重选择中选择的,因此这实际上不是必需的,但我想那只是示例。

procedure TForm1.OraQuery1AfterScroll(DataSet: TDataSet);
begin
  OraNestedTable1.Table := OraQuery1.GetTable('t');
  OraNestedTable1.Active := True;
end;

更深的水平

此外,如果您需要添加第二个级别,则其工作方式略有不同。 TOraNestedTable没有GetTable方法,但是您可以使用GetObject方法。返回的对象可以是各种类型,但是如果您在多集内有一个多集,则该对象将再次为TOraNestTable类型。我用它来获取客户的订单及其订单行。

所以我的查询如下:

select
  c.CUSTOMERID,
  c.FIRSTNAME,
  -- All orders of the customer
  cast(multiset(
    select 
      ORDERID,
      ORDERDATETIME,
      -- All orderlines of the order
      cast(multiset(
        select 
          ORDERLINEID,
          PRODUCTID, 
          QUANTITY
        from
          VAN_ORDERLINE ol
        where 
          ol.ORDERID = o.ORDERID
      ) as ORDERLINE_T) as ORDERLINES

    from
      VAN_ORDER o
    where 
      o.CUSTOMERID = c.CUSTOMERID
  ) as ORDER_T) as ORDERS
from
  CUSTOMER c
where
  c.CUSTOMERID in (1, 2, 3)

然后使用上面的代码(字段名称为ORDERS)使用TOraQuery.GetTable获取客户的所有订单作为详细信息。

procedure TForm1.OraQuery1AfterScroll(DataSet: TDataSet);
begin
  OraNestedTable1.Table := OraQuery1.GetTable('ORDERS');
  OraNestedTable1.Active := True;
end;

然后,当更改详细信息中的记录时,您可以使用TOraNestedTable.GetObject() as TOraNestTable来使订单线更深入。为此,您需要在您的used子句中添加OraObjects

procedure TForm1.OraNestedTable1AfterScroll(DataSet: TDataSet);
begin
  OraNestedTable2.Table := OraNestedTable1.GetObject('ORDERLINES') as TOraNestTable;
  OraNestedTable2.Active := True;
end;