数据库 sql函数

1 sql函数语法


1.1 条件语句 if else

--if-then
if condition then
  sequece_of statements
end if;

--if-then-else
if condition then
  sequece_of statements1
else
  sequece_of statements1
end if;

--if-then-elseif-else
if condition1 then
  sequece_of statements1
elseif condition1 then
  sequece_of statements2
else
  sequece_of statements3
end if;
--例子存储函数
create or replace function testifelse(idd in varchar) return number is
  Result number;
  v_para1 number;
  v_para2 number;
  message varchar2(200);
begin
  select count(1) into v_para1 from dual;
  if v_para1 <> 0 then v_para1 := '111';
  end if;
  if v_para2 is null then message := 'number类型的默认是null,不是0';
  end if;
  dbms_output.put_line('v_para1='||v_para1||'---'||'v_para2='||message);
  return(Result);
end testifelse;


1.2 case 语句

case selector
 when expression1 then sequence_of_statemts1;
end case;
--例子1:
select case 
         when 1 = 1 and 2 = 2 then
          '正确'
       end case
  from dual
--例子2 函数
create or replace function testCase(condition in varchar2) return varchar2 is
  Result varchar2(20);
  v_param dual.dummy%type;
begin
  case condition
    when ''  then Result:='参数是空';
    when '1' then Result:='参数是1';
    when '2' then Result:='参数是2';
    dbms_output.put_line(v_param);
    end case;
  return(Result);
end testCase;
--例子2 存储过程
create or replace procedure testcase(para_in  in varchar2,
                                     para_out out varchar2) is
  v_param varchar2(20);
begin
  dbms_output.put_line('存储过程');
  case para_in
    when '1' then
      para_out := para_in || 'out参数';
    when '2' then
      para_out := para_in || 'out参数2';
  end case;
end testcase;


1.3 for loop 数组以及数组类型

 

declare
  i number;
  type list_type is table of binary_integer index by binary_integer; -- 类型定义
  list list_type;
begin
  for i in reverse 1 .. 5 loop
    list(i) := i * 1;
    dbms_output.put_line(list(i));
  end loop;
  dbms_output.put_line(list.first());
end;
Declare
  type my_text_table_type is table of varchar2(200) index by binary_integer;
  l_text_table my_text_table_type;
  l_index      number;
begin
  for l_index in 1 .. 5 loop
    l_text_table(l_index) := l_index * l_index;
  end loop;
  l_index := l_text_table.first; --使用first方法
  dbms_output.put_line('000'||l_text_table.first);
  loop
    exit when l_index is null;
    dbms_output.put_line(l_index || ':' || l_text_table(l_index));
    l_index := l_text_table.next(l_index);
  end loop;
end;

  下表中列出oracle中集合的方法
方法 描述 使用限制
COUNT 返回集合中元素的个数
DELETE 删除集合中所有元素
DELETE() 删除元素下标为x的元素,如果x为null,则集合保持不变          对VARRAY非法
DELETE(,) 删除元素下标从X到Y的元素,如果X>Y集合保持不变             对VARRAY非法
EXIST() 如果集合元素x已经初始化,则返回TRUE, 否则返回FALSE
EXTEND 在集合末尾添加一个元素                                       对Index_by非法
EXTEND() 在集合末尾添加x个元素                                      对Index_by非法
EXTEND(,) 在集合末尾添加元素n的x个副本                              对Index_by非法
FIRST 返回集合中的第一个元素的下标号,对于VARRAY集合始终返回1。
LAST 返回集合中最后一个元素的下标号, 对于VARRAY返回值始终等于COUNT.
LIMIT 返回VARRY集合的最大的元素个数,对于嵌套表和对于嵌套表和Index_by为null Index_by集合无用
NEXT() 返回在元素x之后及紧挨着它的元素的值,如果该元素是最后一个元素,则返回null.
PRIOR() 返回集合中在元素x之前紧挨着它的元素的值,如果该元素是第一个元素,则返回null。
TRI M 从集合末端开始删除一个元素                                    对于index_by不合法
TRIM() 从集合末端开始删除x个元素                                    对index_by不合法

 

 1.4 实战例子

create or replace function getArrearage2(yuangongID in varchar2)
  return number is
  Result number;
  money1 number;
  money2 number;
  money3 number;
begin
  select count(1)
    into money1
    from (SELECT b.id_worker, SUM(B.ALLOW_MONEY) as totalMoney
            FROM T_MONEY1 B
           WHERE B.STATUS = '1'
             AND B.FLAG = '1'
             AND B.BILL_STAUTUS = '4'
             AND B.ID_WORKER = yuangongID
           group by b.id_worker);
  if (money1 0) then
    select totalMoney
      into money1
      from (SELECT b.id_worker, SUM(B.ALLOW_MONEY) as totalMoney
              FROM T_MONEY1 B
             WHERE B.STATUS = '1'
               AND B.FLAG = '1'
               AND B.BILL_STAUTUS = '4'
               AND B.ID_WORKER = yuangongID
             group by b.id_worker);
  end if;
  select count(1)
    into money2
    from (SELECT b.id_worker, sum(b.back_money) as back_money
            FROM T_MONEY2 B
           WHERE B.STATUS = '1'
             AND B.FLAG = '1'
             AND B.ID_WORKER = yuangongID
           group by b.id_worker) tt;
  if (money2 0) then
    select tt.back_money
      into money2
      from (SELECT b.id_worker, sum(b.back_money) as back_money
              FROM T_MONEY2 B
             WHERE B.STATUS = '1'
               AND B.FLAG = '1'
               AND B.ID_WORKER = yuangongID
             group by b.id_worker) tt;
  end if;
  select count(1)
    into money3
    from (SELECT p.id_worker, sum(c.money) as money
            FROM T_MONEY3 C
            LEFT JOIN MB_PAY_ASK P
              ON P.ID = C.ID_PAYBILL
           WHERE C.MONEY IS NOT NULL
             AND C.MONEY '0'
             AND C.STATUS = '1'
             AND C.FLAG = '1'
             AND P.STATUS = '1'
             AND P.FLAG = '1'
             AND P.ID_WORKER = yuangongID
             AND P.PROPOSAL_STATUS = '4'
           group by p.id_worker) xx;
  if (money3 0) then
    select xx.money
      into money3
      from (SELECT p.id_worker, sum(c.money) as money
              FROM T_MONEY3 P
             WHERE C.MONEY IS NOT NULL
               AND C.MONEY '0'
               AND C.STATUS = '1'
               AND C.FLAG = '1'
             group by p.id_worker) xx;
  end if;
  Result := money1 - money2 - money3;
  return(Result);
end getArrearage2;

 

你可能感兴趣的:(oracle,sql,C++,c,C#)