Oracle中命名块之存储过程的详解及使用方法

一、匿名块和命名块

◆PL/SQL块分为良好总:命名块和匿名块。

◆匿名块:以declare或begin开始,每次执行匿名块都要通过客户端工具将其发送给Oracle,经过语法分析、编译然后执行。

◆命名块:具有名称的PL/SQL块,这些命名块被存储在Oracle中,编译一次,以后只可调用就可多次执行。如:存储过程、存储函数、包、触发器等、

存储过程:无返回值;
  存储函数:有返回值;
  包:可容纳多个过程或函数的一个容器(较好管理这些过程和函数,类似于java中的包);
  触发器:在合适的实际被自动执行。(无需调用,在满足要求的情况下,自动执行;触发器也被称为隐式执行的命名块!)

◆匿名块和命名块的区别:

匿名块:能够动态地创建和执行过程代码的PL/SQL结构,每次执行匿名块时就会自动的将该块数据通过文本的形式发送给Oracle,然后执行,反馈给用户,每次执行都需发送和编译!
  命名块:持久化的方式将代码作为数据库属性储存在系统目录中,在Oracle中编译一次,下次若使用可直接调用执行,无需再次编译,非常高效。

二、存储过程:

存储过程是具有名称、完整特定功能和无返回值的PL/SQL块,只需发送调用命令即可执行该过程,能够实现代码的重用,不能在SQL语句当中调用!

◆创建存储过程:

格式:create[or replace] procedure proc_name
     [(para1[int|out|in out]type,...)]
     {is|AS}
     prdc_body

proc_name表示存储过程名;
  para1表示参数名;type是参数para1的数据类型;
  proc_body表示过程体.过程体是遵循PL/SQL块的结构,但不能使用declare关键字,end后面可带有过程名。

注意:参数列表是可选的

◆调用存储过程:(存储过程创建的时候会自动的保存在Oracle中,在执行储存过程的时候,PL/SQL块只需调用即可!)

(1)如果在PL/SQL块中调用,直接使用proc_name(...);
  (2)如果使用sql plus环境中,需要使用 EXEC proc_name(...)的形式;
  (3)如果存储过程无参数,这调用时可带有圆括号也可不带!

【示例】创建一个无参数的存储过程(显示所有员工的信息)

create or replace procedure pr_show_employee
is
--进入块的声明部分(无需编写declare关键字)
   --定义游标
   cursor v_emp_cursor is select * from employees;
   --定义游标类型的记录型行变量
   v_emp_record v_emp_cursor%rowtype;
begin
   for v_emp_record in v_emp_cursor loop
     dbms_output.put_line(v_emp_record.employee_id||','||v_emp_record.first_name||','||
               v_emp_record.last_name||','||v_emp_record.salary);
   end loop;
end pr_show_employee ;

--调用存储过程(在一个匿名块中执行)

begin
   pr_show_employee();
end;

【示例】存储过程的参数接受产品类别编号,输出该类所有产品的信息

create or replace procedure pr_show_product(
product_type products.product_type_id%type)
as
 --定义游标
 cursor v_prd_cursor is select * from products p where product_type = p.product_type_id;
 --定义游标的行类型变量
 v_prd_record v_prd_cursor%rowtype;
begin
   for v_prd_record in v_prd_cursor loop
  dbms_output.put_line(v_prd_record.product_id||','||v_prd_record||','||product_type_id||','||v_prd_record.description||','
||v_prd_record.
name||','||v_prd_record.price);
   end loop;
end pr_show_product;

--调用存储过程(执行)
declare
    --定义编号变量的类型
    v_prd_type_id products.product_type_id%type := 1;
begin
   pr_show_product(v_prd_type_id);
end;

◆参数的传递模式:

参数传递有三种模式:in、out、in out
  in:过程调用时,实参的值会传递给形参。形参被看作是常量,在过程内部不能被修改。
  out:过程调用时,实参的值被忽略,形参为null值,在过程内部形参变量可以读写。过程结束时,形参的值赋值给实参!
  in out:过程调用时,实参的值传递给形参,在过程内部形参变量可读可写,过程结束时,形参的值赋值给实参。

注意:如果在定义存储过程时,没有指明参数传递模式,则默认为 in 模式

【示例】创建一个有参数传递默认的存储过程

create or replace procedure pr_test(p_1 in out varchar2)
is 

begin
   dbms_output.put_line('p_1='||p_1);
   p_1 := 'abc';
   dbms_output.put_line('p_1='||p_1);
end pr_test;

--调用存储过程

declare
  v_1 varchar2(5) := 'wwww';
begin
  pr_test(v_1);
  dbms_output.put_line('v_1='||v_1);
end;

注意:(1)在创建存储过程时,形参类型不能指定具体的长度,字符类型就为 varchar2,数字类型就是number;默认和实参类型的长度等同

(2)使用 in 模式,形参接受实参的值,默认形参为常量,在存储过程当中不能被修改,否则出错!
     (3)使用 out 模式,实参的值被忽略,但必须是变量,用来接收存储过程执行完形参的值;而形参是可读可写的。
     (4)使用 in out 模式,实参的值传递给形参,也必须是变量,形参可读可写,最后执行完存储过程形参的值传递给实参!
     (5)参数传递,实参的值和长度或精度约束会传递给形参,因此,形参不能有长度或精度的约束。在过程中给形参赋值时,要注意它的长度或精度的限制!

感谢 阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • ORACLE常用数值函数、转换函数、字符串函数

    本文更多将会介绍三思在日常中经常会用到的,或者虽然很少用到,但是感觉挺有意思的一些函数.分二类介绍,分别是: 著名函数篇 -经常用到的函数 非著名函数篇-即虽然很少用到,但某些情况下却很实用 注:N表示数字型,C表示字符型,D表示日期型,[]表示内中参数可被忽略,fmt表示格式. 单值函数在查询中返回单个值,可被应用到select,where子句,start with以及connect by 子句和having子句. (一).数值型函数(Number Functions) 数值型函数输入数字型参

  • oracle 创建表空间详细介绍

    注意点: 1.如果在PL/SQL 等工具里打开的话,直接修改下面的代码中[斜体加粗部分]执行 2.确保路径存在,比如[D:\oracle\oradata\Oracle9i\]也就是你要保存文件的路径存在 /*分为四步 */ /*第1步:创建临时表空间 */ 复制代码 代码如下: create temporary tablespace user_temp tempfile 'D:\oracle\oradata\Oracle9i\user_temp.dbf' size 50m autoextend

  • oracle常用sql语句

    正在看的ORACLE教程是:oracle常用sql语句.SQL*Plus system/manager 2.显示当前连接用户 SQL> show user 3.查看系统拥有哪些用户 SQL> select * from all_users; 4.新建用户并授权 SQL> create user a identified by a;(默认建在SYSTEM表空间下) SQL> grant connect,resource to a; 5.连接到新用户 SQL> conn a/a

  • Oracle数据库下载及安装图文操作步骤

    一.Oracle 下载 注意Oracle分成两个文件,下载完后,将两个文件解压到同一目录下即可. 路径名称中,最好不要出现中文,也不要出现空格等不规则字符. 官方下地址: http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html以下两网址来源此官方下载页网. win 32位操作系统 下载地址: http://download.oracle.com/otn/nt/oracle11g/1120

  • ORACLE 10g 安装教程[图文]

    首先将ORACLE 10g的安装光盘放入光驱,如果自动运行,一般会出现如图1安装界面: 图1 单击"开始安装",就可以安装ORACLE 10g,一般会检查系统配置是否符合要求,然后出现"Oracle DataBase 10g安装"对话框,如图2所示: 图2 在安装Oracle DataBase 10g时可以选择"基本安装"和"高级安装"两种方法.选择"基本安装"时,"Oracle主目录位置&quo

  • oracle数据库tns配置方法详解

    TNS简要介绍与应用 Oracle中TNS的完整定义:transparence Network Substrate透明网络底层,监听服务是它重要的一部分,不是全部,不要把TNS当作只是监听器. TNS是Oracle Net的一部分,专门用来管理和配置Oracle数据库和客户端连接的一个工具,在大多数情况下客户端和数据库要通讯,必须配置TNS,当然在少数情况下,不用配置TNS也可以连接Oracle数据库,比如通过JDBC.如果通过TNS连接Oracle,那么客户端必须安装Oracle client

  • Oracle存储过程基本语法介绍

    Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它; 行2: IS关键词表明后面将跟随一个PL/SQL体. 行3: BEGIN关键词表明PL/SQL体的开始. 行4: NULL PL/SQL语句表明什么事都不做,这句不能删

  • Oracle中命名块之存储过程的详解及使用方法

    一.匿名块和命名块 ◆PL/SQL块分为良好总:命名块和匿名块. ◆匿名块:以declare或begin开始,每次执行匿名块都要通过客户端工具将其发送给Oracle,经过语法分析.编译然后执行. ◆命名块:具有名称的PL/SQL块,这些命名块被存储在Oracle中,编译一次,以后只可调用就可多次执行.如:存储过程.存储函数.包.触发器等. 存储过程:无返回值;   存储函数:有返回值;   包:可容纳多个过程或函数的一个容器(较好管理这些过程和函数,类似于java中的包);   触发器:在合适的

  • oracle中的procedure编写和使用详解

    1.创建/修改 CREATE [OR REPLACE] PROCEDURE procedure_name [(parameter_list)] {IS|AS} [local_declarations] BEGIN executable_statements [EXCEPTION exception_handlers] END [procedure_name]; a.parameter_list格式如下 parameter_name1 [in | out | in out] type, param

  • Oracle中nvl()和nvl2()函数实例详解

    目录 1.nvl:根据参数1是否为null返回参数1或参数2的值 [样例展示一]:expression1值为null: [样例展示二]:expression1值不为null: [样例展示三]:expression1.expression2值均为null: 2.nvl2:根据参数1是否为null返回参数2或参数3的值 [样例展示一]:expression1值不为null: [样例展示二]:expression1值为null: [样例展示三]:expression1为null,且expression

  • vue 中 命名视图的用法实例详解

    今天主要记录  vue中命名视图的用法 先奉上官网网址:https://router.vuejs.org/zh/guide/essentials/named-views.html 一般情况下,一个页面里面可能有多个组件,比如侧边栏,内容区,侧边栏是一个组件.内容区是一个组件,我们普遍会将两个组件作为子组件添加到主页面中,因为页面中只有一个 router-view视图,那么问题来了,怎么让一个页面中有多个视图呢,拥有多个视图,很随意,多写几个router-view标签就行了,但是每个router-

  • sql – Oracle中匿名TABLE/VARRAY类型示例详解

    前言 本文主要介绍的是关于sql Oracle匿名TABLE/VARRAY类型的相关内容,在Oracle中,我有时会创建一些这样的结构 SELECT * FROM TABLE(STRINGS('a', 'b', 'c')) SELECT * FROM TABLE(NUMBERS(1, 2, 3)) 显然,我可以为上述声明我自己的类型.我可以在TABLE和VARRAY之间进行选择.例如: CREATE TYPE STRINGS AS TABLE OF VARCHAR2(100); CREATE T

  • Oracle中使用DBMS_XPLAN处理执行计划详解

    DBMS_XPLAN是Oracle提供的一个用于查看SQL计划,包括执行计划和解释计划的包:在以前查看SQL执行计划的时候,我都是使用set autotrace命令,不过现在看来,DBMS_XPLAN包给出了更加简化的获取和显示计划的方式. 这5个函数分别对应不同的显示计划的方式,DBMS_XPLAN包不仅可以获取解释计划,它还可以用来输出存储在AWR,SQL调试集,缓存的SQL游标,以及SQL基线中的语句计划,实现如上的功能,通常会用到一下5个方法: 1.DISPLAY 2.DISPLAY_A

  • Oracle中dblink的实际应用示例详解

    前言 本文介绍的是关于Oracle同义词+dblink的实际应用,下面话不多说了,来一起看看详细的介绍吧. 业务需求:原数据库(10.2.0.4.0),新数据库(11.2.0.3) 由于程序的需求原因,现在需要把新库上的某个用户直接映射到老库用户下: 1. 备份原库的用户 nohup exp scott/scott OWNER=scott BUFFER=10240000 STATISTICS=none RESUMABLE=y FILE=scott_all_exp.dmp LOG=scott_al

  • Oracle中instr和substr存储过程详解

    instr和substr存储过程,分析内部大对象的内容 instr函数 instr函数用于从指定的位置开始,从大型对象中查找第N个与模式匹配的字符串. 用于查找内部大对象中的字符串的instr函数语法如下: dbms_lob.instr( lob_loc in blob, pattern in raw, offset in integer := 1; nth in integer := 1) return integer; dbms_lob.instr( lob_loc in clob char

  • oracle中存储函数与存储过程的区别介绍

    在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,可是也有它们的不同之处,这段时间刚学完函数与存储过程,来给自己做一个总结: 一:存储过程:简单来说就是有名字的pl/sql块. 语法结构: create or replace 存储过程名(参数列表) is --定义变量 begin --pl/sql end; 案例: create or replace procedure add_(a int,b int) is c int; begin c:=a+b; dbms_ou

  • php 访问oracle 存储过程实例详解

    php 访问oracle 存储过程实例详解 比如我的本地Oracle数据库有一个package,里面有一个存储过程: create or replace package PKG_TRANS_REL is -- Author : test -- Created : -- Purpose : test -- Public type declarations PKG_NAME varchar2(20) := 'PKG_TRANS_REL'; --存储过程,测试用 procedure pro_GC_wi

随机推荐