PLSQL修改VARCHAR2列数据

时间:2011-03-25 22:52:58

标签: string plsql oracle10g

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

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

TOP_SPEED列中的数据是这样的:例如。 “153公里/小时(94.62英里/小时)”

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

我认为我在查询/脚本中必须做的是:

  1. 将TOP_SPEED中的文本数据选择为本地文本变量
  2. 修改本地文本变量并将新值保存为两个数字变量
  3. 将两个数字变量写回相应的TOP_SPEED_KMH和TOP_SPEED_MPH列
  4. 有人可以确认我走在正确的轨道上吗?如果有人有时间,我也非常感谢任何示例代码。

    干杯

6 个答案:

答案 0 :(得分:1)

对于解析位,您可能使用REGEXP_SUBSTR或INSTR与SUBSTR

然后使用TO_NUMBER转换为数字

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

以下是一些内置插件的som链接:

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

答案 1 :(得分:1)

您甚至可能根本不需要使用PL / SQL。

只要列中的数据一致“99.99 km / h(99.99 m / h)”,您就可以直接使用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>;

设置操作通常比程序操作快得多。

答案 2 :(得分:1)

我认为最好只有top_speed_kmh列,然后摆脱mph。由于一英里内的公里数不会改变,您可以简单地乘以0.6以转换为英里数。因此,您可以在没有mph列的情况下执行与N West建议相同的更新语句: 更新车辆设置TOP_SPEED_KMH = TO_NUMBER(SUBSTR(1,(INSTR(UPPER(TOP_SPEED),“KM / H”)-1)));

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

答案 3 :(得分:1)

  

我正在开发涉及的应用   评估对...的修改   车辆,并做一些号码   从存储在数据中的数字中碾压   Oracle 10g数据库。不幸的是,我   只有数据库中的文本数据,   但我需要使用数字和   不是文字

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

如果您需要数字并且可以解析它们,请执行一次(希望在临时区域或至少下班时间),然后输入您想要的数字。现在你可以自由地做算术和其他你想从实数中得到的东西;)

答案 4 :(得分: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

答案 5 :(得分: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));