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 );

 

posted @ 2016-09-26 13:41  董永辉Bruno  阅读(188)  评论(0编辑  收藏  举报