Инструкция PL / SQL для получения точности числового столбца - PullRequest
0 голосов
/ 22 марта 2019

Моя цель - создать функцию, которая преобразует переменную 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).

Как лучше всего получить 8 и 3 значения из column_1?

Заранее спасибо!

1 Ответ

2 голосов
/ 22 марта 2019

Вы можете найти эту информацию в 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';

COLUMN_NAME                    DATA_PRECISION DATA_SCALE
------------------------------ -------------- ----------
COLUMN_1                                    8          3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...