Oracle-四舍五入所有列中的所有数值

时间:2020-05-04 13:59:59

标签: oracle rounding

这是我的第一个问题。

我第一次需要对Oracle表中包含的所有数字值进行运算。

我从经典的“ SELECT * FROM ... WHERE ...”开始(我有147列),我想四舍五入在行/列中找到的所有小数。

有办法吗?

谢谢!

3 个答案:

答案 0 :(得分:0)

您可以按以下方式使用动态查询

BEGIN
    FOR ALL_COLS IN (
        SELECT TABLE_NAME,
               COLUMN_NAME
          FROM USER_TAB_COLUMNS
         WHERE TABLE_NAME = '<YOUR_TABLE_NAME>' AND DATA_TYPE = 'NUMBER'
    ) LOOP
        EXECUTE IMMEDIATE 'UPDATE ' || TABLE_NAME
                       || ' SET ' || COLUMN_NAME || ' = ROUND(' || COLUMN_NAME || ') '
                       || ' WHERE ' || COLUMN_NAME || ' <> ROUND(' || COLUMN_NAME || ')';
    END LOOP;
COMMIT;
END;
/

答案 1 :(得分:0)

您可以像下面这样构建查询

    SELECT 'SELECT '
           || Listagg(Decode(data_type, 'NUMBER', 'ROUND('
                                                  ||column_name
                                                  ||') '
                                                  || column_name,
                                        column_name), ',')
                within GROUP (ORDER BY column_id)
           ||' FROM '
           ||'TABLE_NAME'
    FROM   user_tab_cols
    WHERE  table_name = 'TABLE_NAME' 

答案 2 :(得分:0)

感谢您的所有回答...

最后,我对所有列进行了循环,并重新编写了查询:用户插入“ SELECT ”,然后将“ ”替换为所有列名(以及ROUND)在数字上)。

这不是“最快”的解决方案,但它可以起作用...