Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 修改VARCHAR2列数据的PLSQL_String_Plsql_Oracle10g - Fatal编程技术网

String 修改VARCHAR2列数据的PLSQL

String 修改VARCHAR2列数据的PLSQL,string,plsql,oracle10g,String,Plsql,Oracle10g,我正在开发一个应用程序,该程序涉及评估对车辆所做的修改,并根据存储在Oracle 10g数据库中的数据进行一些数字运算。不幸的是,我的数据库中只有一个文本数据,但我需要处理数字而不是文本。我想知道是否有人可以帮助我理解如何使用PLSQL对Oracle 10g数据库中的VARCHAR2列数据执行字符串操作: 例如:我需要在一个名为CARS的表中获取一个名为TOP_SPEED的VARCHAR2列,解析该列中的文本数据以将其分解为两个新值,并将这些新值插入CARS表中两个新的数字类型列,即TOP_SP

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

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

“最高速度”列中的数据如下:“153公里/小时(94.62英里/小时)”

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

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

  • 将TOP_SPEED中的文本数据选择为本地文本变量
  • 修改本地文本变量并将新值保存到两个数字变量中
  • 将两个数字变量写回相应的TOP_SPEED_KMH和TOP_SPEED_MPH列
  • 有人能确认我走对了吗?如果有人有时间,我也会非常感激任何示例代码


    干杯

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

    然后使用TO_NUMBER转换为NUMBER

    您可以为每次解析创建一个PL/SQL函数,返回数值,并对字段运行更新查询,也可以创建一个PL/SQL过程,将光标循环到要更新的所有数据上

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


    http://download.oracle.com/docs/cd/B14117_01/server.101/b10759/functions116.htm

    您可能根本不需要使用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>;
    
    更新汽车
    将最高速度设置为公里小时=至公里数(SUBSTR(1,(INSTR(最高速度),“KM/H”)-1)),
    最高时速=;
    

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

    我认为最好只设置“最高速度”列,而不使用“时速”列。由于一英里中的公里数从未改变,您只需乘以0.6即可转换为英里。因此,您可以在不使用mph列的情况下执行N West建议的相同更新语句: 将轿厢设置最高速度(KM/H)更新为最高速度(SUBSTR(1)(仪表(最高速度),“KM/H”)-1))

    无论何时你需要每小时的速度,只要这样做 选择最高车速公里小时*0.6作为车辆的最高车速英里小时

    我正在开发一个涉及 评估对所做的修改 车辆,并执行一些编号 从存储在存储库中的数字进行压缩 Oracle 10g数据库。不幸的是,我 数据库中只有文本数据, 然而,我需要与数字打交道和 非文本

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


    如果你需要数字并且可以解析出来,就做一次(希望至少在临时区域或休息时间),然后得到你想要的数字。现在你可以自由地做算术和其他你期望从实数中得到的一切;)

    谢谢大家,很高兴能够利用大家的意见得到以下答案:

    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));
    

    谢谢,这帮我解决了如何提取时速部分的速度。效果很好。最终的解决方案是:
    updatecars SET CAR\u TOP\u SPEED\u KPH=to\u number(substr(CAR\u TOP\u SPEED,1,instr(up(CAR\u TOP\u SPEED,KM/H')-1)),CAR\u TOP\u SPEED\u MPH=to\u number(substr(regexp\u substr(CAR\u TOP\u SPEED,\[0-9]+')),2))
    是的,这是我在最初的问题中想做的,不是每次都要解析:)。谢谢,这是正确的答案(见我对布赖恩·芬顿的回答)干杯。每当我尝试使用游标处理这类内容时,总是会出现错误,因此简单的
    更新…
    设置现在就可以了。。。也许有更多的经验,我会考虑循环:)。似乎是一个很好的选择,如果你可以解决它的更新/设置它是足够好的!如果你需要做更复杂的事情,而在更新/设置中很难做到,你通常会使用光标循环。此外,在使用游标和循环时,您创建的代码可能比纯UPDATE语句更依赖于数据库。
    
    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));