Oracle Subprogram即Oracle子程序

2024-08-21 04:12
文章标签 oracle 子程序 subprogram

本文主要是介绍Oracle Subprogram即Oracle子程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Oracle Subprogram,即Oracle子程序,是Oracle数据库中存储的过程(Procedures)和函数(Functions)的统称。这些子程序是存储在数据库中的PL/SQL代码块,用于执行特定的任务或操作。下面详细介绍Oracle Subprogram的几个方面:

一、基本概念

  • 过程(Procedures):过程是一系列为了完成特定功能而编写的SQL和PL/SQL语句的集合。过程执行操作但不返回值。
  • 函数(Functions):函数也是一系列SQL和PL/SQL语句的集合,但它执行计算并返回一个值。

二、特点与优势

  • 存储性:子程序存储在数据库中,可以在多个应用程序或数据库会话中重用,减少了代码冗余。
  • 封装性:通过封装复杂的业务逻辑,子程序可以提高代码的可读性和可维护性。
  • 安全性:通过控制对子程序的访问权限,可以保护数据库的安全。

三、类型

  • 独立子程序:在模式级别创建,不依赖于其他包或对象。
  • 包子程序:在包(Package)内创建,与包的其他部分(如类型、变量、游标等)紧密相关。

四、结构与组成

Oracle子程序遵循PL/SQL块结构,通常由以下几个部分组成:

  1. 声明部分(Declarative Part):包含子程序所需的类型、常量、变量、游标、异常等的声明。
  2. 执行部分(Executable Part):包含执行操作的SQL和PL/SQL语句。
  3. 异常处理部分(Exception Handling Part):包含处理执行过程中可能出现的异常的代码。

五、创建与调用

  • 创建:使用CREATE OR REPLACE PROCEDURE(对于过程)或CREATE OR REPLACE FUNCTION(对于函数)语句来创建子程序。
  • 调用:在PL/SQL代码块、触发器、其他子程序或应用程序中,通过指定子程序的名称和必要的参数(如果有)来调用子程序。

六、示例

6.1 以下是一个简单的Oracle过程示例,用于向表中插入一行数据:
CREATE OR REPLACE PROCEDURE AddEmployee(p_employee_id IN NUMBER,p_employee_name IN VARCHAR2,p_hire_date IN DATE
) AS
BEGININSERT INTO employees (employee_id, employee_name, hire_date)VALUES (p_employee_id, p_employee_name, p_hire_date);COMMIT;
EXCEPTIONWHEN OTHERS THENROLLBACK;RAISE_APPLICATION_ERROR(-20001, 'An error occurred while inserting employee.');
END AddEmployee;

在这个示例中,AddEmployee过程接受三个参数:员工ID(p_employee_id)、员工姓名(p_employee_name)和雇佣日期(p_hire_date)。它执行一个INSERT语句将数据插入到employees表中,并在成功插入后提交事务。如果在插入过程中发生任何异常,它将回滚事务并抛出一个应用程序错误。

6.2 声明、定义和调用简单的PL/SQL过程

Declaring, Defining, and Invoking a Simple PL/SQL Procedure

In this example, an anonymous block simultaneously declares and defines a procedure and invokes it three times. The third invocation raises the exception that the exception-handling part of the procedure handles.

DECLAREfirst_name employees.first_name%TYPE;last_name  employees.last_name%TYPE;email      employees.email%TYPE;employer   VARCHAR2(8) := 'AcmeCorp';-- Declare and define procedurePROCEDURE create_email (  -- Subprogram heading beginsname1   VARCHAR2,name2   VARCHAR2,company VARCHAR2)                         -- Subprogram heading endsIS-- Declarative part beginserror_message VARCHAR2(30) := 'Email address is too long.';BEGIN                     -- Executable part beginsemail := name1 || '.' || name2 || '@' || company;EXCEPTION                      -- Exception-handling part beginsWHEN VALUE_ERROR THENDBMS_OUTPUT.PUT_LINE(error_message);END create_email;BEGINfirst_name := 'John';last_name  := 'Doe';create_email(first_name, last_name, employer);  -- invocationDBMS_OUTPUT.PUT_LINE ('With first name first, email is: ' || email);create_email(last_name, first_name, employer);  -- invocationDBMS_OUTPUT.PUT_LINE ('With last name first, email is: ' || email);first_name := 'Elizabeth';last_name  := 'MacDonald';create_email(first_name, last_name, employer);  -- invocation
END;
/

Result:

With first name first, email is: John.Doe@AcmeCorp
With last name first, email is: Doe.John@AcmeCorp
Email address is too long.PL/SQL procedure successfully completed.
6.3 声明、定义和调用简单的PL/SQL函数

Declaring, Defining, and Invoking a Simple PL/SQL Function
In this example, an anonymous block simultaneously declares and defines a function and invokes it.

DECLARE-- Declare and define functionFUNCTION square (original NUMBER)   -- parameter listRETURN NUMBER                     -- RETURN clauseAS-- Declarative part beginsoriginal_squared NUMBER;BEGIN                               -- Executable part beginsoriginal_squared := original * original;RETURN original_squared;          -- RETURN statementEND;
BEGINDBMS_OUTPUT.PUT_LINE(square(100));  -- invocation
END;
/
-- Result
10000PL/SQL procedure successfully completed.
6.4 函数中RETURN语句后恢复执行

Execution Resumes After RETURN Statement in Function

DECLAREx INTEGER;FUNCTION f (n INTEGER)RETURN INTEGERISBEGINRETURN (n*n);END;BEGINDBMS_OUTPUT.PUT_LINE ('f returns ' || f(2) || '. Execution returns here (1).');x := f(2);DBMS_OUTPUT.PUT_LINE('Execution returns here (2).'|| f(x));
END;
/
-- Result
f returns 4. Execution returns here (1).
Execution returns here (2).16PL/SQL procedure successfully completed.
6.5 每个执行路径都指向RETURN语句的函数

Function Where Every Execution Path Leads to RETURN Statement

CREATE OR REPLACE FUNCTION f (n INTEGER)RETURN INTEGERAUTHID DEFINER
IS
BEGINIF n = 0 THENRETURN 1;ELSIF n = 1 THENRETURN n;ELSERETURN n*n;END IF;
END;
/
BEGINFOR i IN 0 .. 3 LOOPDBMS_OUTPUT.PUT_LINE('f(' || i || ') = ' || f(i));END LOOP;
END;
/
-- Result
f(0) = 1
f(1) = 1
f(2) = 4
f(3) = 9PL/SQL procedure successfully completed.
6.6 程序中返回声明后恢复执行

Execution Resumes After RETURN Statement in Procedure

DECLAREPROCEDURE p ISBEGINDBMS_OUTPUT.PUT_LINE('Inside p');RETURN;DBMS_OUTPUT.PUT_LINE('Unreachable statement.');END;
BEGINp;DBMS_OUTPUT.PUT_LINE('Control returns here.');
END;
/
-- Result
Inside p
Control returns here.PL/SQL procedure successfully completed.
6.7 形式参数和实际参数

Formal Parameters and Actual Parameters

DECLAREemp_num NUMBER(6) := 120;bonus   NUMBER(6) := 100;merit   NUMBER(4) := 50;PROCEDURE raise_salary (emp_id NUMBER,  -- formal parameteramount NUMBER   -- formal parameter) ISBEGINUPDATE employeesSET salary = salary + amount  -- reference to formal parameterWHERE employee_id = emp_id;   -- reference to formal parameterEND raise_salary;BEGINraise_salary(emp_num, bonus);          -- actual parameters/* raise_salary runs this statement:UPDATE employeesSET salary = salary + 100WHERE employee_id = 120;       */raise_salary(emp_num, merit + bonus);  -- actual parameters/* raise_salary runs this statement:UPDATE employeesSET salary = salary + 150WHERE employee_id = 120;       */
END;
/
6.8 实际参数和返回值仅继承子类型的范围

Actual Parameter and Return Value Inherit Only Range From Subtype

DECLAREFUNCTION test (p INTEGER) RETURN INTEGER ISBEGINDBMS_OUTPUT.PUT_LINE('p = ' || p);RETURN p;END test;BEGINDBMS_OUTPUT.PUT_LINE('test(p) = ' || test(0.66));
END;
/
-- Result
p = .66
test(p) = .66PL/SQL procedure successfully completed.
6.9 函数隐式地将形式参数转换为受约束的子类型

Function Implicitly Converts Formal Parameter to Constrained Subtype

DECLAREFUNCTION test (p NUMBER) RETURN NUMBER ISq INTEGER := p;  -- Implicitly converts p to INTEGERBEGINDBMS_OUTPUT.PUT_LINE('p = ' || q);  -- Display q, not pRETURN q;                           -- Return q, not pEND test;BEGINDBMS_OUTPUT.PUT_LINE('test(p) = ' || test(0.66));
END;
/
-- Result
p = 1
test(p) = 1PL/SQL procedure successfully completed.

七、总结

Oracle Subprogram是Oracle数据库中强大的编程结构,它们通过封装复杂的业务逻辑、提高代码重用性和维护性,在数据库应用程序开发中发挥着重要作用。

这篇关于Oracle Subprogram即Oracle子程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092087

相关文章

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.

查看Oracle数据库中UNDO表空间的使用情况(最新推荐)

《查看Oracle数据库中UNDO表空间的使用情况(最新推荐)》Oracle数据库中查看UNDO表空间使用情况的4种方法:DBA_TABLESPACES和DBA_DATA_FILES提供基本信息,V$... 目录1. 通过 DBjavascriptA_TABLESPACES 和 DBA_DATA_FILES

Oracle登录时忘记用户名或密码该如何解决

《Oracle登录时忘记用户名或密码该如何解决》:本文主要介绍如何在Oracle12c中忘记用户名和密码时找回或重置用户账户信息,文中通过代码介绍的非常详细,对同样遇到这个问题的同学具有一定的参... 目录一、忘记账户:二、忘记密码:三、详细情况情况 1:1.1. 登录到数据库1.2. 查看当前用户信息1.

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

PLsql Oracle 下载安装图文过程详解

《PLsqlOracle下载安装图文过程详解》PL/SQLDeveloper是一款用于开发Oracle数据库的集成开发环境,可以通过官网下载安装配置,并通过配置tnsnames.ora文件及环境变... 目录一、PL/SQL Developer 简介二、PL/SQL Developer 安装及配置详解1.下

oracle如何连接登陆SYS账号

《oracle如何连接登陆SYS账号》在Navicat12中连接Oracle11g的SYS用户时,如果设置了新密码但连接失败,可能是因为需要以SYSDBA或SYSOPER角色连接,解决方法是确保在连接... 目录oracle连接登陆NmOtMSYS账号工具问题解决SYS用户总结oracle连接登陆SYS账号

Oracle数据库如何切换登录用户(system和sys)

《Oracle数据库如何切换登录用户(system和sys)》文章介绍了如何使用SQL*Plus工具登录Oracle数据库的system用户,包括打开登录入口、输入用户名和口令、以及切换到sys用户的... 目录打开登录入口登录system用户总结打开登录入口win+R打开运行对话框,输php入:sqlp

查询Oracle数据库表是否被锁的实现方式

《查询Oracle数据库表是否被锁的实现方式》本文介绍了查询Oracle数据库表是否被锁的方法,包括查询锁表的会话、人员信息,根据object_id查询表名,以及根据会话ID查询和停止本地进程,同时,... 目录查询oracle数据库表是否被锁1、查询锁表的会话、人员等信息2、根据 object_id查询被

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

数据库oracle用户密码过期查询及解决方案

《数据库oracle用户密码过期查询及解决方案》:本文主要介绍如何处理ORACLE数据库用户密码过期和修改密码期限的问题,包括创建用户、赋予权限、修改密码、解锁用户和设置密码期限,文中通过代码介绍... 目录前言一、创建用户、赋予权限、修改密码、解锁用户和设置期限二、查询用户密码期限和过期后的修改1.查询用