【发布时间】:2019-08-13 10:12:09
【问题描述】:
我的目标是创建一个函数,将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 值的最佳方法是什么?
提前致谢!
【问题讨论】:
-
您可以使用
to_char()的可选第三个参数来避免replace()步骤,并将FM添加到掩码以避免trim()步骤,因为它会抑制前导空格。跨度> -
另外,如果你想从 within
CONVERT_QTY_FORMAT中找出I_qty_value的原始精度/比例,那么你做不到。您能看到的最好的是形式参数的数据类型,但您已经知道了。当您的函数看到该值时,它已经从调用者知道的任何类型隐式转换(如果需要)(无论是数字文字、列还是变量;以及它是否已经是数字或字符串,等)到您的正式参数类型 - 在这种情况下是一个不受限制的数字。
标签: sql oracle plsql type-conversion