我的目标是创建一个将NUMBER
变量转换为VARCHAR2
的函数,同时将逗号替换为小数点分隔符。此外,该字符串还带有一个掩码,该掩码取决于作为I_qty_value
传递的数字的整数和十进制大小。
declare
L_result VARCHAR2(20);
FUNCTION CONVERT_QTY_FORMAT(I_qty_value IN NUMBER,
I_precision IN NUMBER,
I_scale IN NUMBER)
RETURN VARCHAR2 IS
--
L_conv_value VARCHAR2(255);
L_mask VARCHAR2(50);
L_integer_size NUMBER := I_precision - I_scale;
L_decimal_size NUMBER := I_scale;
--
BEGIN
--
-- Apply mask only if price is a decimal.
--
IF round(I_qty_value) = I_qty_value THEN
--
L_conv_value := TRIM(TO_CHAR(I_qty_value));
--
ELSE
--
-- Mask constructor based on value's length and precision.
--
L_mask := LTRIM(LPAD('0', L_integer_size , 9)) || 'D' || LTRIM(LPAD('0', L_decimal_size, 0));
--
-- Convert number to string using previous mask.
--
L_conv_value := TRIM(REPLACE(TO_CHAR(I_qty_value, L_mask),',','.'));
--
END IF;
--
RETURN L_conv_value;
--
END CONVERT_QTY_FORMAT;
begin
L_result := CONVERT_QTY_FORMAT(1000.999, 6, 2);
dbms_output.put_line(L_result);
end;
尽管该功能已经可以使用,但是两个输入参数(I_precision
和I_scale
)正在手动传递。 我想创建一个附加函数,该函数将根据输入的变量数据类型返回变量数字的精度和小数位数。是否有任何PL / SQL指令或核心表可以帮助我做到这一点?
例如,假设tbl1_1.column_1
是NUMBER(8,3)
。
从column_1
获取8和3值的最佳方法是什么?
提前谢谢!
答案 0 :(得分:2)
您可以在T
和user_tab_cols
视图中找到以下信息:
all_tab_cols
create table tbl1_1(column_1 number(8,3));
select column_name, data_precision, data_scale
from user_tab_cols
where table_name = 'TBL1_1' and column_name = 'COLUMN_1';