Вычислить значения из столбца, имеющего выражение - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть таблица "test_calculate", в которой есть столбец "CONN_BY", имеющий значения

enter image description here

. Столбец может иметь более 2 чисел для умножения и эта таблица может содержать миллионы строк, мне нужно получить результат вычисления от "CONN_BY" до "MVP".

Я использовал xmlquery для вычисления и динамического запроса c, но они довольно медленные , Есть ли другой способ, который намного быстрее. Пожалуйста, предложите.

Ответы [ 2 ]

1 голос
/ 26 апреля 2020

Вы можете попробовать динамический запрос c.

Создайте функцию, которая возвращает вычисленное значение, и используйте ее в запросах вставки или выбора.

 CREATE OR REPLACE FUNCTION UFN_CALCULATE (CLM_VALUE VARCHAR2)
    RETURN NUMBER IS
    RES_VAL NUMBER;
BEGIN
    EXECUTE IMMEDIATE 'select '||CLM_VALUE||' FROM DUAL' INTO RES_VAL;
    RETURN RES_VAL;
END;

Вы можете использовать эту функцию, как показано ниже.

SELECT UFN_CALCULATE('.0876543 * .09876') FROM DUAL;
SELECT UFN_CALCULATE(CONN_BY) FROM YOUR_TABLE;
0 голосов
/ 26 апреля 2020

В одном варианте используется запрос select ... connect by level <= regexp_count(conn_by,'[^*]+')... для неявного курсора в кодовом блоке PL / SQL

SQL> set serveroutput on 

SQL> declare
  mvp owa.nc_arr; -- numeric array to initialize each multiplication to 1 for each id value
begin
       dbms_output.put_line('ID  MVP'); 
       dbms_output.put_line('--------');       
  for c in
  (
     select id, 
            to_number( regexp_substr(conn_by,'[^*]+',1,level) ) as nr,
            level as lvl , max( level ) over ( partition by id ) as mx_lvl
       from test_calculate
    connect by level <= regexp_count(conn_by,'[^*]+')
        and prior sys_guid() is not null
        and prior conn_by = conn_by
      order by id, lvl  
   )
   loop
    if c.lvl = 1 then mvp(c.id) := 1; end if;
    mvp(c.id) := c.nr * mvp(c.id);
    if c.lvl = c.mx_lvl then
       dbms_output.put_line(c.id||'   '||mvp(c.id)); 
    end if;

   end loop;
end;  
/

, где предполагается, что test_calculate имеет столбец идентификаторов (id)

Демо

...