一 oracle创建有返回值的函数并调用函数
1 创建调用只有输入参数的函数
create or replace function fun_test_1(param1 in number,param2 in number)
return number as
begin
if param1>param2 then
return param1;
else
return param2;
end if;
end fun_test_1;
-- 调用函数
select fun_test_1(66,33) from dual;
2 Mybatis中调用
创建有输入输出参数的函数
-- 创建带有输入输出参数的函数
create or replace function fun_test_2(param1 in number,param2 out number)
return number as
begin
if param1>param2 then
return param1;
else
return param2;
end if;
end fun_test_2;
这种函数我们一般不会在sqlplus中进行调用,个人认为调用的时候使用mybatis或者使用PLSQL等工具进行测试比较方便
<select id="funTest" statementType="CALLABLE" parameterType="java.util.Map">
{#{param2,mode=OUT,jdbcType=NUMBER} = call F_GET_ROLEIDS(#{param1,mode=IN,jdbcType=NUMBER})}
</select>
需要注意的是我们不需要创建返回值进行参数的接收,当我们传递的参数为map时,mybati会自动将我们的out类型参数封装到我们的parameterType的map集合中;
二 oracle存储过程的创建和调用
1 创建调用存储过程
-- 创建存储过程
create or replace procedure pro1(uname in varchar2,pwd in varchar2,num in number,mes out varchar2,code out varchar2) is
begin
insert into TEST_MR values (uname,pwd,num);
end;
-- 调用
declare
code varchar2(4);
mes varchar2(10);
uname varchar2(10);
pwd varchar2(10);
begin
pro1(uname => 'lk',pwd => '123',num => 2,mes => mes,code => code);
DBMS_OUTPUT.PUT_LINE(mes);
end;
-- 删除存储过程
drop procedure PRO1;-- 创建存储过程
2 Mybatis调用参数过程
和调用自定义函数一样,不需要创建结果集Map来接收返回来的output参数,只要执行结束,output参数会自动封装到里面;
只不过,存储过程我们习惯将输出参数定义在()里面进行传参
<select id="proTest" statementType="CALLABLE" parameterType="java.util.Map">
{call pro1
(
#{uname,mode=IN,jdbcType=VARCHAR},
#{password,mode=IN,jdbcType=VARCHAR},
#{num,mode=IN,jdbcType=NUMBER},
#{mes,mode=OUT,jdbcType=VARCHAR},
#{code,mode=OUT,jdbcType=VARCHAR}
)}
</select>
总结
本次主要记录在工作中遇到的问题和解决之后的总结
本次测试使用工具:
ORACLE数据库连接工具: DataGrip2020.1
笔记工具:Typora
时间"2020-11-08