plsql自定义函数 不需要返回值怎样写

 我来答
事业编考试吧
2016-12-31 · 知道合伙人教育行家
事业编考试吧
知道合伙人教育行家
采纳数:206 获赞数:2958
公考事业编:省考,培训,职业培训,考研,英语,计算机,自考,教师资格证,工程学,数学,职业教育,…

向TA提问 私信TA
展开全部

游标变量
通过游标,我们可以取得返回结果集(往往是select语句查询的结果集)中的任何一行数据,从而提高共享的效率。
参照变量ref cursor使用:
定义游标:
1.定义一个游标类型:
Type自定义游标名 is ref cursor; 2.定义一个游标变量: 变量名 自定义游标名;
打开游标:
Open 游标变量 for select语句;
取出当前游标指向的行:
Fetch 游标变量  into 其他变量;
判断游标是否指向记录最后:
游标变量%notfound; 关闭游标: Close 游标名。

案例:
1. 请使用pl/sql编写一个过程,可以输入部门号,并显示该部门所有员工的姓名和
工资。
create or replace procedure pro1(in_deptno number)is

type htf_cursor is ref cursor; --定义一个变量
        test_cursor htf_cursor; --定义两个变量
        v_ename emp.ename%type;         v_sal emp.sal%type; begin
--执行语句
open test_cursor for select ename,sal from emp where deptno=in_deptno; --取出游标指向的每行数据,用循环语句 loop
--这句话会引起游标向下走
fetch test_cursor into v_ename, v_sal; --判断当前游标是否指向最后
exit when   test_cursor %notfound; --输出
 dbms_output.put_line('用户名'||v_ename||',薪水'||v_sal); end loop;
close test_cursor; end;
begin pro1(10);end;
 
2. 如果某个部门员工的工资低于2000,就增加100元。
create or replace procedure pro1(in_deptno number)is
type htf_cursor is ref cursor;
            test_cursor htf_cursor;             v_empno emp.empno%type;             v_ename emp.ename%type;             v_sal emp.sal%type; begin
--打开游标
open test_cursor for select empno, ename, sal from emp where deptno = in_deptno;
--取出用游标指向的每行数据,用循环语句 loop
fetch test_cursor into  v_empno, v_ename, v_sal;--游标下移一位 --判断当前游标是否走到最后
exit when test_cursor%notfound; if
                  v_sal<2000 then
update emp set sal = sal+100 where empno = v_empno;

end if; end loop; end; 
begin pro1(10);end;
 
pl/sql 函数
函数用于返回特定的数据,当建立函数时,在函数头部必须包含return子句,而在函数体内必须包含return语句返回的数据。我们可以使用create function来建立函数,实际案例:
建立函数的基本语法:
create function 函数名(参数1,...) return 数据类型 is  定义变量; begin
 执行语句; end; / 
函数调用的基本语法: 第一种

第二种:
var 变量名 变量类型
call 函数名(参数值,...) into :变量名; print 变量名 第三种:
select 函数名(参数,...) from dual;

 案例:请编写一个函数,可以接收用户名并返回该用户的年薪。 create function inName_outSal(v_in_name varchar2) return number is
 v_annual_sal number; begin
 select (sal+nvl(comm,0))*13 into v_annual_sal from emp where ename=v_in_name;  return v_annual_sal; end; / 
函数和过程的区别:
1、函数必须有返回值,而过程可以没有; 2、函数和过程在java中调用的方式不一样;
java中调用oracle函数可以在select语句中直接调用,如:select 自定义的函数名(参数) from 表;
过程则是使用CallableStatement完成调用。 
Java调用函数方式: package com.test;
import java.sql.ResultSet; import java.sql.SQLException; public class TestFunction {
 //如何在java中调用自己编写的函数
 public static void main(String[] args) {
  String sql="select inName_outSal('KING') annual from dual";   ResultSet rs=SQLHelper.executeQuery(sql, null);   try {
   if(rs.next()){
    System.out.println(rs.getDouble("annual"));//此处可以用数字或别名接收返回值    }
  } catch (SQLException e) {    e.printStackTrace();   }finally{
   if(rs!=null){     try {
     rs.close();
    } catch (SQLException e) {      e.printStackTrace();     }    }
   rs=null;   }  }

Java调用过程方式: package com.test; 
import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; public class TestProcedure {
 //调用oracle中update_sal存储过程
 public static void main(String[] args) {   Connection ct=null;
  CallableStatement cs=null;   try {
   //加载驱动
   Class.forName("oracle.jdbc.driver.OracleDriver");    //得到连接  
 ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott", "tiger");
   //创建CallableStatement接口引用对象
   cs=ct.prepareCall("{call update_sal(?,?)}");    //给?赋值
   cs.setString(1, "BOSS");    cs.setFloat(2, 8888f);    //执行我们的语句    cs.execute();    //提交
   ct.commit();
  } catch (Exception e) {    e.printStackTrace();   }finally{    try {
    if(cs!=null){      cs.close();     }
    if(ct!=null){      ct.close();     }
   } catch (Exception e2) {     e2.printStackTrace();    }
   cs=null;    ct=null;   }

 } } 
pl/sql知识--包(扩张了解,自己看)
包用于在逻辑上组合过程和函数,它由包规范和包体两部分组成。 1、我们可以使用create package命令来创建包: 建包基本语法:
create [or replace] package 包名 is
 procedure 过程名(变量名 变量类型,...);
 function 函数名(变量名 变量类型,...) return 数据类型; end; /
包的规范:只包含了过程和函数的说明,但是没有过程和函数的实现代码。 包体:用于实现包规范的过程和函数。 
请编写一个包,该包有一个过程,该过程可以接收用户名和新的薪水。(将来用于通过用户去更新薪水)还有一个函数,该函数可以接收一个用户名(将来要实现得到该用户的年薪是多少)
create package emp_package is
 procedure update_sal(v_in_ename varchar2,v_in_newsal number);  function inName_outSal(v_in_name varchar2) return number; end;
2、建立包体可以使用create package body 命令 建立包体基本语法:
create or replace package body 包名 is
 procedure 过程名(变量名 变量类型,...) is   --声明变量;  begin
  --执行语句;  exception
 when 异常名 then   --异常处理;  end;
 function 函数名(变量名 变量类型,...)  return 数据类型 is   --声明变量;  begin
  --执行语句;  end; end; / 
案例:请实现前面定义的包中的过程和函数。

gin
  select (sal+nvl(comm,0))*13 into v_annual_sal from emp where  
ename=v_in_name;
  return v_annual_sal;  end; end; / 
细节说明:
1、包体中要现实的函数或过程,应当在包规范中声明;
2、在调用包中的某个函数或过程的时候,需要使用对应的方法才可以调用。 3、如何调用包的过程或函数
当调用包的过程或是函数时,在过程和函数前需要带有包名,如果要访问其它方案的包,还需要在包名前加方案名。 调用基本方法:
exec 方案名.包名.过程名(参数,...); call 方案名.包名.函数名(参数,...);
也可以直接用select 方案名.包名.函数名(参数,...) from dual;

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式