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

plsql自定义函数 不需要返回值怎样写,第1张

游标变量

通过游标,我们可以取得返回结果集(往往是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 empename%type;         v_sal empsal%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_outputput_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 empempno%type;             v_ename empename%type;             v_sal empsal%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 comtest;

import javasqlResultSet; import javasqlSQLException; public class TestFunction {

 //如何在java中调用自己编写的函数

 public static void main(String[] args) {

  String sql="select inName_outSal('KING') annual from dual";   ResultSet rs=SQLHelperexecuteQuery(sql, null);   try {

   if(rsnext()){

    Systemoutprintln(rsgetDouble("annual"));//此处可以用数字或别名接收返回值    }

  } catch (SQLException e) {    eprintStackTrace();   }finally{

   if(rs!=null){     try {

     rsclose();

    } catch (SQLException e) {      eprintStackTrace();     }    }

   rs=null;   }  }

Java调用过程方式: package comtest; 

import javasqlCallableStatement; import javasqlConnection; import javasqlDriverManager; public class TestProcedure {

 //调用oracle中update_sal存储过程

 public static void main(String[] args) {   Connection ct=null;

  CallableStatement cs=null;   try {

   //加载驱动

   ClassforName("oraclejdbcdriverOracleDriver");    //得到连接  

 ct=DriverManagergetConnection("jdbc:oracle:thin:@127001:1521:orcl","scott", "tiger");

   //创建CallableStatement接口引用对象

   cs=ctprepareCall("{call update_sal(,)}");    //给?赋值

   cssetString(1, "BOSS");    cssetFloat(2, 8888f);    //执行我们的语句    csexecute();    //提交

   ctcommit();

  } catch (Exception e) {    eprintStackTrace();   }finally{    try {

    if(cs!=null){      csclose();     }

    if(ct!=null){      ctclose();     }

   } catch (Exception e2) {     e2printStackTrace();    }

   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;

pl/sql 里面定义的包在调用的时候使用exec 命令调用,例如:exec package_name过程名()

过程名():包体里面定义的公用过程。

不知道我的回答你清楚了吗?

plsql中upper函数是什么意思

直接sql语句:

select wm_concat(decode(eempno,7369,ddname,null)),wm_concat(decode(eempno,7369,eename,null)) from emp e, dept d

where eempno in ((select e1mgr from emp e1 where e1empno = 7369), 7369)

and edeptno = ddeptno

首先在PL/SQL的左侧资源栏中展开Procedures项(图中位置1),然后再其上面的搜索框中(图中位置2)输入存过名称的关键词,按回车键搜索要调试的存过,不停的回车,直到找到想要调试的存过。

找到想要调试的存过,左键单击选中该存过(图中位置1),然后右键单击该存过,从d出菜单中选择“Test”项(图中位置2)。

单击“Test”后,PL\SQL会打开调试界面,图中位置1的按钮就是开始调试的按钮,在调试之前要填写存过的参数,位置2就是填写参数的地方,如果有多个参数,会有多行参数框,按参数名填写相应的参数即可。

填写完参数,单击开始调试按钮后,调试的界面会发生一些变化。图中位置1的变化,说明存过已经处于执行状态,别人不能再编译或者执行。位置2的按钮就是执行按钮,单击这个按钮存过会执行完成或者遇到bug跳出,否则是不会停下来的,调试时不会用这个按钮的。位置3的按钮才是关键——单步执行,就是让代码一行一行的执行,位置4的按钮是跳出单步执行,等待下一个指令。

单击“单步执行”,存过开始单步执行。界面中每一次执行的代码会高亮显示(图中位置1),如果想要看某个变量具体的值,就在位置2的地方输入该变量名,然后变量的值会显示在位置3的地方。

调试的时候,每一次单步执行的时候要记一下执行代码的行数,图中位置3的数字就是当前执行代码的行数,就是第几行。如果过程单步执行到某行后,再单步执行的时候,存过就退出,那么错误就在该行的下一行。

代码执行到24行,在往下执行时,直接转到exception的地方,也就是异常处理的部分。

这说明我们代码中的错误在24和25行上,我们打开存过,浏览到24行和25行附近,发现25行和24行使用了两个变量,记住那两个变量。重新开始调试过程。

单步的执行时候把刚才那两个变量名填写到变量查看框,一边观察变量值变化,一边单步执行,执行到24行的时候,发现一个变量已经有值了,而另一个变量的值为null。错误原因明朗了吧?就是变量没有赋值或者初始话,给该变量赋值后存过就不报错了。

SELECT xrc_id,wmsyswm_concat(xproject_name) as project_name

FROM(

SELECT distinct trc_id, tproject_name

FROM required_collect_detail t where trc_id=rc_id ) x

group by xrc_id

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12188585.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存