【问题标题】:PL/SQL instruction to get numeric column precision获取数值列精度的 PL/SQL 指令
【发布时间】: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_precisionI_scale)正在手动传递。 我想创建一个附加函数,该函数将根据输入变量数据类型返回变量数字精度和比例。是否有任何 PL/SQL 指令或核心表可以帮助我执行此操作?

例如,假设tbl1_1.column_1NUMBER(8,3)

column_1 获取 8 和 3 值的最佳方法是什么?

提前致谢!

【问题讨论】:

  • 您可以使用to_char() 的可选第三个参数来避免replace() 步骤,并将FM 添加到掩码以避免trim() 步骤,因为它会抑制前导空格。跨度>
  • 另外,如果你想从 within CONVERT_QTY_FORMAT 中找出 I_qty_value 的原始精度/比例,那么你做不到。您能看到的最好的是形式参数的数据类型,但您已经知道了。当您的函数看到该值时,它已经从调用者知道的任何类型隐式转换(如果需要)(无论是数字文字、列还是变量;以及它是否已经是数字或字符串,等)到您的正式参数类型 - 在这种情况下是一个不受限制的数字。

标签: sql oracle plsql type-conversion


【解决方案1】:

您可以在user_tab_colsall_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';

COLUMN_NAME                    DATA_PRECISION DATA_SCALE
------------------------------ -------------- ----------
COLUMN_1                                    8          3

【讨论】:

  • 谢谢!现在假设我将一个变量声明为L_xpto NUMBER(8,3),并且我想将 L_xpto 作为参数传递,而不是指向任何表类型。在那种情况下,我不能使用核心表,因为数据类型不是表类型。有什么我可以做的吗?
  • 对于过程、函数中定义的变量——我怀疑你能找到这个。您可以在all_arguments 中查看一些参数定义。其余的 - 我不知道。
猜你喜欢
  • 2011-11-11
  • 2012-02-19
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多