mysql实现函数,能够根据权利人的编号查出权利人的名称

--函数 
函数就是一个有返回值的过程     
--定义一个函数,这个函数能够根据权利人的编号查出权利人的名称
CREATE OR REPLACE FUNCTION MYFUN(YBSM QLR.BSM%TYPE) RETURN VARCHAR2
AS 
RSAL VARCHAR2(255);
BEGIN 
SELECT QLRMC INTO RSAL FROM QLR WHERE YBSM=BSM;
RETURN RSAL;
END;
/
--调用此函数
SELECT MYFUN(7217963) FROM DUAL ;


--输入一个BSM,判断该BSM在不在权利人表中,存在返回1,不存在返回0 
CREATE OR REPLACE FUNCTION CZ_FUN(YBSM QLR.BSM%TYPE) RETURN NUMBER
AS
IS_EXIST NUMBER;
BEGIN
SELECT COUNT(9) INTO IS_EXIST FROM QLR WHERE YBSM=BSM;
RETURN IS_EXIST;
END;
/
--调用此函数
SELECT CZ_FUN(123) FROM DUAL;
SELECT CZ_FUN(7217963) FROM DUAL;


--写一个函数,传入权利人标识码,返回证号
CREATE OR REPLACE FUNCTION ZH_FUN(YBSM QLR.BSM%TYPE) RETURN VARCHAR2
AS
ZH VARCHAR2(255);
BEGIN
SELECT B.BDCQZH INTO ZH FROM QLR A,DJFZ_CQZS B WHERE YBSM=A.BSM AND A.QLBSM=B.QLBSM /*AND ROWNUM=1*/;
RETURN ZH;
END;
/
--调用此函数
SELECT ZH_FUN(7217963) FROM DUAL;
--报错:实际返回的行数超出请求的行数
原因:select into是隐式游标,只能传一个内容进去
当加上rownum=1,就是选取了第一行,也就是说只是一行,肯定不会有其他相异的内容。
但是如果就是想要返回多行记录。那这样的话该怎么改呢?
那就只能用oracle pl/sql游标了,但是只能一条一条的处理,不要加函数传出值,需用存储过程。


--写一个函数,传入时间,返回更新时间比这个时间早的权利人名称
CREATE OR REPLACE FUNCTION SJ_FUN(YGXSJ QLR.GXSJ%TYPE) RETURN VARCHAR2
AS
MC VARCHAR2(255);
BEGIN 
SELECT QLRMC INTO MC FROM QLR WHERE YGXSJ>QLR.GXSJ AND ROWNUM=1;
RETURN MC;
END;
/
--调用函数
SELECT SJ_FUN(TO_DATE('2017/07/24','yyyy/mm/dd')) FROM DUAL;
SELECT SJ_FUN(TO_DATE('2017/7/10 15:57:45','yyyy/mm/dd hh24:mi:ss')) FROM DUAL;

猜你喜欢

转载自blog.csdn.net/wanglepingwangleping/article/details/79270932