Oracle存储过程基础

合集下载

ORACLE存储过程详解教程

ORACLE存储过程详解教程

ORACLE存储过程详解教程ORACLE存储过程是一种预先编译的数据库对象,它包含了一组执行特定任务的SQL语句和程序逻辑。

存储过程可以在数据库中存储并被多个客户端应用程序调用,从而提高应用程序的性能和安全性。

在本篇文章中,我们将详细介绍ORACLE存储过程的概念、语法和使用方法。

一、存储过程的概念存储过程是一段预定义的SQL代码块,它可以接受参数并可选地返回结果。

存储过程在执行时可以访问数据库对象并执行事务处理。

存储过程可以被调用多次,减少了代码的编写和重复性的执行。

存储过程具有以下特点:1.存储过程是预先编译的,因此执行速度比动态SQL语句更快。

2.存储过程可以接受输入参数,并可以在参数基础上进行一系列的SQL操作。

3.存储过程可以返回一个或多个结果集。

4.存储过程可以包含条件判断、循环和异常处理等控制结构。

二、存储过程的语法创建存储过程的语法如下:CREATE [OR REPLACE] PROCEDURE procedure_name[ (parameter_name [IN,OUT] datatype [, ...]) ]IS[local_variable_declarations]BEGIN[executable_statements]EXCEPTION[exception_handling_statements]END;存储过程的语法包含以下几个部分:1.CREATE[ORREPLACE]PROCEDURE:指定创建一个存储过程。

CREATE关键字用于创建新的存储过程,而ORREPLACE关键字用于替换已存在的同名存储过程。

2. procedure_name:指定创建的存储过程的名称。

3. (parameter_name [IN,OUT] datatype[, ...]):指定存储过程的输入和输出参数。

参数的名称和数据类型必须指定,并且可以指定IN或OUT关键字来表示参数的传入和传出。

ORACLE存储过程详解教程

ORACLE存储过程详解教程

ORACLE存储过程详解教程Oracle存储过程是一种存储在数据库中的可重用的程序单元,它可以被调用并执行。

存储过程通常用于执行一系列相关的数据库操作,可以提高性能、可维护性和安全性。

1.存储过程的优势:-提高性能:存储过程可以减少网络通信的开销,因为它们在数据库服务器上执行,而不是在客户端上。

-改善可维护性:存储过程可以在数据库中进行维护和修改,而无需重新编译客户端应用程序。

-增强安全性:存储过程可以对敏感数据进行访问控制,并通过参数化查询来防止SQL注入攻击。

2.创建存储过程的语法:```sqlCREATE [OR REPLACE] PROCEDURE procedure_name[(parameter_name [IN , OUT , IN OUT] data_type [:= default_value])]IS--声明变量BEGIN--程序代码END [procedure_name];```-CREATE[ORREPLACE]PROCEDURE语句用于创建一个新的存储过程。

- procedure_name是存储过程的名称。

- parameter_name是参数的名称,可以使用IN、OUT或IN OUT修饰符指定参数的类型。

- data_type是参数的数据类型。

- default_value是参数的默认值。

-IS关键字用于声明存储过程的开头。

-BEGIN和END语句用于包围存储过程的代码。

3.存储过程的示例:下面是一个简单的存储过程示例,它返回指定员工的薪水:```sqlCREATE OR REPLACE PROCEDURE get_employee_salary(employee_id IN employees.employee_id%TYPE,salary OUT employees.salary%TYPE)ISBEGINSELECT salary INTO salaryFROM employeesWHERE employee_id = employee_id;END get_employee_salary;```- get_employee_salary是存储过程的名称。

21 Oracle基础 - 存储过程、函数、触发器

21 Oracle基础 - 存储过程、函数、触发器

认识触发器(trigger)
不同的DML(select/update/delete/insert)操作,触
发器能够进行一定的拦截,符合条件的操作方可操作 基本,反之,不可操作基表。
为什么要用触发器?如果没有触发器,那么DML所有
操作,均可无限制的操作基表,这样一来,不符合业 务需求。
认识触发器
存储过程范例
--调用存储过程 declare
sui number; sal number; begin getsui(&sal,sui); dbms_output.put_line('你需交税:'||sui||'元'); end; /
存储过程范例
范例三:计算指定部门的工资总和,并统计其中的职工数量
存储过程调用/删除方法
直接利用EXECUTE命令,只储过程名[(参数列表)]; 范例:调用存储过程 exec hello;或execute hello;

在PL/SQL块中调用语法,可以有返回值和无返回值。 BEGIN 存储过程名[(参数列表)]; END; /
/
认识函数(function)
命名的PL/SQL块,总是返回一个特定数据类型的值。 存储在数据库中,可以重复执行的对象。 可以作为表达式的一部分进行调用。
函数语法格式
CREATE [OR REPLACE] FUNCTION 函数名称 [( 参数[IN | OUT | IN OUT] 数据类型, ... 参数[IN | OUT | IN OUT]数据类型)]

函数范例
--调用函数 declare pempno number; yearsal number; begin yearsal:=getyearsal(&pempno); dbms_output.put_line('该员工的年收入为:

Oracle存储过程基本语法格式

Oracle存储过程基本语法格式

Oracle存储过程基本语法格式Oracle存储过程是一种数据库对象,可以包含一系列的SQL语句和控制结构,用于封装和组织一组相关的操作。

存储过程可以在数据库中进行定义、编译和执行,提高了数据库的性能和安全性。

下面是Oracle存储过程的基本语法格式。

1.创建存储过程:CREATE [OR REPLACE] PROCEDURE procedure_name[(parameter_name [IN , OUT , IN OUT] type [, ...])]IS[local_variable_declarations]BEGIN-- Procedural statementsEND;-CREATE[ORREPLACE]PROCEDURE:用于创建一个新的存储过程,ORREPLACE关键字可用于更新已存在的存储过程。

- procedure_name:存储过程的名称。

- parameter_name [IN , OUT , IN OUT] type:存储过程的参数,可以包含输入参数(IN)、输出参数(OUT)和输入输出参数(IN OUT)。

-IS:开始存储过程定义的关键字。

- local_variable_declarations:定义存储过程中使用的局部变量。

-BEGIN和END之间是存储过程的主体部分,包含实际的SQL语句和控制结构。

2.存储过程的参数传递:-IN参数:将参数的值传递给存储过程,但不允许在存储过程中修改参数的值。

-OUT参数:存储过程将参数的值输出给调用者,但在存储过程中不能使用该参数的值。

-INOUT参数:允许将参数的值传递给存储过程,并且存储过程还可以修改该参数的值。

3.存储过程的主体部分:存储过程的主体部分由一系列的SQL语句和控制结构组成,用于实现具体的功能。

主体部分可以使用以下类型的语句和结构:-SQL语句:可以使用所有合法的SQL语句,包括SELECT、INSERT、UPDATE和DELETE等。

oracle存储过程的基本语法

oracle存储过程的基本语法

oracle存储过程的基本语法1.基本结构CREATE OR REPLACE PROCEDURE 存储过程名字(参数1 IN NUMBER,参数2 IN NUMBER) IS变量1 INTEGER :=0;变量2 DATE;BEGINEND 存储过程名字2.SELECT INTO STATEMENT将select查询的结果存⼊到变量中,可以同时将多个列存储多个变量中,必须有⼀条记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)例⼦:BEGINSELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx;EXCEPTIONWHEN NO_DATA_FOUND THENxxxx;END;...3.IF 判断IF V_TEST=1 THENBEGINdo somethingEND;END IF;4.while 循环WHILE V_TEST=1 LOOPBEGINXXXXEND;END LOOP;5.变量赋值V_TEST := 123;6.⽤for in 使⽤cursor...ISCURSOR cur IS SELECT * FROM xxx;BEGINFOR cur_result in cur LOOPBEGINV_SUM :=cur_result.列名1+cur_result.列名2END;END LOOP;END;7.带参数的cursorCURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID; OPEN C_USER(变量值);LOOPFETCH C_USER INTO V_NAME;EXIT FETCH C_USER%NOTFOUND;do somethingEND LOOP;CLOSE C_USER;8.⽤pl/sql developer debug连接数据库后建⽴⼀个Test WINDOW在窗⼝输⼊调⽤SP的代码,F9开始debug,CTRL+N单步调试简单实例,通过DBMS_OUTPUT来看结果CREATE OR REPLACE PROCEDURE bb (lic_para IN VARCHAR2,out_para OUT VARCHAR2)AStemp VARCHAR2 (100);BEGINSELECT lic_noINTO tempFROM t_vehicle_infoWHERE lic_no = lic_para;out_para:=temp;DBMS_OUTPUT.put_line (out_para);END bb;下⾯是调⽤:begin-- Call the procedurebb(lic_para => :lic_para,out_para => :out_para);end;可以在命令⾏⾥敲sqlplus ”接着调试存储过程。

oracle存储过程学习经典入门

oracle存储过程学习经典入门

oracle存储过程学习经典入门Oracle存储过程基本语法存储过程1 CREATE OR REPLACE PROCEDURE 存储过程名2 IS3 BEGIN4 NULL;5 END;行1:CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做sk eleton存储过程, 如果存在就覆盖它;行2:IS关键词表明后面将跟随一个PL/SQL体。

行3:BEGIN关键词表明PL/SQL体的开始。

行4:NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句;行5:END关键词表明PL/SQL体的结束存储过程创建语法:create or replace procedure 存储过程名(param1 in type,param2 out type)as变量1 类型(值范围); --vs_msg VARCHAR2(4000);变量2 类型(值范围);复制代码代码如下:BeginSelect count(*) into 变量1 from 表A where列名=param1;If (判断条件) thenSelect 列名 into 变量2 from 表A where列名=param1;Dbms_output。

Put_line(‘打印信息');Elsif (判断条件) thenDbms_output。

Put_line(‘打印信息');ElseRaise 异常名(NO_DATA_FOUND);End if;ExceptionWhen others thenRollback;End;注意事项:1,存储过程参数不带取值范围,in表示传入,out表示输出类型可以使用任意Oracle中的合法类型。

2,变量带取值范围,后面接分号3,在判断语句前最好先用count(*)函数判断是否存在该条操作记录4,用select 。

into。

oracle 存储过程内容

oracle 存储过程内容

oracle 存储过程内容Oracle存储过程是一种存储在数据库中的一段具有特定功能的程序代码。

它可以接收输入参数、执行一系列操作,并最终返回结果。

存储过程在数据库开发中具有重要作用,可以提高数据库的性能和安全性。

本文将介绍Oracle存储过程的相关内容,包括其定义、优势、使用场景以及编写规范等。

一、定义Oracle存储过程是一种预编译的数据库程序,它以数据库中的一组SQL语句为基础,通过编写PL/SQL代码来实现特定的功能。

存储过程可以接收输入参数,并根据这些参数执行相应的操作,最后返回结果。

存储过程通常用于执行复杂的数据操作和业务逻辑,它可以被其他程序或者SQL语句调用。

二、优势1. 提高性能:存储过程在数据库中预编译,编译后的代码被保存在数据库中,可以重复使用。

相比于单独执行一系列SQL语句,存储过程可以减少网络通信和SQL语句的解析开销,从而提高数据库的性能。

2. 增强安全性:存储过程可以设置访问权限,并且可以通过参数校验和异常处理来增强数据的安全性。

只有具有相应权限的用户才能调用存储过程,并且存储过程内部可以对输入参数进行合法性检查,防止恶意操作和注入攻击。

3. 代码复用:存储过程可以被多个程序或SQL语句调用,可以实现代码的复用。

通过存储过程,可以将一些常用的业务逻辑封装起来,避免重复编写相同的代码,提高开发效率和代码质量。

三、使用场景1. 数据处理:存储过程可以用于执行复杂的数据处理操作,如数据转换、数据清洗、数据统计等。

通过编写存储过程,可以将这些操作封装起来,提高数据处理的效率和准确性。

2. 业务逻辑:存储过程可以用于实现复杂的业务逻辑,如订单处理、库存管理、权限控制等。

通过存储过程,可以将这些业务逻辑封装起来,简化应用程序的开发和维护。

3. 批量操作:存储过程可以用于执行批量操作,如批量插入、批量更新、批量删除等。

通过存储过程,可以减少网络通信和SQL语句的解析开销,提高批量操作的性能。

oracle 存储过程内容

oracle 存储过程内容

oracle 存储过程内容Oracle存储过程是一种在数据库中存储的一段预编译的PL/SQL代码,可以在需要的时候被调用执行。

它可以完成复杂的数据库操作,提高数据库的性能和可维护性。

本文将介绍Oracle存储过程的基本概念、语法规则和应用场景,以帮助读者深入了解和使用这一功能。

一、Oracle存储过程的基本概念Oracle存储过程是由一系列的SQL语句、控制结构和变量组成的,它可以接受输入参数、返回输出结果,并且可以在数据库中被存储和重复使用。

存储过程可以在应用程序、触发器或其他存储过程中被调用执行,以实现特定的业务逻辑。

二、Oracle存储过程的语法规则Oracle存储过程的语法规则如下:1. 存储过程以CREATE PROCEDURE语句开始,后面跟着存储过程的名称和参数列表。

2. 存储过程的主体部分由BEGIN和END关键字包围,其中包含一系列的SQL语句和控制结构。

3. 存储过程可以定义输入参数、输出参数和局部变量,以及用于返回结果的游标。

4. 存储过程中可以使用IF、CASE、LOOP等控制结构来实现条件判断、循环等逻辑。

5. 存储过程可以使用异常处理模块来处理错误和异常情况。

6. 存储过程可以使用COMMIT和ROLLBACK语句来控制数据库事务。

7. 存储过程可以使用EXECUTE IMMEDIATE语句执行动态SQL语句。

8. 存储过程可以使用DBMS_OUTPUT包来输出调试信息。

三、Oracle存储过程的应用场景1. 数据库管理:可以使用存储过程来创建、修改和删除数据库对象,如表、视图、索引等。

2. 数据导入导出:可以使用存储过程来实现数据的批量导入和导出,提高数据的处理效率。

3. 数据转换和清洗:可以使用存储过程来实现数据的转换、清洗和校验,保证数据的质量和一致性。

4. 业务逻辑处理:可以使用存储过程来实现复杂的业务逻辑,如订单处理、库存管理等。

5. 数据报表生成:可以使用存储过程来生成各种类型的报表,如销售报表、财务报表等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

异常

自定义

declare
l_exc exception;

begin … raise l_exc; exception when l_exc then … end;
异常

异常传播

见注释例子 见注释例子二 EXCEPTION WHEN OTHERS THEN RET := SQLCODE; ERR_MSG := ‘错误信息:' ||SQLERRM(SQLCODE);
过程

过程

命了名的PL/SQL块,可以被赋予参数,存储在数据库中,然后由另 一个应用或者PL/SQL例程调用

语法

CREATE [OR REPLACE] PROCEDURE procedure_name (参数) IS | AS [PRAGMA AUTONOMOUS_TRANACTION;] --声明自主事务处理 [本地变量声明] BEGIN 执行语句部分 [EXCEPTION] 错误处理部分 END[name];
控制语句:

IF .. THEN .. ELSIF 语句


IF ... THEN …; ELSIF … THEN …; ELSE …; END IF;
PL/SQL基础-逻辑比较
控制语句:

CASE 语句 一
CASE 变量 WHEN 值1 THEN …; WHEN 值2 THEN …; ELSE …; END CASE;
注:程序块可以在可执行部分和异常处理
PL/SQL基础-目录
声明部分 数据类型


记录 使用%TYPE和%ROWTYPE 控制语句
• 条件 • 循环
逻辑比较

PL/SQL基础-声明部分
变量和常量都必须在声明( declare )部分定义,必 须规定名称和数据类型 也可以在声明部分为变量赋值,即初始化变量 常量
PL/SQL基础-逻辑比较

循环: WHILE循环
Declare l_Loops Number := 0; Begin While l_Loops < 5 Loop Dbms_Output.Put_Line('looped '|| l_Loops || 'times'); l_Loops := l_Loops + 1; End Loop; End;
PL/SQL基础-逻辑比较
控制语句:

IF .. THEN 语句

IF .. THEN …; END IF;
PL/SQL基础-逻辑比较
控制语句:

IF .. THEN .. ELSE语句


IF ... THEN …; ELSE …; END IF;
PL/SQL基础-逻辑比较
异常
预定义

No_data_found
• select语句检索不到满足条件的数据行

Too_many_rows
• 由于隐式游标每次只能检索一行数据,使用隐式游标 时,这个异常检测到有多行数据存在

dup_val_on_index
• 如果某索引中已有某键列值,若还要在该索引中创建 该键码值的索引项时,出现此异常


IN:参数通过调用者传入,只能由过程读取, 不能改变 OUT:参数有过程写入 。用于过程需要向调用 者返回多条信息的时候。不能是具有默认值的 变量,也不能是常量,必须向OUT参数传递返 回值。 IN OUT 具有两者的特性,可以读取和写入。
过程
参数传递方法

使用名称表示
• exec insert_into_t (p2=> 101, p1=>201);

使用位置表示
• exec insert_into_t (102, 202);

使用混合表示
• exec default_values(‘Tom’, p3=>’Joel’);
过程
例子

使用scott.emp表,编写搜索过程,输入empno, 返回ename , sal 参数:一个in, 两个out 参数类型:in number, out emp.ename%type , out emp.sal%type
游标

显式游标

ቤተ መጻሕፍቲ ባይዱ
CURSOR 游标名 ( 参数 ) [返回值类型] IS Select 语句

生命周期

打开游标(OPEN):
• 解析,绑定----不会从数据库检索数据

从游标中获取记录(FETCH INTO):
• 执行查询,返回结果集 • 通常定义局域变量作为从游标获取数据的缓冲区

关闭游标(CLOSE)
作用域和可视性

when others then最后一个错误处理柄

游标
定义

用来查询数据库,获取记录集合(结果集)的指 针,可以让开发者一次访问一行结果集,在每条 结果集上作操作 静态游标
• 显式游标 • 隐式游标
分类


REF游标
• 是一种引用类型,类似于指针 • PKG_CACHE_COMMANDS.RTCUR
• 弱类型(非限制)REF CURSOR,不规定返回类型, 可以获取任何结果集


TYPE ref_cursor_name IS REF CURSOR [RETURN return_type] PACKAGE PKG_GLOBAL_CONFIG
游标
单独select

使用INTO获取值,只能返回一行 Declare l_Empno Emp.Empno%Type; Begin Select Empno Into l_Empno From Emp Where Rownum = 1; Dbms_Output.Put_Line(l_Empno); End;
分析

过程



例1. --节选自在线代码modetest.sql REM 作者: Scott Urman. CREATE OR REPLACE PROCEDURE ModeTest ( p_InParameter IN NUMBER, p_OutParameter OUT NUMBER, p_InOutParameter IN OUT NUMBER) IS v_LocalVariable NUMBER; BEGIN /* 分配 p_InParameter 给 v_LocalVariable. */ v_LocalVariable := p_InParameter; -- Legal /* 分配 7 给 p_InParameter. 这是非法的,因为声明是IN */ p_InParameter := 7; -- Illegal /* 分配 7 给 p_InParameter. 这是合法的,因为声明是OUT */ p_OutParameter := 7; -- Legal /* 分配 p_OutParameter 给 v_LocalVariable.这是非法的,因为声明是IN */ v_LocalVariable := p_outParameter; -- Illegal /* 分配 p_InOutParameter 给 v_LocalVariable. 这是合法的,因为声明是IN OUT */ v_LocalVariable := p_InOutParameter; -- Legal /*分配 7 给 p_InOutParameter. 这是合法的,因为声明是IN OUT */ p_InOutParameter := 7; -- Legal END ModeTest; /
过程

执行存储过程

execute my_proc exec my_proc begin my_proc end; 只有将EXECUTE 特权赋予用户,用户才可以运行它 将它赋予PUBLIC用户,则所有用户都可以运行

权限:具有EXECUTE特权

过程
参数

三种模式:IN、OUT、 IN OUT


不能改变 必须在声明的时候初始化常量 必须在数据类型的左边规定constant 编译错误情况:
• 没有初始化 • 执行过程中改变常量
PL/SQL基础-声明部分

为常量变量赋值 := 声明部分可以指定默认值 default expression

作用域
只在声明之后的begin end块内有效
游标
显式和隐式游标的区别


尽量使用隐式游标,避免编写附加的游标控制 代码(声明,打开,获取,关闭) 也不需要声明变量来保存从游标中获取的数据
游标
REF

CURSOR游标
动态游标,在运行的时候才能确定游标使用的 查询 ,分类
• 强类型(限制)REF CURSOR,规定返回类型

强类型举例 见备注
• 完成游标处理,用户不能从游标中获取行 • 还可以重新打开

选项:参数和返回类型
游标
隐式游标


在PL/SQL中使用DML语言,使用ORACLE提 供的名为SQL的隐示游标 CURSOR FOR LOOP,用于for loop 语句
游标
游标属性




%FOUND:变量最后从游标中获取记录的时候, 在结果集中找到了记录 %NOTFOUND:变量最后从游标中获取记录 的时候,在结果集中没有找到记录 %ROWCOUNT:当前时刻已经从游标中获取 的记录数量 %ISOPEN:是否打开
相关文档
最新文档