`
leihualin666
  • 浏览: 30332 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

PL/SQL语句块基本语法(ORACLE存储过程,函数,包,游标)

阅读更多
PL/SQL语句块基本语法(ORACLE存储过程,函数,包,游标)


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、隐示游标(系统游标);3、REF游标

例:

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表示as或is

调用语法:

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 PL/SQL实战(待续)

    Oracle PL/SQL是一种强大的编程语言,它结合了SQL的数据处理能力与PL的程序设计特性,是Oracle数据库系统中用于创建存储过程、函数、触发器和包的主要工具。在这个"Oracle PL/SQL实战(待续)"的主题中,我们将深入...

    Oracle资料学习PL/SQL必备

    执行部分包含SQL语句和PL/SQL控制结构,如循环、条件判断等;异常处理部分用于捕获和处理程序运行时可能出现的错误。 2. **数据类型**:PL/SQL支持多种数据类型,包括数值类型(如NUMBER)、字符串类型(如VARCHAR2...

    ORACLE PL/SQL从入门到精通

    ORACLE PL/SQL是从入门到精通的专业知识,涵盖了数据库开发与管理的多个方面,包括触发器、过程、函数、软件包、异常处理、游标、循环、分支、变量使用、数据库安装等关键知识点。 触发器是数据库中用来保证数据...

    Oracle PL/SQL 实例精解(第4版涵盖Oracle 11g)+源码脚本

    PL/SQL是Oracle数据库中用于创建存储过程、函数、触发器、包等数据库对象的主要工具。第4版特别关注了在Oracle 11g环境下的新特性,如性能优化、错误处理和并发控制等。 1. **基础语法**:PL/SQL的基础包括声明变量...

    pl/sql语句基础

    3. **高度可重用性和安全性**:PL/SQL 块可以被命名并存储在 Oracle 服务器中,这样不仅可以被其他 PL/SQL 程序或 SQL 命令调用,而且任何客户端/服务器工具都能够访问这些 PL/SQL 程序,具备良好的可重用性。...

    PL/SQL 基本知识

    PL/SQL是Oracle数据库系统中的一个核心组件,全称为“Procedural Language/Structured Query Language”,它是SQL的扩展,增加了编程元素,使得开发者能够编写存储过程、函数、触发器等数据库应用程序。这篇博客主要...

    pl/sql最新中文手册

    8. **索引和性能优化**:手册可能也会涉及如何利用索引来提高PL/SQL程序的执行效率,以及如何分析和优化SQL语句。 9. **并发和锁定**:在多用户环境下,理解并发控制和锁定机制是必要的。手册可能会讨论如何处理...

    Oracle PL/SQL程序设计(第5版)(上下册)

    - **SQL语句的执行**:介绍如何在PL/SQL代码中嵌入SQL语句,包括查询、插入、更新和删除操作。 - **动态SQL**:探讨如何构造和执行动态SQL语句,这对于需要根据运行时条件生成SQL的情况非常有用。 - **SQL*Plus命令*...

    PL/Sql相关语法

    命名块通常指的是存储在数据库中的函数、过程、包或触发器,它们有固定的名称,可以被多次调用。匿名块则不存储在数据库中,常用于临时的、一次性执行的任务,可以出现在服务器端或客户端。命名块在创建时需要指定...

    Oracle PL/SQL学习官方教材

    "Oracle9i PL/SQL学习"这部分可能着重于Oracle 9i版本中的特性,虽然现在已经有更新的版本,但对初学者来说,理解早期版本的基本概念和语法是很有帮助的,因为许多核心原理在后续版本中仍然适用。通过深入学习这本...

    Oracle数据库实用教程第三章 PL/SQL程序设计.pptx

    本章节主要介绍了 PL/SQL 程序设计的基础知识,包括 PL/SQL 的优点、运行 PL/SQL 程序、PL/SQL 块结构、PL/SQL 基本语法、PL/SQL 处理流程、异常处理、游标、存储过程和函数、触发器等。 PL/SQL 的优点包括: * ...

    pl/sql例题代码pl/sql例题代码pl/sql例题代码

    5. **存储过程和函数**:存储过程是一组预编译的SQL语句,可以接收参数,返回结果。函数与之类似,但必须返回一个值。 6. **触发器**:触发器是在特定数据库事件(如INSERT、UPDATE、DELETE)发生时自动执行的PL/...

    Oracle PL/SQL实例编程(PL/SQL经典书籍)

    Oracle PL/SQL是一种...书中可能包含各种类型的PL/SQL程序设计技巧,从简单的存储过程和函数到复杂的事务处理和并发控制策略。通过实例学习,你将能够更好地理解和运用这些概念,提升你在Oracle数据库开发中的技能。

    Oracle PL/SQL专家指南-高级PL/SQL解决方案的设计与开发

    4. **动态SQL**:探讨如何在PL/SQL中执行SQL语句,包括EXECUTE IMMEDIATE和PREPARE-EXECUTE-CLOSE模式,以及绑定变量的应用。 5. **包(PACKAGE)**:详细解释包的概念,包括公共和私有部分,以及如何通过包来组织...

    Oracle Database 12c PL/SQL开发指南 实例源代码

    1. **PL/SQL基础**:PL/SQL的基础语法,如变量声明、数据类型、流程控制语句(如IF-THEN-ELSIF,FOR循环,WHILE循环)、异常处理(BEGIN-EXCEPTION-END结构)等。 2. **函数与过程**:如何定义和调用用户自定义的...

    PL/SQL入门到精通书的源代码

    5. **过程与函数**:过程是一组PL/SQL语句的集合,用于执行特定任务。函数与过程类似,但返回一个值。它们可以提高代码的复用性和模块化。 6. **异常处理**:PL/SQL提供了一个强大的异常处理机制,允许你定义和捕获...

    pl/sql程序设计ppt

    过程是一组完成特定任务的PL/SQL语句。它们可以接受参数,有返回值,且可以在需要的地方被调用。创建过程的语法如下: ```sql CREATE PROCEDURE procedure_name (parameter_list) IS -- 声明部分 BEGIN -- 执行部分 ...

    PL/SQL語法大全

    每条PL/SQL语句以分号结束,SQL语句可以跨多行。在一行中,可以放置多条语句,它们之间用分号分隔。块的开始可以是`DECLARE`或`BEGIN`,结束标记是`END`。 PL/SQL程序块有两种类型:**命名程序块**和**匿名程序块**...

    PL/SQL下载

    PL/SQL是Oracle数据库系统中的一个关键组成部分,它是一种结合了SQL语言与过程编程的语言,专为数据库管理和应用程序开发设计。PL/SQL全称为“Procedural Language/Structured Query Language”,它提供了丰富的控制...

    PL/SQL编程基础知识

    - **声明部分**:用于声明变量、游标、局部存储过程和函数等。 - **执行部分**:包含了过程化的控制语句和SQL语句,是程序的核心部分。 - **异常处理部分**:用于处理程序执行过程中可能出现的错误。 PL/SQL块的...

Global site tag (gtag.js) - Google Analytics