iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Oracle在PL/SQL中使用存储过程
  • 727
分享到

Oracle在PL/SQL中使用存储过程

2024-04-02 19:04:59 727人浏览 薄情痞子
摘要

目录一、概述二、存储过程详解1、创建过程语法:2、创建存储过程3、调用存储过程4、C# 调用:三、存储过程返回记录集SYS_REFCURSOR1、返回单行语法2、返回多行语法四、维护

一、概述

过程和函数统称为PL/sql子程序,他们是被命名的PL/SQL块,均存储于数据库中。

并通过输入、输出和输入输出参数与其调用者交换信息。唯一区别是函数总向调用者返回数据。

二、存储过程详解

1、创建过程语法:

CREATE [ OR REPLACE ] PROCEDURE [ schema. ] procedure_name
    [ ( parameter_declaration [, parameter_declaration ]... ) ]
    [ invoker_rights_clause ]
    { IS | AS }
    { [ declare_section ] body | call_spec | EXTERNAL} ;

说明:

  • procedure_name:过程名称。
  • parameter_declaration:参数声明,格式如下:
parameter_name [ [ IN ] datatype [ { := | DEFAULT } expression ]
          | { OUT | IN OUT } [ NOCOPY ] datatype
  • IN:输入参数。
  • OUT:输出参数。
  • IN OUT:输入输出参数。
  • invoker_rights_clause:这个过程使用谁的权限运行,格式:
AUTHID { CURRENT_USER | DEFINER }
  • declare_section:声明部分。
  • body:过程块主体,执行部分

2、创建存储过程

带有输入、输出参数的过程

CREATE OR REPLACE PROCEDURE proc_demo
(
    dept_no NUMBER DEFAULT 10,
    sal_sum OUT NUMBER,
    emp_count OUT NUMBER
  )
IS
BEGIN
    SELECT SUM(salary), COUNT(*) INTO sal_sum, emp_count
  FROM employees WHERE department_id = dept_no;
EXCEPTION
   WHEN NO_DATA_FOUND THEN
      DBMS_OUTPUT.PUT_LINE('温馨提示:你需要的数据不存在!');
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
END proc_demo;

3、调用存储过程

调用方式: 
1)、当在SQL*PLUS中调用过程时,需要使用CALL或者EXECUTE命令,而在PL/SQL块中过程可以直接引用。

-- 调用删除员工的过程
EXEC remove_emp(1);
  
-- 调用插入员工的过程
EXECUTE insert_emp(1, 'tommy', 'lin', 2);

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

DECLARE
V_num NUMBER;
V_sum NUMBER(8, 2);
BEGIN
  Proc_demo(30, v_sum, v_num);
     DBMS_OUTPUT.PUT_LINE('温馨提示:30号部门工资总和:'||v_sum||',人数:'||v_num);
  Proc_demo(sal_sum => v_sum, emp_count => v_num);
     DBMS_OUTPUT.PUT_LINE('温馨提示:10号部门工资总和:'||v_sum||',人数:'||v_num);
END;

4、C# 调用:

oracleCommand cmd = new OracleCommand("prroc_demo", myOracleConnection);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("v_companycode", OracleType.Char); 
cmd.Parameters["v_companycode"].Value = "aa";
cmd.Parameters.Add("v_returnvalue", OracleType.Float).Direction = ParameterDirection.Output;
cmd.ExecuteNoQuery();
string eval = cmd.Parameters["v_returnvalue"].Value.ToString();

三、存储过程返回记录集SYS_REFCURSOR

cursor与REF cursor大致有以下几点区别:

  • 静态游标不能返回到客户端,只有PL/SQL才能利用它。ref游标则可以,是从Oracle的存储过站返回结果集的方式。
  • PL/SQL静态游标可以是全局的,而ref游标只能在定义它的过程中使用,但ref游标可以从子例程传递到子例程,而普通游标则不能。
  • 静态光标比ref游标效率要高。
  • sys_refcursor在oracle9i以后系统定义的一个refcursor,主要用于在过程中返回结果集。

1、返回单行语法

create or replace procedure proc_query_rent (
  param_region varchar2,  --定义区
  param_room number,  --定义室
  param_hall number,  --定义厅
  param_rentMin number,  --定义租金上限
  param_rentMax number,  --定义租金下限
  param_resultSet OUT SYS_REFCURSOR --定义out参数返回结果集
) 
as 
begin 
open param_resultSet for select  * from tb_rent
 where region like case when param_region IS null then '%' else param_region end
  AND room like case when param_room IS null then '%' else to_char(param_room) end
  AND hall like case when param_hall IS null then '%' else to_char(param_hall) end
  AND rent between case when param_rentMin IS null then 0 else param_rentMin end
  AND case when param_rentMax IS null then 99999999 else param_rentMax end;
end;

调用:

declare 
  v_rent_rows SYS_REFCURSOR;
  v_rent_row tb_rent % rowType;
begin 
   proc_query_rent('山区', null, null, 1200, null, v_rent_rows);
   Dbms_output.put_line('所在区 室 厅 租金');
   loop 
      fetch v_rent_rows into v_rent_row;//单行
      exit when v_rent_rows % NOTFOUND;
      Dbms_output.put_line(v_rent_row.region || '  ' || v_rent_row.room || '  ' || v_rent_row.hall || '  ' || v_rent_row.rent);
   end loop;
   close v_rent_rows;
end;

2、返回多行语法

存储过程:

create or replace procedure getEmpByDept(in_deptNo in emp.deptno%type,  out_curEmp out SYS_REFCURSOR) as 
begin 
 open out_curEmp for 
  SELECT * FROM emp WHERE deptno = in_deptNo ; 
EXCEPTION 
 WHEN OTHERS THEN 
 RaiSE_APPLICATION_ERROR(-20101, 
  'Error in getEmpByDept' || SQLCODE ); 
end getEmpByDept;

调用(执行存储过程):

declare 
  cur_emp sys_refcursor;
  type emp emp_type is table of yemp%rowtype;
  vemps emp_type;
begin
   sp_getEmp(line=>'A5',curemp=>cur_emp);
   fetch cur_emp bulk collect into vemps;
   for i in v_emps.first..v_emps.last loop
      dbms_output.putline(v_emps(i).empid);
   end loop;
   close cur_emp;
end;

C# 调用:

OracleCommand cmd = new OracleCommand("prroc_demo", myOracleConnection);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("v_companycode", OracleType.Char).Value = "aa";
cmd.Parameters.Add("curEmp", OracleType.Cursor).Direction = ParameterDirection.Output;
OracleDataAdapter da = new OracleDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
this.dataGridView1.DataSource = ds.Tables[0];

四、维护存储过程

1、删除过程

可以使用DROP PROCEDURE命令对不需要的过程进行删除

DROP PROCEDURE logexecution;

2、显示过程代码

select text from user_source where name='存储过程名(大写)' and type='PROCEDURE';

3、查看过程状态

select  object_type ,object_name ,status from user_objects where  object_name  = 'procedure';

4、重新编译过程

alter procedure pro_backup compile;

五. 过程与函数比较

1、相同点:

  • 都使用IN模式的参数传入数据、OUT模式的参数返回数据。
  • 输入参数都可以接受默认值,都可以传值或传引导。
  • 调用时的实际参数都可以使用位置表示法、名称表示法或组合方法。
  • 都有声明部分、执行部分和异常处理部分。
  • 其管理过程都有创建、编译、授权、删除、显示依赖关系等。

2、不同点:

  • 过程:作为PL/SQL语句执行;函数:作为表达式的一部分执行
  • 过程:在规范中不包含RETURN子句;函数:必须在规范中包含RETURN子句
  • 过程:不返回任何值;函数:必须返回单个值
  • 过程:可以RETURN语句,但是与函数不同,它不能用于返回值;函数:必须包含至少一条RETURN语句

六、 与过程相关数据字典

USER_SOURCE, ALL_SOURCE, DBA_SOURCE, USER_ERRORS,

ALL_PROCEDURES,USER_OBJECTS,ALL_OBJECTS,DBA_OBJECTS

相关的权限:

CREATE ANY PROCEDURE

DROP ANY PROCEDURE

SQL*PLUS 中,可以用DESCRIBE 命令查看过程的名字及其参数表。

DESC[RIBE] Procedure_name;

到此这篇关于Oracle在PL/SQL中使用存储过程的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: Oracle在PL/SQL中使用存储过程

本文链接: https://www.lsjlt.com/news/148049.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Oracle在PL/SQL中使用存储过程
    目录一、概述二、存储过程详解1、创建过程语法:2、创建存储过程3、调用存储过程4、C# 调用:三、存储过程返回记录集SYS_REFCURSOR1、返回单行语法2、返回多行语法四、维护...
    99+
    2024-04-02
  • oracle PL/SQL与存储过程分析
    本篇内容介绍了“oracle PL/SQL与存储过程分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!PL...
    99+
    2024-04-02
  • 如何在Oracle数据库中使用PL/SQL编写存储过程和触发器
    在Oracle数据库中使用PL/SQL编写存储过程和触发器,可以按照以下步骤进行操作: 使用SQL Developer或者其他O...
    99+
    2024-03-02
    Oracle
  • 了解MySQL中的存储过程与PL/SQL的关系
    标题:探究MySQL中的存储过程与PL/SQL的关系 在数据库开发中,存储过程是一种预先编译的SQL语句集合,可以在数据库服务器上执行。MySQL是一种流行的关系型数据库管理系统,它支...
    99+
    2024-03-15
    mysql 存储过程 pl/sql sql语句
  • 了解MySQL中的存储过程与PL/SQL的关系
    标题:探究MySQL中的存储过程与PL/SQL的关系 在数据库开发中,存储过程是一种预先编译的SQL语句集合,可以在数据库服务器上执行。MySQL是一种流行的关系型数据库管理系统,它支...
    99+
    2024-03-15
    mysql 存储过程 pl/sql sql语句
  • 如何编写高效的PL/SQL存储过程
    编写高效的PL/SQL存储过程是一个需要技巧和经验的过程。以下是一些编写高效PL/SQL存储过程的建议: 涉及到大量数据的操作时...
    99+
    2024-05-07
    PL/SQL
  • 如何实现PL/SQL中编写Oracle数据库分页的存储过程
    这篇文章主要为大家展示了“如何实现PL/SQL中编写Oracle数据库分页的存储过程”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现PL/SQL中编写Or...
    99+
    2024-04-02
  • Oracle在PL/SQL中使用子查询
    目录一、概述1、单行子查询(子查询只返回一行)2、多行单列子查询(子查询返回多行)3、多列子查询二、在DDL语句中使用子查询1、create table2、create View3、...
    99+
    2024-04-02
  • oracle中如何使用存储过程
    这期内容当中小编将会给大家带来有关oracle中如何使用存储过程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 1.基本结构 CREATE OR REPLAC&...
    99+
    2024-04-02
  • oracle中存储过程如何使用
    今天就跟大家聊聊有关oracle中存储过程如何使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一. 使用for循环游标:遍历所有职位为经理的雇员1...
    99+
    2024-04-02
  • oracle怎么查询存储过程sql
    要查询 oracle 中的存储过程,请使用describe命令,其中包括以下步骤:1. 确定存储过程的名称;2. 使用describe命令;3. 解释结果,包括参数、本地变量和sql代码...
    99+
    2024-04-18
    oracle 作用域
  • SQL中创建存储过程
    目录创建SQL存储过程需要使用到的语法无参数带参两个参数declare关键字的使用IF语句case语句loop语句repeatwhile创建SQL存储过程需要使用到的语法 - 创建存储过程 CREATE 存储过程的名称(...
    99+
    2024-04-02
  • oracle存储过程在哪看
    oracle存储过程可通过以下方法查看:pl/sql developer工具:展开“存储过程”节点。sqlplus命令行工具:运行select from user_proce...
    99+
    2024-04-19
    oracle
  • 如何在SQL Server中使用SQL语句查询一个存储过程被其它所有的存储过
    这期内容当中小编将会给大家带来有关如何在SQL Server中使用SQL语句查询一个存储过程被其它所有的存储过,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在SQL Se...
    99+
    2024-04-02
  • sql存储过程中临时表怎么使用
    在SQL存储过程中,可以使用临时表来存储中间结果或者临时数据。以下是使用临时表的一般步骤:1. 创建临时表:在存储过程的开始部分,使...
    99+
    2023-08-23
    sql
  • SQL Server存储过程
    理论知识:开始一、TRUNCATE    快速地从一堆表中删除所有行。它和在每个表上进行无条件的 DELETE 有同样的效果,不过因为它不做表扫描,因而快得多。 在大表...
    99+
    2024-04-02
  • 3. SQL -- 存储过程
    存储过程在Sql Server中,可以定义子程序存放在数据库中,这样的子程序称为存储过程,它是数据库对象之一.一存储过程的优点:1: 存储过程在服务器端运行,执行速度快2: 存储过程只执行一次,然后把编译的二进制代码保存在调整缓存中,以后可...
    99+
    2023-01-31
    存储过程 SQL
  • 如何在mysql中使用存储过程
    如何在mysql中使用存储过程?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中...
    99+
    2024-04-02
  • SQL之存储过程
    文章目录 一、介绍二、基本语法三、变量系统变量自定义变量局部变量 四、条件、循环判断if语法:参数casewhilerepeatloop 五、游标条件处理程序 一、介绍 存储...
    99+
    2023-08-31
    sql 数据库 mysql
  • oracle存储过程中游标怎么使用
    在Oracle存储过程中,可以使用游标来处理查询结果集。游标允许逐行处理查询结果,类似于使用指针遍历数据。以下是在Oracle存储过...
    99+
    2023-09-09
    oracle
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作