金沙js8331Oracle存储过程和存储函数创建方法,存储函数和触发器

select * from emp;

/*
   存款和储蓄进度  是大器晚成段封装的代码块 编写翻译好放在服务器
             好处: 援助多处调用 升高开采功效
                   调用直白运维 进步运作效能
   创造存款和储蓄进度 create [or replace] procedure 进程名(参数名 in|out
参数数据类型 卡塔尔(قطر‎
                as|is
                  -注解部门
                begin
                   -管理逻辑代码
                end;
   存款和储蓄进度的调用
       在begin 和 end之间 进程名传参调用
*/
–使用存款和储蓄进度给有些职员和工人工资增添100元钱 输出涨工资前后的数目
create or replace  procedure add_sal(eno in number)
as
   v_sal number ;
begin
   –输出原始薪水
   select sal into v_sal from emp where empno=eno;
   dbms_output.put_line(‘原始报酬===’||v_sal);
   –涨工资
   update emp set sal=sal+100 where empno=eno;
   commit;

—————–存款和储蓄进程————————

 

–定义

 

create[or replace] procedure 存款和储蓄进程名称(参数名 [in]/out 数据类型)is/as begin

 

–逻辑表达式

   –输出改良后薪水
   select sal into v_sal from emp where empno=eno;
   dbms_output.put_line(‘改正后薪资===’||v_sal);
end;

end [存款和储蓄进度名称];

–进度调用
declare
begin
   add_sal(7369);
end;
—–使用存款和储蓄进度得到总计后的某些职员和工人每年薪酬
create or replace  procedure count_sal(eno number,year_sal out
number)
as
begin
   select sal*12+nvl(comm,0) into year_sal  from emp where empno =
eno;
end;

–定义存款和储蓄进程计算年工资,并允诺输出

–调用经过总括年收入
declare
  v_year_sal number;
begin
   count_sal(7369,v_year_sal);
   dbms_output.put_line(‘年薪==’||v_year_sal);
end;
—-使用存款和储蓄进程得到某些部门下的富有工作者音讯
/*
   cursor 名 is select * from  表
   系统引用类型游标   表明时候没有要求钦命结果集 
在open打开游标时候钦赐结果集
   emp_cursor sys_refcursor;  —
   open   emp_cursor for select 结果集
*/
create or replace  procedure dept_emp(dno number,dept_all_emp out
sys_refcursor )
as
begin
     –给当下的种类援引游标装入数据
     open dept_all_emp for select * from emp where deptno=dno;
end;
–调用存款和储蓄进程 遍历10号部门下的工作者消息
declare
    all_emp sys_refcursor ; –注脚系统引用游标 传参使用
    emp_row emp%rowtype;–记录类型选取游标的领到
begin
   dept_emp(10,all_emp);
   –提取游标
   loop
      –先提取后判断
      fetch all_emp into emp_row;
      exit when  all_emp%notfound;
     
dbms_output.put_line(‘eno===’||emp_row.empno||’ename==’||emp_row.ename);
   end loop;
   close all_emp;

create or replace procedure proc_salyears(v_no in number) is
sal_years number(9,2); begin

end;

/*
积存函数  是后生可畏段封装的代码块 编写翻译好放在服务器
             好处: 支持多处调用 进步开荒效能
                   调用直白运营 升高周转成效
   成立函数进程 create [or replace] function 函数名(参数名 in|out
参数数据类型 卡塔尔 return 数据类型
                as|is
                  -申明部门
                begin
                   -管理逻辑代码
                   return 变量
                end;
   存款和储蓄函数的调用
       在begin 和 end之间 函数名传参调用 必须有变量选拔函数的重临值
*/
–使用存款和储蓄函数总计年工资
create or replace function fun_count_sal(eno number) return number
as
   v_sal number;
begin
   select sal*12+nvl(comm,0) into v_sal from emp where empno=eno;
   return v_sal;
end;
–函数的调用
declare
   v_sal number;
begin
  v_sal := fun_count_sal(7369);
  dbms_output.put_line(v_sal);
end;
———out输出参数的函数获得每年工资
create or replace function fun_emp_sal(eno number,emp_sal out number)
return number
as
 
begin
   select sal*12+nvl(comm,0) into emp_sal from emp where empno=eno;
   return emp_sal;

–总结年收入

end;

declare
   v_sal number;
   emp_year_sal number;
begin
  v_sal := fun_emp_sal(7369,emp_year_sal);
  dbms_output.put_line(v_sal);     –0
  dbms_output.put_line(emp_year_sal);–10800
end;
/*
   存款和储蓄函数和经过的对待
       1.创办的显要字非常的小器晚成致  procedure function
       2.函数的创导 必需制订函数的归来数据类型
       3.函数在begin end直接必需回到变量
       4.函数的调用必得有变量选拔再次回到值
       5.函数方可用在select 语句中
   使用意况  开垦典型
       java调用进程  进程管理业务逻辑 ,假设在逻辑管理中
       用到某个功用性的封装 能够调用函数
       九成通用  函数同样能够调用进程  不是挟持约束  
*/
select emp.*,fun_count_sal(empno) from emp;
/*
   触发器 贰个蹲点器 对表中多少的操作监视
          insert  update  delete
          固然对表中多少的操作知足了触发器的执行法规
          触发器会自行实行
    创设语法  create or replace trigger 触发器名
              before|after  –试行机遇
              insert|update|delete
              on 表
              declare
              begin
               
              end;
    行级触发器 针对每黄金时代行记录监视  for each row
                                  insert            update        
delete
          :new  操作之后的笔录  就要插入的记录   修改后的记录    nul
          :old  操作在此以前的笔录     null           原始记录       
原始记录
*/
—插入数据之后 输出款待语句
create or replace trigger insert_tri
after
insert
on dept
declare
begin
   –输出应接语句
   dbms_output.put_line(‘应接参加部门’卡塔尔(قطر‎;
end;
————–插入数据测量试验
insert into dept values(3,’test1′,’bj’);
commit;
—-使用触发器监视部门表 插入数据不能够在停歇日

/*
   数据库封装好的不当提醒  raise_application_error(v1,v2)
                          v1是错误代码 -二〇〇三0 -20999 v2是大错特错提醒语
*/
create or replace trigger no_work_day
before
insert
on dept
declare
   v_day varchar(10);
begin
    –提取当前的星期 (saturday,sundayState of Qatar
    select to_char(sysdate,’day’) into v_day from dual;
    –剖断当前是或不是是苏息日
    if trim(v_day) in (‘saturday’,’sunday’) then
      –不容许插入
      raise_application_error(-二零零二1,’不能够在止息日插入数据’卡塔尔(قطر‎;
    end if;
end;
select to_char(sysdate,’day’)  from dual;
—-再来叁个实际应用 触发器节制表中数据操作 无法减低薪酬
create or replace trigger can_not_low
before
update
on emp
for each row   –行级触发器
declare
 
begin
  
    –判定改过后的薪俸 <小于原始的薪水 分裂意修改
     if :new.sal < :old.sal then
      raise_application_error(-二〇〇三1,’无法减低工资’卡塔尔国;
     end if;
end;
–校订工作者表薪金 测量检验
update emp set sal=sal-1 where empno=7369;
commit;

create table person(
   pid number(9),
   pname varchar(10),
   phone varchar(11)
)
insert into person(pname,phone) values(‘zs’,’123456′);
commit;

/*
   触发器完结id 自增进
  
*/
create or replace trigger auto_incr_id
before
insert
on person
for each row   –行级触发器
declare
 
begin
   –给id赋值 id有必要 必须是自拉长的数值
   select seq_class.nextval into :new.pid from dual;
   
end;

 


//JDBC调用

public class TestJdbc {

String driverClass = “oracle.jdbc.driver.OracleDriver”;
String url =”jdbc:oracle:thin:@192.168.17.128:1521:orcl”;
String user= “itcast_03”;
String password = “itcast_03”;
/*
*测量试验jdbc连接数据库
*
* */
@Test
public void querEmp(){
try{
//加载驱动
Class.forName(driverClass);
//获取链接
Connection con = DriverManager.getConnection(url, user,password);
//获取预编译的statement
PreparedStatement pst= con.prepareStatement(“select * from emp”);
//推行查询
ResultSet rs = pst.executeQuery();
//管理结果
while(rs.next()){
System.out.println(rs.getInt(1卡塔尔(قطر‎+”工作者姓名”+rs.getString(“ename”State of Qatar卡塔尔国;
}
rs.close();
con.close();
//关闭连接
}catch(Exception e){
e.printStackTrace();
}

}
/*积攒进度的调用
* {call <procedure-name>[(<arg1>,<arg2>, …)]}
add_sal(eno number,addsal number)
* */
@Test
public void callAddSal(){
try{
//加载驱动
Class.forName(driverClass);
//获取链接
Connection con = DriverManager.getConnection(url, user,password);
//获取预编写翻译的statement
CallableStatement pst= con.prepareCall(“{call add_sal(?,?)}”);
pst.setInt(1, 7499);
pst.setInt(2, 1000);
//推行查询
pst.execute();
con.close();
//关闭连接
}catch(Exception e){
e.printStackTrace();
}

}

/*积存进程的调用
* {call <procedure-name>[(<arg1>,<arg2>, …)]}
count_yearsal(eno number,total_year_sal out number)
* */
@Test
public void callCountSal(){
try{
//加载驱动
Class.forName(driverClass);
//获取链接
Connection con = DriverManager.getConnection(url, user,password);
//获取预编写翻译的statement
CallableStatement pst= con.prepareCall(“{call count_yearsal(?,?)}”);
pst.setInt(1, 7499);
//注册输出参数
pst.registerOutParameter(2, OracleTypes.NUMBER);
//试行查询
pst.execute();
int total = pst.getInt(2);
System.out.println(total);
con.close();
//关闭连接
}catch(Exception e){
e.printStackTrace();
}

}
/*
* pro_dept_emp(dno number,dept_emp out sys_refcursor)
* */
@Test
public void callProEmp(){
try{
//加载驱动
Class.forName(driverClass);
//获取链接
Connection con = DriverManager.getConnection(url, user,password);
//获取预编写翻译的statement
CallableStatement pst= con.prepareCall(“{call pro_dept_emp(?,?)}”);
pst.setInt(1, 10);
//注册输出参数
pst.registerOutParameter(2, OracleTypes.CURSOR);
//实施查询
pst.execute();
OracleCallableStatement ocs = (OracleCallableStatement)pst;
ResultSet rs = ocs.getCursor(2);
while(rs.next()){
System.out.println(rs.getInt(1卡塔尔+”工作者姓名”+rs.getString(“ename”State of Qatar卡塔尔;
}
rs.close();
ocs.close();
pst.close();
con.close();
//关闭连接
}catch(Exception e){
e.printStackTrace();
}

}
}

 ============================

hibernate5调用存款和储蓄进程

@Test
public void fun2(){
    Session session = JDBCUtils.openSession();
    ProcedureCall pc = session.createStoredProcedureCall("proc_emp_yearsal");//存储过程的名称
    pc.registerParameter("v_no", Long.class, ParameterMode.IN).bindValue(7788l);
    //参数1:对应存储过程中的变量名1,参数2:类型,参数3:是in还是out,参数4:手动设置了一个查询参数
    pc.registerParameter("v_yearSal", Long.class, ParameterMode.OUT);
    String string = pc.getOutputs().getOutputParameterValue("v_yearSal").toString();
    System.out.println(string);
}

select sal*12+nvl(comm,0) into sal_years from emp where empno=v_no;

–输出

dbms_output.put_line(sal_years); end;

–调用存款和储蓄进度

方式1:

call proc_salyears(7788);

方式2:

begin proc_salyears(7369); end;

–out参数的积攒进程

–总括年收入并赶回

create or replace procedure proc_salyears(v_no in number,sal_years
out number) is begin

–计算每年工资

select sal*12+nvl(comm,0) into sal_years from emp where empno=v_no;
end;

–调用存款和储蓄进度

declare v_sal number(9,2); begin proc_salyears(7876,v_sal);
dbms_output.put_line(v_sal); end;

—————–存款和储蓄函数————

–定义

create or replace function 存款和储蓄函数名(参数名 in/out 数据类型State of Qatar return
数据类型 is|as begin return 具体的多寡; end [积攒函数名称];

–定义存款和储蓄函数名总计每年工资

create or replace function fun_salyears(f_no number) return number is
sal_years number(9,2); begin select sal*12+nvl(comm,0) into sal_years
from emp where empno=f_no; return sal_years; end ;

–使用存储函数

declare sal_yeats number(9,2); begin sal_yeats := fun_salyears(7876);
dbms_output.put_line(sal_yeats); end;

–可简写

begin dbms_output.put_line(fun_salyears(7369)); end;

——–存款和储蓄进度和存款和储蓄函数的界别——–

仓储进度多用于项目里面包车型大巴多中国少年共产党享,存款和储蓄函数多被贮存进度调用.

仓库储存函数能够再sql语句中调用,存款和储蓄进程不可能.

发表评论

电子邮件地址不会被公开。 必填项已用*标注