Oracle pl/sql

/*create or replace type EMP_REC as
object(ID number(6),
  NAME varchar2(20),
  AGE NUMBER(3),
  PHONE varchar2(11),
  BIRTHDAY date,
  IMAGE varchar2(50),
  comm blob);
  */
 /* create or replace package EMP_FETCHER as
  function GET_EMP(ID in number) return EMP_REC;

  end;
  */
/*  create or replace package body EMP_FETCHER as
  function GET_EMP(ID in number) return EMP_REC is EMP_FOUND STUDENT
  % ROWTYPE;
  EMP_RTN EMP_REC;
  begin
  select *
  into EMP_FOUND
  from STUDENT
  where STUDENT.ID=ID;
  EMP_RTN:=EMP_REC(EMP_FOUND.ID,
      EMP_FOUND.name,
      EMP_FOUND.age);
    return EMP_RTN;
  end;
  end;
   */

 

In SQL*Plus, use an anonymous block to call the function:

 

DECLARE
  EMP_NO NUMBER;
  v_Return HR.EMP_REC;
 BEGIN
  v_Return := EMP_FETCHER.GET_EMP(201);
 END;
 /
 
2.自定义函数(oracle)
CREATE OR REPLACE
FUNCTION FUN1(sdate in Date,edate in Date) 
 RETURN NUMBER AS
 holidays number;
 st Date;
 en Date;
BEGIN
 select  DATE_START into st from T_ATTE_HOLIDAYS;
 select DATE_END into en from T_ATTE_HOLIDAYS;
 -- dbms_output.put_line(vv);
 if(st=sdate) then
  holidays:=22;
  Elsif(st<sdate) then
    holidays:=33;
  Elsif(st>sdate) then
    holidays:=44;
  end if;
  --holidays:=22;
  RETURN holidays;
END;
3.decode函数
如下:select decode(sign(salary - 8000),>=0,salary*1.15,<0,salary*1.2,salary) from employee 是不是很简洁? DECODE的语法:DECODE(value,if1,then1,if2,then2,if3,then3,...,else),表示如果value等于if1时,DECODE函数的结果返回then1,...,如果不等于任何一个if值,则返回else。
select decode(sysdate-(sysdate-1),'>0',2,1) from dual;  // 条件加单引号,否则报错,decode函数是个选择的关系
select decode(sign(1-3) ,-1,2,0,0,1) from dual;  //sing函数标记大于返回结果1,小于返回-1,等于0
 
问题3:  我想写一个decode函数,要求如下: 

如果 yrs_of_service < 1 返回 0.04 
如果 yrs_of_service >= 1 and < 5 返回0.04 
如果 yrs_of_service > 5 返回 0.06 

这种情况我该怎么做呢? 
select emp_name,decode(trunc((yrs_of_service+3)/4),0,0.04,1,0.04,0.06) as perc_value from employees; 
问题2:  我想知道是否可以用decode函数来确定数字范围,例如 1-10 = 'category 1', 11-20 = 'category 2', 比一个一个比较应该会好一点吧. 

回答: 不幸的告诉你,不可以用decode函数来确定数字的范围. 可是你可以试着创建一个表达式,这个表达式可以得一个数字指定的范围, 下一个数字对应下一个指定的范围, 以此类推. 

例如: 

select supplier_id,decode(trunc((supplier_id-1)/10),0,'category 1',1,'category 2',2,'category 3','unknown') result from suppliers; 



这个例子基于这个公式:trunc ((supplier_id - 1) / 10 



如果supplier_id在1和10之间,表达式计算值=0. 

如果supplier_id在11和20之间,表达式计算值=1. 


如果supplier_id在21和30之间,表达式计算值=3. 
 
select decode(trunc((to_number(to_char(attendance_time,'HH24mi'))-200)/800),0,0.5,1,0,0.5) from T_ATTENDANCE_TIME where attendance_id=13666
小于10点加0.5,大于18点加0.5,在它之间的为0
二、sign 

在Oracle/PLSQL中, sign 函数返回一个数字的正负标志. 



语法如下:sign( number ) 



        number 要测试标志的数字. 

If number < 0, then sign returns -1. 
If number = 0, then sign returns 0. 
If number > 0, then sign returns 1. 
 
三、trunc(number) 

在Oracle/PLSQL中, trunc function returns a number truncated to a certain number of decimal places. 

trunc function 语法如下: 

trunc( number, [ decimal_places ] ) 

number 要截取的数字. 

decimal_places 要保留的小数位. 这个参数必须是个整数. 如果此参数缺省,默认保留0位小数 
select * from T_USER intersect select * from T_USER where USER_ID in (264,265) //交集
select * from T_USER minus select * from T_USER where USER_ID in(264,265) //差集
select * from T_USER where user_id=264 union all select * from T_USER where user_id in (264,265) //并集 union不包括重复行,union all包括重复行



你可能感兴趣的:(oracle,sql)