Sql 从具有表达式的列计算值

Sql 从具有表达式的列计算值,sql,oracle,plsql,Sql,Oracle,Plsql,我有一个表test\u计算它有一个列CONN\u,通过有值 列可以有2个以上的数字相乘,并且这个表可能包含数百万行,我需要得到从CONN_BY到MVP的计算结果 我在计算和动态查询中使用了xmlquery,但它们非常慢。是否有其他更快的方法。请建议。您可以尝试动态查询 创建一个返回计算值的函数,并在insert或select查询中使用它 CREATE OR REPLACE FUNCTION UFN_CALCULATE (CLM_VALUE VARCHAR2) RETURN NUMBER

我有一个表test\u计算它有一个列CONN\u,通过有值

列可以有2个以上的数字相乘,并且这个表可能包含数百万行,我需要得到从CONN_BY到MVP的计算结果


我在计算和动态查询中使用了xmlquery,但它们非常慢。是否有其他更快的方法。请建议。

您可以尝试动态查询

创建一个返回计算值的函数,并在insert或select查询中使用它

 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;

一个选项是使用选择。。。按级别连接您尝试过动态查询吗?是的,我尝试过。但是有点慢。我需要快速执行的东西。。如果可能的话,我的意思是最多10到15秒数据集的大小,我的意思是您正在获取的行以及如何执行查询
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;  
/