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属性
如何在表中检索多重查询字段?
答案 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;