`
271788203
  • 浏览: 490089 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

ORACLE Procedure function package cursor 简介

 
阅读更多

1、  PL/SQL语句块

PL/SQL语句块只适用于Oracle数据库,使用时临时保存在客户端,而不是保存在数据库。

基本语法:

declare

  变量声明、初始化

begin

  业务处理、逻辑代码

exception

  异常捕获

end;

 

变量声明:<变量名>  <类型及长度>  [:=<初始值>]

            例:v_name varchar2(20):=’张三’;

   例:见第3

2、  循环语句

loop循环语法:

    loop

     exit  when  表达式

    end loop;

while循环语法:

while 表达式 loop

end loop;

for循环语法:

    for  <变量>  in  <变量取值范围(小值..大值,如1..100> loop

    end loop;

    for循环的变量可不做声明及初始化。

例:见第3

3、  if判断语句

基本语法:

if  <表达式>  then

else  if  <表达式>  then

else

end  if;

end  if;

例:

declare

  v_identity number(4):=0;

begin

  loop

    if v_identity=1 then

      dbms_output.put_line('v_identity=1');

    else if v_identity=3 then

      dbms_output.put_line('v_identity=3');

    else if v_identity=6 then

      exit;

    else

      dbms_output.put_line('v_identity is not 1 or 3');

    end if;

    end if;

    end if; -- 注意,有多少个if就要有多少个end if结束标志。

    v_identity:=v_identity+1;

  end loop;

exception

  when others then dbms_output.put_line('error!');

end;

/

4、  分支case

基本语法:

case  <变量>

  when  常量  then

when  常量  then

      else

     

end case;

例:

declare

  v_number number(4):=3;

  v_string varchar(20):='abc';

begin

  case v_number

    when 1 then

      dbms_output.put_line('v_number is '||1);

    when 2 then

      dbms_output.put_line('v_number is '||2);

    when 3 then

      dbms_output.put_line('v_number is '||3);

  end case;

  case v_string

    when 'ab' then

      dbms_output.put_line('v_string is '||'ab');

    when 'bc' then

      dbms_output.put_line('v_string is '||'bc');

    else -- 缺省匹配

      dbms_output.put_line('v_string is other value');

  end case;

exception

  when others then dbms_output.put_line('error!');

end;

/

5、  异常(exception)

声明异常语法:<异常名>  exception;

抛出异常语法:raise  <异常名>;

捕获异常语法:when  <异常名>  then  异常处理语句;

例:

declare

  v_input varchar2(1):='&throw';-- 动态输入

  v_exception_1 exception; -- 自定义异常

  v_exception_2 exception;

  others exception; -- 系统异常

begin

  if v_input='1' then

    raise v_exception_1; -- 抛出异常

  else if v_input='2' then

    raise v_exception_2;

  else

    raise others;

  end if;

  end if;

exception

  -- 捕获异常

  when v_exception_1 then dbms_output.put_line('throw exception: v_exception_1');

  when v_exception_2 then dbms_output.put_line('throw exception: v_exception_2');

  when others then dbms_output.put_line('throw exception: others');

end;

/

6、  游标(cursor)

声明游标语法:cursor  <游标名>  is  select语句;

声明ref游标语法:<游标名>  is  ref  cursor;

打开游标语法:open  <游标名>;

移动游标并获取数据语法:fetch  <游标名>  into  <用于保存读取的数据的变量的名>;

关闭游标语法:close  <游标名>;

游标属性(游标的属性必须在关闭游标之前):

 %isopen: 判断游标是否打开

 %notfound: 找不到数据时

 %found:

 %rowcount: 返回当前游标已扫描的数据行数量

游标分类:1、显示游标(自定义游标);2、隐示游标(系统游标);3REF游标

例:

declare

  v_row t_test%rowtype; -- 匹配t_test表中一行所有的数据类型

  cursor v_cur is select * from t_test;-- 声明游标

begin

  open v_cur;-- 打开游标

  loop

    fetch v_cur into v_row;-- 将游标所在行的数据转存到v_row

    exit when v_cur%notfound; -- 当游标到最后一行时跳出

    dbms_output.put_line('id = '||v_row.t_id||'  name = '||v_row.t_name||'  msg = '||v_row.t_msg);

  end loop;

  close v_cur;-- 关闭游标

exception

  when others then dbms_output.put_line('throw exception: others');

end;

/

-- REF游标 --

create or replace package upk_select_test

as type uc_test is ref cursor; -- 声明ref游标

end upk_select_test;

/

-- 存储过程中调用ref游标,并将查询结果以游标的方式返回

create or replace procedure up_select_test_2

(uc_result out upk_select_test.uc_test)

is

begin

  open uc_result for select * from t_test;

end up_select_test_2;

/

7、  通配类型操作符

%type: 通配某行某列数据类型,如v_name t_test.t_name%type;通配表t_test中的t_name

%rowtype: 通配一行所有列的数据类型,如 v_row t_test%rowtype;匹配t_test表中一行

所有的数据类型。

8、  存储过程(procedure)

基本语法:

create  procedure  <过程名>(<参数列表,无参时忽略>)

as|is

  变量声明、初始化

begin

  业务处理、逻辑代码

exception

  异常捕获、容错处理

end  <过程名>;

参数:<参数名> in|out|in out  <参数类型,无长度说明> ,如:v_name  varchar2

in:入参

     out:出参

     in out:出入参

注:as|is表示asis

调用语法:

1)exec  <过程名>;

2)execute  <过程名>;

3)、在PL/SQL语句块中直接调用。

例:

create or replace procedure up_wap(v_param1 in out varchar2,v_param2 in out varchar2)

is

v_temp varchar2(20);

begin

  dbms_output.put_line('交换前参数1'||v_param1||'  参数2'||v_param2);

  v_temp:=v_param1;

  v_param1:=v_param2;

  v_param2:=v_temp;

  dbms_output.put_line('交换后参数1'||v_param1||'  参数2'||v_param2);

exception

  when others then dbms_output.put_line('There is a error when the procedure up_wap executing!');

end up_wap;

/

-- 调用存储过程

declare

    v_param1 varchar2(20):='param1';

    v_param2 varchar2(20):='param2';

begin

  up_wap(v_param1 => v_param1,v_param2 => v_param2);

end;

/

9、  自定义函数(function)

基本语法:

create  function  <函数名>(<参数列表,无参时忽略>)

return  <返回值类型,无长度说明>

as|is

  变量声明、初始化

begin

  业务处理、逻辑代码

  return  <返回的值>;

exception

  异常捕获、容错处理

end  <函数名>;

参数:in  入参

注:只有入参的类型。

在存储过程和自定义函数中的参数的传递(入参和出参)不能使用%type%rowtype匹配,不能使用空值null,但是存储过程可以返回空值。

例:

create function uf_select_name_by_id_test(v_id in number)

return varchar2

is

v_name t_test.t_name%type;

begin

  select t_name into v_name from t_test where t_id=v_id;

  return v_name;

exception

  when others then dbms_output.put_line('error');

end uf_select_name_by_id_test;

/

select uf_select_name_by_id_test(1) 姓名 from dual;-- select调用

declare --pl/sql语句块调用

  v_name varchar2(20);

begin

  v_name:=uf_select_name_by_id_test(1);

  dbms_output.put_line('name = '||v_name);

end;

/

10、包(package)

封装,可以封装过程(procedure)、函数(function)和变量。

注意,在包(package)中声明的过程(procedure)和函数(function)必须在包的实现体

package body)中定义实现。

基本语法:

create  package  <包名>

as|is

  变量声明

  存储过程声明

  自定义函数声明

end  <包名>;

/

create  package  <包名,与声明部分一致>

as|is

  存储过程的代码实现

  自定义函数的代码实现

end  <包名>;

/

例:

-- 创建包upk_hello

create or replace package upk_hello

is

  v_hello_world varchar2(20):='hello world'; -- 声明变量

  procedure up_hello_world(v_name in varchar2);-- 声明过程

  function uf_hello_world(v_name in varchar2) return varchar2;-- 声明函数

end upk_hello;

/

-- 实现包(upk_hello)里声明的方法

create or replace package body upk_hello

is

  procedure up_hello_world(v_name in varchar2)

  is

    v_string varchar2(100);

  begin

    v_string:=v_name||' say hello world!';

    dbms_output.put_line(v_string);

  exception

    when others then dbms_output.put_line('error');

  end up_hello_world;

  function uf_hello_world(v_name in varchar2) return varchar2

  is

    v_string varchar2(100);

  begin

    v_string:=v_name||' say hello world!';

    return v_string;

  exception

    when others then dbms_output.put_line('error');

  end uf_hello_world;

end upk_hello;

/

-- 包的调用

declare

  v_msg varchar2(100);

begin

  upk_hello.up_hello_world('bing');

  v_msg:=upk_hello.uf_hello_world('admin');

  dbms_output.put_line(v_msg);

  dbms_output.put_line(upk_hello.v_hello_world);

end;

/

分享到:
评论

相关推荐

    大型项目Oracle sql,function,procedures,package,cursor,job

    标题和描述中提到的“大型项目Oracle sql,function,procedures,package,cursor,job”涉及的是Oracle数据库管理和开发的核心概念。以下是对这些概念的详细解释: 1. **SQL(Structured Query Language)**:SQL...

    Java获取Oracle存储过程返回的Cursor

    在Java编程中,有时我们需要调用Oracle数据库的存储过程,特别是当存储过程返回一个游标(Cursor)时,这种情况在处理大量数据或者分页查询时很常见。游标允许我们逐行处理结果集,而无需一次性加载所有数据,这对于...

    oracle创建各种对象

    what =&gt; 'my_package.my_procedure;', next_date =&gt; SYSDATE + 1, interval =&gt; 'SYSDATE + 1/24' ); COMMIT; END; ``` 通过理解和熟练使用这些Oracle对象,开发者能够构建复杂的数据库应用程序,优化查询...

    oracle的存储过程如何返回结果集

    在Oracle中,存储过程可以通过引用游标(Ref Cursor)来返回结果集。Ref Cursor是一种特殊类型的游标,它可以指向一个结果集,这个结果集可以被传递给其他程序单元。当存储过程被调用时,它可以在内部执行SQL查询,...

    oracle 数据库的 函数 和包

    PROCEDURE proc_test (v_emp_cursor OUT sp_emp_cursor, v_sal IN NUMBER) IS BEGIN -- 实现逻辑 OPEN v_emp_cursor FOR SELECT * FROM emp WHERE sal &gt; v_sal; END; END; ``` 在上述示例中,我们定义了一个包...

    Oracle plsql 参考文档

    Oracle PL/SQL是一种强大的编程语言,它将SQL与过程式编程语言的功能相结合,为数据库管理员和开发者提供了在Oracle数据库环境中创建复杂应用的能力。这个参考文档是Oracle PL/SQL的全面指南,涵盖了从基础到高级的...

    oracle转DB2 对照

    - **Oracle** 支持使用 `PACKAGE` 组织多个存储过程、函数等对象。 - Oracle示例: ```sql CREATE OR REPLACE PACKAGE my_package AS PROCEDURE do_something; END my_package; CREATE OR REPLACE PACKAGE ...

    oracle笔记二--plsql 编程.txt

    根据提供的文件信息,我们可以归纳出以下关于Oracle PL/SQL编程的重要知识点: ### 一、创建包(Package)及其声明 #### Package Specification (包规范) 在Oracle数据库中,**包**是一种将过程、函数、类型、游标...

    oracle数据库开发规范.pdf

    12. Oracle的游标(CURSOR)用于处理PL/SQL代码中的多行数据。 13. Oracle的事务处理关键字COMMIT用于提交事务,ROLLBACK用于回滚事务。 14. Oracle的事务控制语句SAVEPOINT和SET TRANSACTION。 关于Oracle数据库...

    Oracle高级编程—安装包

    Oracle数据库是全球广泛使用的大型企业级数据库管理系统,其在数据存储、处理和管理方面的功能强大,性能优秀。本文将深入探讨Oracle的高级编程概念,包括安装过程和关键特性。 一、Oracle数据库安装 Oracle数据库...

    Oracle 函数的运用

    OracleParameter p1 = new OracleParameter("mycs", OracleType.Cursor); p1.Direction = ParameterDirection.Output; cmd.Parameters.Add(p1); OracleDataAdapter da = new OracleDataAdapter(cmd); DataSet ...

    ORACLE转DB2对照全解

    ### ORACLE转DB2对照全解 #### 一、Oracle SQL PL与DB2 inline SQL PL对比 本章节主要介绍Oracle SQL PL与DB2 inline SQL PL之间的对比,包括但不限于存储过程、触发器、用户定义函数(UDF)、条件语句及流程控制...

    Oracle数据库存储过程技术文档.doc

    1.1 存储过程基本结构(PROCEDURE) 3 1.1.1创建存储过程 3 1.1.2 存储过程删除 5 1.1.3 调用存储过程 5 1.2存储函数(FUNCTIONE) 6 1.2.1 创建存储函数 6 1.2.2 删除存储函数 7 1.3 包(package) 7 1.3.1 包的基本结构 ...

    oracle程序包

    ### Oracle程序包详解 #### 一、程序包概念与作用 在Oracle数据库中,程序包是一种组织PL/SQL代码的有效方式。它通过将相关的数据类型、常量、变量、游标、异常、函数和过程封装在一起,使得这些元素可以在多个...

    Oracle高效编程及SQL优化

    在开发中,将紧密相关的PROCEDURE和FUNCTION封装在包内,编译包体时不会影响到调用这些存储过程的其他代码。 绑定变量的使用是SQL优化的关键。避免在动态SQL中使用常量,而应使用绑定变量,以减少解析次数,提高...

    Oracle_存储过程的基本语法

    为了实现这一功能,通常需要定义一个包(Package),其中包含一个过程,该过程接受参数并返回一个引用游标(Ref Cursor)。 示例代码: ```sql CREATE OR REPLACE PACKAGE pkg_test AS TYPE myrctype IS REF ...

    oracle语句整理.txt

    -- procedure and function declarations END; CREATE OR REPLACE PACKAGE BODY package_name IS -- procedure and function definitions END; ``` - **示例**: - 定义一个包`emp_sal_update`,包含增加...

    Oracle存储过程学习经典[语法+实例+调用].

    cstmt.registerOutParameter(1, OracleTypes.CURSOR); cstmt.setInt(2, 100); cstmt.execute(); ResultSet rs = (ResultSet) cstmt.getObject(1); while (rs.next()) { System.out.println(rs.getString(1)); ...

    好用的oracle工具PLSQL

    - **过程(Procedure)和函数(Function)**:过程用于执行一系列操作,不返回值;函数执行操作并返回一个值。 - **包(Package)**:集合相关的过程和函数,提供更好的封装和管理。 5. **控制结构**: - **循环...

    oracle plsql

    - 程序单位:包括过程(PROCEDURE)、函数(FUNCTION)、包(PACKAGE),这些是可以被重用的程序单元。 - 事务处理:如COMMIT用于提交当前事务,LOGON用于登录数据库等。 3. Oracle PL/SQL高级应用 - 游标...

Global site tag (gtag.js) - Google Analytics