Oracle - 舍入所有列中的所有数值
Oracle - Round all the numeric values in all columns
这是我的第一个问题。
我第一次需要舍入 Oracle table 中包含的所有数值。
我从经典 "SELECT * FROM ... WHERE ..."(我有 147 列)开始,我想四舍五入我在行/列中找到的所有小数。
有办法吗?
谢谢!
您可以使用动态查询,如下所示:
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;
/
您可以像下面这样构建查询
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'
感谢您的所有回答...
最后,我为我的所有列创建了一个循环并重新编写了查询:用户插入一个 "SELECT " 然后我用所有列名替换“”(并且数字上的 ROUND)。
这不是 "fastest" 解决方案,但它有效...
这是我的第一个问题。
我第一次需要舍入 Oracle table 中包含的所有数值。
我从经典 "SELECT * FROM ... WHERE ..."(我有 147 列)开始,我想四舍五入我在行/列中找到的所有小数。
有办法吗?
谢谢!
您可以使用动态查询,如下所示:
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;
/
您可以像下面这样构建查询
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'
感谢您的所有回答...
最后,我为我的所有列创建了一个循环并重新编写了查询:用户插入一个 "SELECT " 然后我用所有列名替换“”(并且数字上的 ROUND)。
这不是 "fastest" 解决方案,但它有效...