/*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包括重复行