如何使用PLSQL将VARCHAR2更改为NUMBER数据类型

时间:2019-07-18 20:59:18

标签: sql oracle

我正在尝试使用Toad for Oracle将一堆数据从MS Access移到Oracle DB。我在Access中具有此类数据的字段:

ID TRANS_AMT AMT

1($ 100.00)($ 20.00)

2($ 30.00)($ 15.00)

3 $ 45.00($ 10.00)

4 $ 10.00 $ 50.00

Access中的源表的数据类型设置为TRANS_AMT和AMT的货币。当我创建Oracle表作为目标表时,由于括号的原因,我不得不将数据类型更改为VARCHAR2。

我需要的是一个过程或函数,该过程或函数将删除括号,如果括号确实存在,则将结果值乘以-1,然后根据ID将数据放入新表中。

我需要它来循环很多记录。

3 个答案:

答案 0 :(得分:0)

将括号翻译成尖括号,并使用Oracle TO_NUMBER()函数的“ PR”格式模型。

示例:

with test_data ( val ) as
( select '($100.00)' FROM DUAL UNION ALL
  select '($30.00)' FROM DUAL UNION ALL  
  select '($5,392.00)' FROM DUAL UNION ALL  
  select '$45.00' FROM DUAL UNION ALL    
  select '$19.00' FROM DUAL UNION ALL
  select '$1,837.33' FROM DUAL )
SELECT val, to_number(translate(val,'()','<>'),'FM$999,999.00PR') as_number
FROM   test_data;
+-------------+-----------+
|     VAL     | AS_NUMBER |
+-------------+-----------+
| ($100.00)   |      -100 |
| ($30.00)    |       -30 |
| ($5,392.00) |     -5392 |
| $45.00      |        45 |
| $19.00      |        19 |
| $1,837.33   |   1837.33 |
+-------------+-----------+

更新版本:PL / SQL使用情况

这也适用于PL / SQL。例如,

DECLARE
  l_string_from_access VARCHAR2(30) := '($5,392.00)';
BEGIN
  raise_application_error(-20001, 'Number value is: ' || to_number(translate(l_string_from_access,'()','<>'), 'FM$999,999.00PR'));
END;
Error report -
ORA-20001: Number value is: -5392
ORA-06512: at line 4

答案 1 :(得分:0)

Oracle设置

CREATE TABLE table_name ( ID, TRANS_AMT, AMT ) AS
SELECT 1, '($100.00)', '($20.00)' FROM DUAL UNION ALL
SELECT 2, '($30.00)',  '($15.00)' FROM DUAL UNION ALL
SELECT 3, '$45.00',    '($10.00)' FROM DUAL UNION ALL
SELECT 4, '$10.00',    '$50.00'   FROM DUAL

查询

SELECT ID,
       TO_NUMBER( TRANSLATE( TRANS_AMT, '($)', '-' ) ) AS trans_amt,
       TO_NUMBER( TRANSLATE( AMT, '($)', '-' ) ) AS amt
FROM   table_name

输出

ID | TRANS_AMT | AMT
-: | --------: | --:
 1 |      -100 | -20
 2 |       -30 | -15
 3 |        45 | -10
 4 |        10 |  50

db <>提琴here

答案 2 :(得分:0)

其他人向您展示了如何Reference Assemblies folders数据。要将SELECT行插入新表中,请使用

INSERT

无需循环-一次性完成所有操作。

或-您可以将数字字段直接添加到现有表中

INSERT INTO YOUR_NEW_TABLE (ID, TRANS_AMT, AMT)
  SELECT o.ID,
         TO_NUMBER(TRANSLATE(o.TRANS_AMT, '($)', '-'), '999,999.00'),
         TO_NUMBER(TRANSLATE(o.AMT, '($)', '-'), '999,999.00')
    FROM OLD_TABLE o

,然后使用

将所需的值设置到新字段中
ALTER TABLE OLD_TABLE
  ADD (NEW_TRANS_AMT  NUMBER,
       NEW_AMT        NUMBER)

dbfiddle here