我正在尝试使用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将数据放入新表中。
我需要它来循环很多记录。
答案 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。例如,
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)