24SQL
create or replace function f_op (p_n1 number , p_op varchar2 , p_n2 number ) return number
as
begin
return case when p_op = '+' then p_n1 + p_n2
when p_op = '-' then p_n1 - p_n2
when p_op = '*' then p_n1 * p_n2
when p_op = '/' and p_n2<> 0 then p_n1 / p_n2
else null
end ;
end f_op;
/
create or replace procedure pro_241(p1 number , p2 number , p3 number , p4 number ) as
r_result number default 0 ;
begin
for r in (
with t_num as
( select 1 id ,p1 as n from dual
union
select 2 id ,p2 as n from dual
union
select 3 id ,p3 as n from dual
union
select 4 id ,p4 as n from dual),
t_op as
( select '+' as o from dual
union
select '-' as o from dual
union
select '*' as o from dual
union
select '/' as o from dual)
select distinct
a.n as a,
o1.o as o1,
b.n as b,
o2.o as o2,
c.n as c,
o3.o as o3,
d.n as d
from t_num a, t_num b, t_num c, t_num d,
t_op o1, t_op o2, t_op o3
where a.id not in (b.id, c.id, d.id)
and b.id not in (c.id, d.id)
and c.id <> d.id) loop
r_result := f_op(f_op(f_op(r.a,r.o1,r.b),r.o2,r.c),r.o3,r.d);
if r_result=12 then
dbms_output.put_line( '((' ||r.a||r.o1||r.b|| ')' ||r.o2||r.c|| ')' ||r.o3||r.d);
end if ; --((a b) c) d
r_result := f_op(f_op(r.a,r.o1,r.b),r.o2,f_op(r.c,r.o3,r.d));
if r_result=12 then
dbms_output.put_line( '(' ||r.a||r.o1||r.b|| ')' ||r.o2|| '(' ||r.c||r.o3||r.d|| ')' );
end if ; --(a b) (c d)
end loop ;
end ;
/
set serveroutput on;
exec pro_241( 32 , 13 , 3 , 17 );