oracle游标函数过程 oracle 函数返回游标

1)过程:过程用于执行特定的操作。当建立过程时,既可以指定输入参数(in),也可以指定输入参数(out).通过在过程中使用输入参数,可以将数据传递到执行部分;通过使用输入参数,可以将执行部分的数据传递到应用环境。在sqlplus中可以使用createprocedure名利来建立过程。
实例如下:
①请考虑写一个过程,可以输入雇员名,新工资,可修改雇员的工资。
eg:create procedure aaa(v_namevarchar,newSal number) is
begin
update emp set sal=newSal where ename=v_name;
end;
/
exec/call aaa('NAME',sal); //执行部分

-------------------------------------------------------------------------------------------------
2)函数:函数用于返回特定的数据,当建立函数时,在函数头部必须包含return子句,而在函数体内必须包含return语句返回的数据。我们可以使用createfunction 来建立函数。
案例如下:
eg:create function annum1_income(name varchar2)
return number is
annum1_salary number(7,2);
begin
select sal*12+nvl(comm,0) into annum1_salary from emp whereename=name;
return annual_salary;
end;
/
在sqlplus中调用函数
var income number
exec/call annum1_income('NAME') into:income;
prin1 incom
同样我们可以在java程序中调用该函数
select annua1_income('NAME') fromdual;//这样可以通过rs.getInt(1)得到返回的结果。
注:上面程序很可能有出错的地方,仅工参考!

案例(函数):输入雇员的姓名,返回该雇员的年薪
eg:create function sp_fun2(spName varchar2) return
number is yearSal number(7,2);
begin
select sal*12+nvl(comm,0)*12 into yearSal from emp whereename=spName;
return yearSal;
end;
/

-------------------------------------------------------------------------------------------------
3)包:包用于在逻辑上组合过程和函数,它由包规范和包体两部分组成。
①我们可以用create package命令来创建包:
实例:create package sp_package is
procedure update_sal(name varchar2,newsal number);
function annual_income(name varchar2) return number;
end;
包的规范只包含了过程和函数的说明,但是如果没有过程和函数的实现代码,包体用于实现包规范的过程和函数。
例子(创建包):创建一个包sp_package并声明该包有一个过程update_sal和一个函数annual_income
create package sp_package is
procedure update_sal(name varchar2,newsal number);
function annual_income(name varchar2) return number;
end;
②建立包体可以用create package body命令
实例(创建包体):create package body sp_package is
procedure update_sal(name varchar2,newsal number)
is
begin
update emp set sal=newsal where ename=name;
end;
function annual_income(name varchar2)
return number is
annual_salary number;
begin
select sal*12+nvl(comm,0) into annual_salary from emp
where ename=name;
return annual_salary;
end;
end;
③如何调用包的过称或是函数:当调用包的过程或是函数时,在过程和函数前需要到有包名,如果要访问其他方案的包,还需要在包名前加方案名。
如:SQL>callsp_package.update.sal('SCOTT',1500);

-------------------------------------------------------------------------------------------------
oracle游标函数过程 oracle 函数返回游标
4)定义并使用变量:在写pl/sql程序时,可以定义变量和常量;在pl/sql程序中包括有:

①标量类型(scalar) ②复合类型(composite)③参照类型(reference) ④lob(large object)

-------------------------------------------------------------------------------------------------

5)触发器:触发器是指隐含的执行的存储过程。当定义触发器时,必须要指定出发的事件和触发的操作,常用的触发器事件包括insert,update,delete语句,而触发操作实际就是一个pl/sql块。可以使用createtrigger来建立触发器。

-------------------------------------------------------------------------------------------------
6)定义并使用变量
标量定义的案例:①定义一个变长字符串:v_ename varchar2(10)②定义一个小数范围:v_sal number
③定义一个小数并给一个初始值为5.4:=是pl/sql的赋值号:v_sal2number(6,2):=5.4
④定义一个日期类型的数据:v_hiredate date
⑤定义一个布尔变量,不能为空,初始值为false:v_valid boolean not nulldefault false;
案例:输入员工号,显示雇员姓名、工资、个人所得税(税率为0.03)为例。
declare
c_tax_rate number(3,2):=0.03;
--用户名
v_ename varchar2(5);
v_sal number(7,2);
v_tax_sal number(7,2);
begin
--执行
select ename,sal into v_ename,v_sal from emp whereempno=&no;
--计算所得税
v_tax_sal:=v_sal*v_tax_rate;
--输出
dbms_output.put_line('姓名是:'||v_enaem||'工资:'||v_sal||'交税:'||v_tax_sal);
end;
/
注:标量(scalar)--使用%type类型
对于上面的pl/sql块有一个问题:就是如果员工的姓名超出了5个字符的话,就会有错误,为了降低pl/sql程序的维护工作量,可以使用%type属性定义变量,这样它会按照数据库列来确定你定义的变量的类型和长度。
具体格式为:标识符号 表名.列名%type;
例子:输入员工号,显示雇员姓名、工资、个人所得税(税率为0.3)为例。
declare
c_tax_rate number(3,2):=0.03;
--用户名
v_ename emp.ename%type;;
v_sal emp.sal%type;
v_tax_sal number(7,2);
begin
--执行
select ename,sal into v_ename,v_sal from emp whereempno=&no;
--计算所得税
v_tax_sal:=v_sal*v_tax_rate;
--输出
dbms_output.put_line('姓名是:'||v_enaem||'工资:'||v_sal||'交税:'||v_tax_sal);
end;
/
补充:当想对select结果集中的数据进行逐行的处理,那么可以使用游标技术。
游标是一个用户可以逐行访问的行的集合。游标的使用过程是非常规范的,包括了以下的5个典型的步骤,即:
1)声名游标中将要使用的变量。
2)声名游标
3)打开游标
4)取出游标中的数据
5)关闭游标
第一步,声名游标中将要使用的变量:通过游标可以取出指定的数据。在从游标中取出的数据时,需要指定相应的用于存储这些数据的变量。因此,在声明游标之前,需要声明将要用到的变量。
第二步,声明游标:游标是由游标名称和游标对应的select结果集组成。因此,在声明游标时,需要指定这些相应的内容。与声明变量一样,声明游标也应该放在pl/slq程序的声明块中。
声明游标的简单语法形式如下所示:cursorcursor_name is select_statement
在上面的语法中,主要的参数包括:1)cursor_name参数表示游标的名称。2)select_statement参数表示游标将要包括的结果集。
第三步,打开游标:游标在使用之前,必须显示的打开。可以使用open语句打开游标。打开游标的操作应该放在存储程序中的可执行块中。
语法形式如下所示:opendeclared_cursor_name;
上面的语法中,declared_cursor_name参数表示一个已经声明的游标名称。
第四步,从游标中取出数据:从游标中取出数据就是读取游标中的数据,并且将这些数据放置在指定的变量中。程序中的其他代码可以对这些变量的数据进行各种处理。可以使用fetch语句执行取数据操作。
语法形式如下所示:fetchopened_cursor_name into variable_list;
在上面的语法中,主要的参数包括:1)opened_cursor_name参数表示已经打开的游标名称。2)variable_list参数表示变量列表。这里的变量列表应该与声明游标时select语句的select_list相对应。
第五步,关闭游标:对于不再使用的游标,应该执行关闭操作。游标关闭后,该游标占用的系统资源就会被释放了。关闭游标使用close语句。
语法形式如下所示:closecursor_name;
在上面的语法中,cursor_name参数用于指定将要关闭的游标名称。
下面举一例子加以说明:使用游标技术,操纵books表中的数据。
1)以press/tsinghua身份连接系统。
2)使用setserveroutput on 命令设置在服务器上显示pl/sql程序的执行结果。
3)使用declare命令声明3个变量,var_book_id、var_title_Chinese和var_price,这些变量用来存储从游标中取出的数据。
4)使用cursor命令声明一个游标,游标的名称是books_cursor,游标对应的结果集市selectbook_id,title_Chinese,price from books order bybook_id;语句的执行结果。
5)使用begin关键字开始可执行块。
6)使用openbooks_cursor命令打开指定的游标。游标只有在打开状态下才能从中取出数据。
7)使用loop...endloop;表示一个循环操作。
8)在循环体中,使用fetch语句从打开的游标中取出数据,并且把这些数据放置在已声明的变量中。
9)使用exitwhen books_cursor%notfound;命令设置循环体退出的条件。当游标中的数据取出完毕后,结束循环操作。
10)使用dbms_output.put_line命令显示相应的输出结果。
11)使用endloop;命令结束循环体。
12)使用close命令关闭游标。
13)使用end;命令结束程序。
14)使用/命令执行pl/sql程序。

使用该游标的代码:

set serveroutput on

declare

var_book_id books.book_id%type;

var_title_Chinesebooks.title_Chinese%type;
var_pricebooks.price%type;
cursorbooks_cursor is select book_id,title_Chinese,price frombooksorder by book_id;
begin
openbooks_cursor;
loop
fetchbooks_cursor into var_book_id,var_title_Chinese,var_price;
exitwhen books_cursor%notfound;

dbms_output.put_line('var_book_is='||var_book_id||...);
endloop;
closebooks_cursor;
end;
/

--------------------------------------------------------------------------------------------------

7)记录:
例子(记录):

declare
--定义一个pl/sql记录类型emp_record_type,类型包含三个数据name,salary,title
typeemp_record_type is record(name emp.ename%type,salaryemp.sal%type,title emp.job%type);
--定义一个sp_record变量,这个变量的类型是emp_record_type
sp_recordemp_record_type;
begin
selectename,sal,job into sp_record
fromemp where empno=4422;
dbms_output.put_line('员工名:'||sp_record.name||'工资:'||sp_record.sal);
end;
/

--------------------------------------------------------------------------------------------------
8)复合类型--pl/sql表:相当于高级语言中的数组,但是需要注意的是在高级语言中数组的下标不能为负数,而pl/sql是可以为负数的,并且表元素的下标没有限制。
实例:declar
typesp_table_type is table of emp.ename%type index bybinary_integer;
sp_tablesp_table_type;
begin
selectename into sp_table(0) from emp where empno=7788;
dbms.output.put_line('员工名:'||sp_table(0));
end;
说明:sp_table_type是pl/sql表类型
emp.ename%type指定了表的元素的类型和长度
sp_table为pl/sql表变量
sp_table(0)则表示下标为0的元素

--------------------------------------------------------------------------------------------------
9)参照变量:参照变量是指用于存放数值指针的变量。通过使用参照变量,可以使得应用程序共享相同对象,从而降低占用的空间。在编写pl/sql程序时,可以使用游标变量(refcursor)和对象类型变量(ref obi_type)两种参照变量类型。
例子:请用pl/sql编写一个块,可以输入部门号,并显示该部门所有员工姓名和他的工资。
declare
--定义游标类型sp_emp_cursor
typesp_emp_cursor is ref cursor;
--定义一个游标变量
test_cursorsp_emp_cursor;
--定义变量
v_enameemp.ename%type;
v_salemp.sal%type;
begin
--执行
--把test_cursor和一个select结合
opentest_cursor for select ename,sal from emp wheredeptno=&no;
loop
fetchtest_cursor into v_ename,v_sal;
--判断是否test_cursor为空
exitwhen test_cursor%notfound;
dbms_output.put_line('名字:'||v_ename||'工资:'||v_sal);
endloop
end;

  

爱华网本文地址 » http://www.aihuau.com/a/25101011/96401.html

更多阅读

Excel函数详解:166 FREQUENCY函数用法

Excel函数详解:[166]FREQUENCY函数用法——简介FREQUENCY函数,用于以垂直数组的形式返回多个数值在某个区域内出现的频率。该函数返回的是数组,所以必须以数组公式的形式进行输入。Excel函数详解:[166]FREQUENCY函数用法——工具/原料

IME消息函数常量 函数返回常量引用

IME消息  以下列出IME中用到的消息。WM_IME_CHAR(IME得到了转换结果中的一个字符)WM_IME_COMPOSITION(IME根据用户击键的情况更改了按键组合状态)WM_IME_COMPOSITIONFULL(IME检测到按键组合窗口的区域无法继续扩展)WM_IME_CONTROL(由应用

VBScript函数大字典详细说明 vbscript时间函数

2006-09-12 14:59Abs 函数 返回数的绝对值。Array 函数 返回含有数组的变体。Asc 函数 返回字符串首字母的 ANSI 字符码。Atn 函数 返回数值的反正切。CBool 函数 返回已被转换为 Boolean 子类型的变体的表达式。CByte 函数 返回已

SUBTOTAL函数 datedif函数

SUBTOTAL函数返回列表或数据库中的分类汇总。通常,使用“数据”选项卡上“大纲”组中的“分类汇总”命令更便于创建带有分类汇总的列表。一旦创建了分类汇总,就可以通过编辑SUBTOTAL 函数对该列表进行修改。语法SUBTOTAL(fu

ASP教程:DateDiff函数和DateAdd函数

1.日期相加DateAdd函数返回已添加指定时间间隔的日期。DateAdd(interval,number,date)DateAdd函数的语法有以下参数(1)interval必选项。字符串表达式,表示要添加的时间间隔。有关数值,请参阅“设置”部分。(2)number必选项。数值表达式,表

声明:《oracle游标函数过程 oracle 函数返回游标》为网友深海有鱼分享!如侵犯到您的合法权益请联系我们删除