Oracle 有没有办法在PL SQL中本地缓存和筛选表?

Oracle 有没有办法在PL SQL中本地缓存和筛选表?,oracle,plsql,oracle11g,Oracle,Plsql,Oracle11g,我不得不在Oracle11g中处理一个表,其中包含大约500万条记录。这些记录是沿分隔公路的速度限制。有一个SpeedLimitId、HighwayId和一个from mile post和to mile post来描述限速适用的区域。目前,所有记录仅位于分隔公路的一侧,需要对记录进行处理,以便将其应用于另一侧。有一个测量方程表,让我们知道公路一侧的测量范围等于公路另一侧的测量范围。这允许我们通过计算测量范围内测量值的百分比,然后在相对侧找到相同的范围百分比,来计算限速事件在另一侧的测量值。限速记

我不得不在Oracle11g中处理一个表,其中包含大约500万条记录。这些记录是沿分隔公路的速度限制。有一个SpeedLimitId、HighwayId和一个from mile post和to mile post来描述限速适用的区域。目前,所有记录仅位于分隔公路的一侧,需要对记录进行处理,以便将其应用于另一侧。有一个测量方程表,让我们知道公路一侧的测量范围等于公路另一侧的测量范围。这允许我们通过计算测量范围内测量值的百分比,然后在相对侧找到相同的范围百分比,来计算限速事件在另一侧的测量值。限速记录可以包含在一个测量方程记录中,也可以跨越多个测量方程记录。根据限速表和测量方程中的信息,需要在第三个表中插入一条或多条记录

限速

+--------------+-----------+--------------+------------+------------+-------+ | SpeedLimitId | HighwayId | FromMilePost | ToMilePost | SpeedLimit | Lane | +--------------+-----------+--------------+------------+------------+-------+ | 1 | 75N | 115 | 123 | 60 | South | +--------------+-----------+--------------+------------+------------+-------+ +--------------+-----------+--------------+------------+------------+-------+ |SpeedLimitId |高速公路ID |从里程桩|到邮局| SpeedLimit |车道| +--------------+-----------+--------------+------------+------------+-------+ |南1 | 75N | 115 | 123 | 60 || +--------------+-----------+--------------+------------+------------+-------+ 测度u方程

+------------+----------------+-----------+---------+-------+----------------+-----------+---------+-------+------------------+ | EquationId | NorthHighwayId | NFromMile | NToMile | NGain | SouthHighwayId | SFromMile | SToMile | SGain | IsHighwayDivided | +------------+----------------+-----------+---------+-------+----------------+-----------+---------+-------+------------------+ | 1 | 75N | 105 | 120 | 15 | 75S | 100 | 110 | 10 | No | | 2 | 75N | 120 | 125 | 5 | 75S | 110 | 125 | 15 | Yes | | 3 | 75N | 125 | 130 | 5 | 75S | 125 | 130 | 5 | No | +------------+----------------+-----------+---------+-------+----------------+-----------+---------+-------+------------------+ +------------+----------------+-----------+---------+-------+----------------+-----------+---------+-------+------------------+ |EquationId |北公路ID | NFromMile | NToMile | NGain |南公路ID | SFromMile | SToMile | SGain | Ishighway| +------------+----------------+-----------+---------+-------+----------------+-----------+---------+-------+------------------+ |1 | 75N | 105 | 120 | 15 | 75S | 100 | 110 | 10 |否| |2 | 75N | 120 | 125 | 5 | 75S | 110 | 125 | 15 |是| |3 | 75N | 125 | 130 | 5 | 75S | 125 | 130 | 5 |否| +------------+----------------+-----------+---------+-------+----------------+-----------+---------+-------+------------------+ 根据速度限制和测量方程表中的信息,需要在第三个表中插入至少一条记录,但最多可以插入三条记录。由于字段中的值不同,可能会出现十几种不同的情况。
使用上述数据,您可以看到SpeedLimitId 1被标注为位于高速公路的南侧,但它目前位于北侧,并且它还跨越ID为1和2的2个方程式记录。在这种情况下,它跨越两个测量范围,因为一条道路分离并成为一条分开的公路。我们需要将原始记录拆分为两个事件,并将它们添加到第三个处理表中,然后计算南行车道的新测量值

速度限制处理

+--------------+-----------+-------+----------+--------+ | SpeedLimitId | HighwayId | LANE | FromMile | ToMile | +--------------+-----------+-------+----------+--------+ | 1 | 75N | North | 115 | 120 | | 1 | 75S | South | 110 | 119 | +--------------+-----------+-------+----------+--------+ +--------------+-----------+-------+----------+--------+ |SpeedLimitId |公路ID |车道|自英里|托米尔| +--------------+-----------+-------+----------+--------+ |1 | 75N |北| 115 | 120| |1 | 75S |南| 110 | 119| +--------------+-----------+-------+----------+--------+ 南行车道上测量值的计算方法如下:

+--------------------+----------------------------+-----------------------------+ | | From Measure Translation | To Measure Translation | +--------------------+----------------------------+-----------------------------+ | Event Measure as % | ((120 – 120)/5) * 100 = 0% | ((123 – 120)/5) * 100 = 60% | | Offset Measure | ((15 * 0) / 100 = 0 | ((15 * 60) / 100) = 9 | | Translated Measure | 110 + 0 = 110 | 110 + 9 = 119 | +--------------------+----------------------------+-----------------------------+ +--------------------+----------------------------+-----------------------------+ ||从量度翻译|到量度翻译| +--------------------+----------------------------+-----------------------------+ |事件度量为%|((120-120)/5)*100=0%|((123-120)/5)*100=60%| |偏移量|((15*0)/100=0 |((15*60)/100)=9| |转换度量值| 110+0=110 | 110+9=119| +--------------------+----------------------------+-----------------------------+ 我关心的是尽可能以最有效的方式实现这一点。我的想法是循环遍历SPEED_LIMIT表中的每个记录,选择measure equation表中相应的记录,然后根据这两个表中的信息将记录插入到第三个表中。为了限制PL/SQL上下文切换,我计划在我们身上惯性导航与制导"批量收集和FORALL”语句来查询事件表和运行insert语句,这将允许我成批执行操作。缺少的部分是如何从MEASURE_等式表中获取相应的记录,而不必对SPEED_LIMIT表中的每个记录循环执行sql查询。MEASURE_等式只有其中大约有700条记录,因此我想知道是否有一种方法可以将其缓存在PL SQL中,然后将其过滤到当前速度限制记录的适当记录中


正如您可能从我的问题中所了解到的,我对PL SQL和ORACLE基本上都是新手,所以可能我的做法完全错误。

您想一次完成所有500万行吗?这是一次性操作吗?如果是,请忘记PL/SQL和“循环/每行”逻辑。重新安排您的问题,以明确您希望输出的外观。几乎可以肯定它可以在SQL中完成,同样,几乎可以肯定纯SQL解决方案将关闭您在PL/SQL中所做的任何事情。请编辑并添加示例数据的预期输出。在scrip之后,第三个表应该是什么样子t是否运行?您是否预计75S 16-30m路段将有两行,如果是,这两行是否具有相同的里程标记,或者以某种方式被拆分?请参考您的担忧“度量衡方程式只有大约700条记录。”