Sử dụng SQL để viết các hàm tích hợp

Thử thách khá là đơn giản: Sử dụng SQL để viết một function tính toán cho hàm sau:

Không phải mọi hàm đều có tích phân, nhưng đối với nhiều hàm, một phép tính gần đúng hợp lý của giá trị có thể được thực hiện với Riemann Sums hoặc bạn thường có thể nhận được một giá trị gần đúng hơn với cùng một lượng tính toán bằng cách sử dụng Quy tắc Trapezoidal

Với một chút sử dụng các biểu thức bảng phổ biến (hay còn gọi là mệnh đề WITH) và thực tế là các hàm do người dùng xác định có thể được nhúng trực tiếp vào bên trong chúng, đây là một SQL tích hợp đơn giản

SQL> with
  2    function f(x number) return number is
  3    begin
  4      return 3*x*x + 2*x;
  5    end;
  6  boundaries as ( select 1 x_start, 5 x_end, 0.000001 delta from dual )
  7  select
  8    sum(
  9     case when level in (1, ( x_end - x_start ) / delta) then 1 else 2 end *
 10     f(x_start + (level-1)*delta)
 11    )*delta/2 integ
 12  from boundaries
 13  connect by level <= ( x_end - x_start ) / delta;
 14  /

     INTEG
----------
147.999915

Hoặc nếu bạn thích ANSI và thích đệ quy WITH hơn là CONNECT BY thì bạn có thể làm tương tự với điều này:

SQL> with
  2    function f(x number) return number is
  3    begin
  4      return 3*x*x + 2*x;
  5    end;
  6  boundaries as ( select 1 x_start, 5 x_end, 0.00001 delta from dual ),
  7  integral(seq,fnc,inp) as
  8  (
  9    select 1 seq, f(x_start) fnc, x_start inp  from boundaries
 10    union all
 11    select seq+1, f(inp+delta), inp+delta
 12    from integral, boundaries
 13    where inp+delta <= x_end
 14  )
 15  select
 16    sum(decode(seq,1,1,x_end,1,2)*fnc)*delta/2
 17  from integral, boundaries
 18  /

SUM(DECODE(SEQ,1,1,X_END,1,2)*FNC)*DELTA/2
------------------------------------------
                                  148.0004