2011-03-25 127 views
2

我正在研究一个涉及评估车辆修改的应用程序,并从存储在Oracle 10g数据库中的数据中进行一些编号处理。不幸的是,我只有数据库中的文本数据,但我需要使用数字而不是文本。我想知道是否有人可以帮助我理解如何使用PLSQL在Oracle 10g数据库中对VARCHAR2列数据执行字符串操作:PLSQL修改VARCHAR2列数据

例如:我需要在名为CARS的表中取一个名为TOP_SPEED的VARCHAR2列,解析其列中的文本数据以将其分解为两个新值,并将这些新值插入到CARS表中的两个新的NUMBER类型列中,即TOP_SPEED_KMH和TOP_SPEED_MPH。

TOP_SPEED列中的数据是这样的:例如。 “153 km/h(94.62 mph)”

我想将值153.00保存到TOP_SPEED_KMH列,并将94.62值保存到TOP_SPEED_MPH列中。

我想我有一个查询/脚本做的是这样的:

  1. 选择TOP_SPEED文本数据到本地文本变量
  2. 修改本地文本变量并保存新的值代入二号变量
  3. 写回两个数字变量对应TOP_SPEED_KMH和TOP_SPEED_MPH列

可能有人请确认我在正确的轨道上?如果有人有时间,我也会非常感谢任何示例代码。

干杯

回答

1

我认为只需要有top_speed_kmh列,摆脱mph就更好了。由于一英里公里内的千米数不会改变,因此您可以乘以0.6来转换为英里。因此,您可以执行与N West建议的相同的更新语句,而不使用mph列: UPDATE CARS SET TOP_SPEED_KMH = TO_NUMBER(SUBSTR(1,(INSTR(UPPER(TOP_SPEED),“KM/H”)-1)));

每当你需要英里/小时的速度,只要做 从汽车选择top_speed_kmh * 0.6作为top_speed_mph;

+0

这很好。端部的解决方案是: 'UPDATE CARS SET CAR_TOP_SPEED_KPH = TO_NUMBER(SUBSTR(CAR_TOP_SPEED,1,INSTR(UPPER(CAR_TOP_SPEED) KM/H')-1)), CAR_TOP_SPEED_MPH = TO_NUMBER(SUBSTR(REGEXP_SUBSTR( CAR_TOP_SPEED,'\([0-9] +'),2));' – fuzzyanalysis 2011-04-10 03:21:33

1

对于分析一下,你可能会使用两种REGEXP_SUBSTR或INSTR与SUBSTR

然后使用TO_NUMBER转换为数字

您可以创建每个PL/SQL函数解析,返回数字值,并在字段上运行UPDATE查询,或者可以创建一个PL/SQL过程,其中的游标循环遍历所有要更新的数据。

下面是一些内建的索姆链接:

http://psoug.org/reference/substr_instr.html http://download.oracle.com/docs/cd/B14117_01/server.101/b10759/functions116.htm

+0

干杯。每当我尝试使用游标来处理这类东西时,我都会收到错误,所以简单的'UPDATE ...'和'SET'现在可以工作......也许有更多经验我会考虑循环:)。 – fuzzyanalysis 2011-04-10 03:32:48

+0

似乎是一个不错的选择,如果你可以用UPDATE/SET来解决它就够了!如果你需要做更复杂的事情,在UPDATE/SET中难以做到,则使用游标循环是你通常采用的方法。而且,当使用游标和循环做东西时,您正在创建的代码可能比纯粹的UPDATE语句更依赖于数据库。 – Brummo 2011-04-10 20:11:10

1

你可能甚至不需要用PL/SQL来完成这件事。

只要在列中的数据是一致的“99.99公里每小时(99.99米/小时)”,你可以直接用SQL做到这一点:

UPDATE CARS 
SET TOP_SPEED_KMH = TO_NUMBER(SUBSTR(1, (INSTR(UPPER(TOP_SPEED), "KM/H") - 1))), 
    TOP_SPEED_MPH = <similar substr/instr combination to pull the 99.99 mph out of code>; 

集合的操作通常比过程要快得多操作。

+0

谢谢,这是正确的答案(请参阅我对布莱恩芬顿的回复) – fuzzyanalysis 2011-04-10 03:30:24

1

我的工作,涉及到 车辆方面 评估修改一个应用程序,并做了一些数 运算从存储在 Oracle 10g数据库的数字。不幸的是,我 只有一个文本数据库中的数据,但 我需要用数字和 工作不是文本

听起来像是你应该有一些数列来存储这些解析出的值。而不是总是调用一些解析例程(无论是regexp还是substr或自定义函数),请传递表中的所有数据并填充新的数字字段。您还应修改ETL过程以填充前进的新数字字段。

如果你需要数字并且可以解析它们,那么做一次(希望在一个临时区域或至少几个小时),然后得到你想要的数字。现在,你可以自由地做算术和一切你想从实数期望;)

+0

是的,这就是我在原始问题中的含义,不是每次都解析:)。 – fuzzyanalysis 2011-04-10 03:28:47

1

with s as 
    (select '153 km/h (94.62 mph)' ts from dual) 
select 
    ts, 
    to_number(substr(ts, 1, instr(ts, ' ') -1)) speed_km, 
    to_number(substr(regexp_substr(ts, '\([0-9]+'), 2)) speed_mph 
from s 
 
+0

谢谢,这帮助我解决了如何提取MPH部分的速度。 – fuzzyanalysis 2011-04-10 03:20:47

0

谢谢大家,真的很高兴能够利用每个人的投入,得到如下答案:

UPDATE CARS 
    SET 
    CAR_TOP_SPEED_KPH = 
     to_number(substr(CAR_TOP_SPEED, 1, instr(UPPER(CAR_TOP_SPEED), ' KM/H') -1)), 
    CAR_TOP_SPEED_MPH = 
     to_number(substr(regexp_substr(CAR_TOP_SPEED, '\([0-9]+'), 2));