Oracle中的子程序和程序包

2023-11-19

--存储过程的语法
CREATE [OR REPLACE] PROCEDURE
<procedure name> [(<parameter list>)]
IS|AS
<local variable declaration>
BEGIN
<executable statements>
[EXCEPTION
<exception handlers>]
END <procedure name> ;
--存储过程
CREATE OR REPLACE PROCEDURE
search_emp(emp_no NUMBER)--不写参数类型时,默认为输入参数
AS
emp_name VARCHAR2(20);--声明变量
BEGIN
SELECT ename INTO empname FROM emp WHERE empno =emp_no;
dbms_output.put_line('职员的名字是:'||emp_name);
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('职员的名字未找到!');
END search_emp;
--带输入参数in的存储过程(示例)
CREATE OR REPLACE PROCEDURE
p1(emp_no IN NUMBER)
AS
empname VARCHAR2(20);
BEGIN SELECT ename INTO empname FROM emp WHERE empno =emp_no;
dbms_output.put_line('职员的名字是:'||empname);
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('职员的名字未找到!');
END p1;
--执行带输入参in的存储过程
SET SERVEROUTPUT ON;
execute p1(7788);
--带输出参数out的存储过程
CREATE OR REPLACE PROCEDURE
p2( sal IN NUMBER ,rs OUT VARCHAR2)
IS
maxsal NUMBER(7,2);
minsal NUMBER(7,2);
BEGIN
SELECT MAX(sal),MIN(sal) INTO maxsal,minsal FROM emp;
IF sal >= minsal AND sal<maxsal THEN
rs:='猜的不错,在中间';
ELSE
rs:='猜错了';
END IF;
END p2;
--调用带输出参数out的存储过程
DECLARE
outvalue VARCHAR2(20);
BEGIN
p2(1500,outvalue);
dbms_output.put_line(outvalue);
END;

--带int out参数的存储过程, 交换数据(即是输入参数,又是输出参数)
CREATE OR REPLACE PROCEDURE swap
(
num1 IN OUT NUMBER,
num2 IN OUT NUMBER
)
AS
temp NUMBER;
BEGIN
temp:=num1;
num1:=num2;
num2:=temp;
END swap;
-- 调用带int out参数的存储过程
DECLARE --定义两个变量
num1 NUMBER:=100;
num2 NUMBER:=200;
BEGIN
swap(num1,num2);--调用存储过程
dbms_output.put_line(num1);
dbms_output.put_line(num2);
END;

--授权
GRANT EXECUTE ON find_enm TO martin;
GRANT EXECUTE ON swap TO PUBLIC ;
--删除
DROP PROCEDURE find_emp;

--函数语法
CREATE [OR REPLACE] FUNCTION
<function name> [(param1,param2)]
RETURN <datatype> IS|AS
[local declarations]
BEGIN
Executable Statements;
RETURN result;
EXCEPTION
Exception handlers;
END;
--示例
CREATE OR REPLACE FUNCTION f_hello
RETURN VARCHAR2
AS
BEGIN
RETURN 'hello,您好';
END;
--调用函数
SELECT f_hello FROM dual;
--返回较大值的函数
CREATE OR REPLACE FUNCTION f_max
(
v1 NUMBER,
v2 NUMBER
)
RETURN NUMBER
AS
BEGIN
IF v1>v2 THEN RETURN v1;
ELSE
RETURN v2;
END IF;
END;
--自主事务处理
CREATE TABLE t
(ID number,NAME VARCHAR2(10));
INSERT INTO t VALUES(1,'a');
INSERT INTO t VALUES(2,'b');
INSERT INTO t VALUES(3,'c');
--第一个(子事务)
CREATE OR REPLACE PROCEDURE t_p1
AS
n VARCHAR2(2);
--PRAGMA AUTONOMOUS_TRANSACTION;--声明为自主事务
BEGIN
SELECT NAME INTO n FROM t WHERE ID=1;
dbms_output.put_line(n);--打印id=1的name值
ROLLBACK;
END;
--第二个(主事务)
CREATE OR REPLACE PROCEDURE t_p2
AS
n VARCHAR2(2);
BEGIN
UPDATE t SET NAME ='e' WHERE ID=1;
t_p1();
SELECT NAME INTO n FROM t WHERE ID=1;
dbms_output.put_line(n);--打印id=1的name值
ROLLBACK;
END;
--程序包
--程序包规范(语法)
CREATE [OR REPLACE]
PACKAGE
package_name IS|AS
[Public item declarations]
[Subprogram specification]
END [package_name];
--程序包规范(示例)--只创建空包
CREATE OR REPLACE PACKAGE pack_me IS
PROCEDURE emp_prc(emp_no NUMBER);--存储过程
FUNCTION emp_fun(emp_no NUMBER) RETURN NUMBER;--函数
CURSOR emp_cur(emp_no NUMBER)--游标
RETURN emp%ROWTYPE;
END pack_me;

--程序包主体(语法)
CREATE [OR REPLACE] PACKAGE BODY package_name IS|AS
[Private item declarations]
[Subprogram bodies]
[BEGIN
Initialization]
END [package_name];
--程序包主体(示例)
CREATE OR REPLACE PACKAGE BODY pack_me AS
--r emp % ROWTYPE;--此处定义的变量为私有的
--实现存储过程
PROCEDURE emp_prc(emp_no NUMBER)IS
empname VARCHAR2(20);
BEGIN
SELECT ename INTO empname FROM emp WHERE empno =emp_no;
dbms_output.put_line('职员的名字是:'||empname);
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('职员的名字未找到!');
END emp_prc;
--实现函数(调用时需定义变量来接收)
FUNCTION emp_fun(empno NUMBER) RETURN NUMBER IS
tempsal NUMBER;
BEGIN
SELECT sal INTO temsal FROM emp WHERE empno=emp_no;
RETURN tempsal;
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('职员的名字未找到!');
END emp_fun;
--实现游标
CURSOR emp_cur(emp_no NUMBER)
RETURN emp%ROWTYPE AS
SELECT * FROM emp WHERE empno = emp_no;
--为调用游标而新一个存储过程
PROCEDURE ord_pro(vcode VARCHAR2) IS
or_rec emp%ROWTYPE;
BEGIN
OPEN emp_cur(vcode);
LOOP
FETCH emp_cur INTO or_rec;
EXIT WHEN emp_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LIne('返回的值为' || or_rec.ename);
END LOOP;
END ord_pro;
END pack_me;
--程序包的调用(示例)
EXECUTE pack_me.

--在同一个包中创建一个游标和一个存储过程,
--在包内利用存储过程来调用游标
---------------------------------------------------------
--创建包中的游标规范
CREATE OR REPLACE PACKAGE pack_t AS
CURSOR emp_cur(emp_no1 NUMBER )
RETURN emp%ROWTYPE ; --定义带参游标
PROCEDURE emp_pro(emp_no2 NUMBER);
END pack_t; --定义存储过程
--创建包中的游标主体
CREATE OR REPLACE PACKAGE BODY pack_t AS
--实现游标
CURSOR emp_cur(emp_no1 NUMBER )
RETURN emp%ROWTYPE IS--此处返回一行,要返回多行可用 return emp;
SELECT * FROM emp WHERE empno=emp_no1;
--实现存储过程(并调用包中的游标)
PROCEDURE emp_pro(emp_no2 NUMBER) IS
emp_row emp%ROWTYPE;
BEGIN
OPEN pack_t.emp_cur(emp_no2);--打开游标并传参
LOOP
FETCH pack_t.emp_cur INTO emp_row;
EXIT WHEN pack_t.emp_cur%NOTFOUND;
dbms_output.put_line('工号为'||emp_row.empno ||'的姓名:'|| emp_row.ename);
END LOOP;
END emp_pro;
END pack_t;
--调用包中的存储过程(无法直接调用其内部的游标)
execute pack_t.emp_pro(7788);
---------------------------------------------------------


---------------------------------------------------------
--查询所有的视图
SELECT object_name,object_type FROM User_Objects
WHERE object_type IN('PROCEDURE','FUNCTION','PACKAGE');
--查询原代码
SELECT line,text FROM user_source WHERE NAME='SWAP';
--查询包规范(包中的过程,函数 ,游标)
DESC PACK_ME;
---------------------------------------------------------
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle中的子程序和程序包 的相关文章

  • 如何为“%abc%”搜索创建文本索引?

    我想对查询进行索引x like abc 如果我有一个如下表 create table t data varchar 100 我想创建一个索引以便能够有效地执行以下操作 select from t where contains abc 和这个
  • C# 中的 Oracle 连接 - 连接字符串

    我目前正在尝试用 C 构建一个应用程序并将其连接到在 Oracle 11g 中运行的实时数据库 我有以下连接详细信息 Host IP 10 204 1 3 Port 1521 DB Name PROD 我的源代码 string connSt
  • 如何将 XML 转换为 OCI-Lob 对象?

    我有一个 XML 如下
  • 时间:2019-03-17 标签:c#datatypes->oracledatatypes

    我喜欢在 Oracle 数据库中保存不同的 C 数据类型 int decimal double string Guid 有谁有一个表显示要使用哪些 Oracle 数据类型 我找到了一些表格 显示了哪些 c 数据类型可用于不同的 oracle
  • 如何解决 FParsec 错误“组合器‘许多’已应用于解析器,该解析器在不消耗...的情况下成功”

    我有一个看起来足够简单的解析器 我将此子解析器添加到末尾以提供有关一般解析错误的信息 因为所有其他子解析器都失败了 Read the rest of a line as an error let readError parse let re
  • 什么是 Oracle 会话?

    我使用的是 Oracle 11g 我正在寻找 Oracle 会话的良好解释 我用谷歌搜索了这个 但奇怪的是 没有一个网站包含任何关于预言机会话是什么的解释 我的具体问题是 1 什么是预言机会话 2 一个连接对象是否总是与一个 oracle
  • 像 Javascript 对象一样循环遍历 F# 记录

    在 javascript 中 我可以使用简单的 for 循环访问对象的每个属性 如下所示 var myObj x 1 y 2 var i sum 0 for i in myObj sum sum myObj i 我想知道我是否可以用 F 做
  • 当 Generic.List.Add 是函数中的最后一个语句并且开启尾调用优化时,性能会受到影响

    我遇到了一个奇怪的性能损失 我将其归结为以下代码
  • Where 子句中的 If 语句

    我正在处理一个在 WHERE 子句中包含 IF 语句的查询 但是 PL SQL Developer 在执行时给出了一些错误 谁能帮我正确的查询吗 这是查询 SELECT t first name t last name t employid
  • ODP.NET 可以重新分发吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Oracle ODP NET 库是否可重新分发 例如 我是否可以简单地将 Oracle DataAccess dll 包含在我的应用程序中
  • F# 静态成员类型约束

    我正在尝试定义一个函数 factorize 它使用类似于 Seq sum 的结构类型约束 需要静态成员 Zero One 和 以便它可以与 int long bigint 等一起使用 似乎无法获得正确的语法 并且无法找到有关该主题的大量资源
  • true 和布尔列表 f# 的长度

    直接使用递归 写一个函数truesAndLength bool list gt int int那 返回列表的长度 在该对的第一个组件中 以及列表的数量 列表中正确的元素 在第二个组件中 你的函数必须只迭代 遍历列表的元素一次 请勿使用 Li
  • Oracle SQL 查询日期格式

    我总是对 ORACLE SQL 查询中的日期格式感到困惑 并花几分钟时间去谷歌 有人可以向我解释当数据库表中有不同格式的日期时解决问题的最简单方法吗 例如 我有一个日期列为 ES DATE 保存的数据为 27 APR 12 11 52 48
  • obj[] 和 string[] 作为参数

    我在用Microsoft FSharp Reflection FSharpValue MakeUnion这需要一个Reflection UnionCaseInfo and an obj 可以为空 作为参数 但是 我得到了Type misma
  • DBMS_SCHEDULER.DROP_JOB 仅当存在时

    我有一个 sql 脚本 在导入转储后必须运行该脚本 该脚本除了执行其他操作外 还执行以下操作 BEGIN remove program SYS DBMS SCHEDULER DROP PROGRAM program name gt STAT
  • 如何在 F# 中进行卷积?

    我想convolve http en wikipedia org wiki Convolution具有离散滤波器的离散信号 信号和滤波器是 F 中的浮点数序列 我能弄清楚如何做到这一点的唯一方法是使用两个嵌套的 for 循环和一个可变数组来
  • 从 CTE 插入

    WITH DTL AS SELECT CMPI CODE CMN CDTY MTRL CMI WT FACTOR CMI CNTRCT RATE PL PRESENT PRICE TRM CODE ROUND NVL PRESENT PRI
  • PLS-00103:遇到符号“CREATE”

    这个包有什么问题 因为它给出了错误 CREATE OR REPLACE PACKAGE PKG SHOW CUST DETAILS AS PROCEDURE SHOW CUST DETAILS myArg VARCHAR2 END PKG
  • Postgresql存储过程中基于会话的全局变量?

    在 Oracle 的 PL SQL 中 我可以使用包定义创建基于会话的全局变量 对于 Postgresql 的 PLpg SQL 这似乎是不可能的 因为没有包 只有独立的过程和函数 以下是 PL SQL 将 g spool key 声明为全
  • 调整 Oracle 数据库以加快启动速度(闪回)

    我正在使用 Oracle 数据库 11 2 我有一个场景 我发出FLASHBACK DATABASE经常 似乎有一个FLASHBACK DATABASECycle 会重新启动数据库实例 大约需要 1 分钟 我的设置花了 7 秒 数据库很小

随机推荐

  • OpenCV机器视觉-识别红绿颜色

    识别红绿颜色 识别车道线 车道线检测 使用opencv来完成一个车道线检测的案例 完成这样的案例我们需要经历哪些步骤呢 我们先来思考一下解决问题的思路 当前情况下 摄像头拍出了很多的东西 例如路边的杂草远方的山 但是在我们自动驾驶的过程中
  • 【华为OD机试真题】补种未成活胡杨(C&C++&java&python&JavaScript&go)100%通过率【2023(B卷)100分】

    补种未成活胡杨 题目描述 近些年来 我国防沙治沙取得显著成果 某沙漠新种植 N 棵胡杨 编号 1 N 排成一排 一个月后 有 M 棵胡杨未能成活 现可补种胡杨 K 棵 请问如何补种 只能补种 不能新种 可以得到最多的连续胡杨树 输入描述 N
  • 【Android】Android ANR产生过程与分析方法

    前言 Android ANR问题一直是比较难解决的问题 一来它比较难以复现 二来复现后也不太好分析 这篇文章梳理一下ANR产生的过程以及出现ANR拿到日志文件如何定位原因 其实关于ANR线上监控也是比较棘手的 看了这篇文章我们再去看一些AN
  • linux内存调节之CMA

    本文贴代码过头了 以后想起来再优化一下吧 目录 概述 数据结构 构建初始化 DTS CONFIG DMA CMA 页表与物理页初始化 分配器激活 分配器使用 CMA部署 实战 概述 CMA Contiguous Memory Allocat
  • 小松的STM32教程(13)—— 驱动外部内存24C02

    预备 学习目标 概述 24cxx c include 24cxx h include delay h include delay h void IIC Init void GPIO InitTypeDef GPIO InitStructur
  • 数据结构之图的两种遍历实现(C语言版)

    上一期文章分享完了图的两种遍历方式 也是两种很重要的算法 DFS和BFS 这两种算法的应用和重要性我就不多说了 内行的人懂的都懂 今天这文章重要就是来上机实现这两种算法 又由于这两种算法都可以由邻接矩阵和邻接表来表示 博主分享的代码都是上机
  • pytorch c10.dll找不到

    import torch optim as optim File D Python38 lib site packages torch init py line 135 in
  • Matlab 编辑器框与命令行框视图分开两个窗口

    之前不知道怎么弄的 将matlab编辑器视图和命令行视图变成了两个窗口 效果如下图 这样调试代码我很不适应 点了好久才发现这叫停靠 点击编辑器窗口右上角 选择停靠 就能将编辑器窗口与命令行窗口在同一界面上
  • EduCoder_web实训作业--文本层次语义元素

    第一关 A D B B 第二关 strong 重要通知 strong
  • php GD库的使用

    两大功能 自己画 对于原有图片改变 PHP中GD库的使用 PHP 不仅限于只产生 HTML 的输出 还可以创建及操作多种不同格式的图像文件 PHP提供了一些内置的图像信息函数 也可以使用GD函数库创建新图像或处理已有的图像 目前GD2库支持
  • Java读取文件-BufferedReader/FileReader/InputStreamReader/FileInputStream的关系和区别

    一 Java读取和存储文件数据流 Java读取文件 实际是将文件中的字节流转换成字符流输出到屏幕的过程 这里面涉及到两个类 InputStreamReader和OutputStreamWriter InputStreamReader 将字节
  • 人工智能-基于U^2-Net的肖像画生成算法

    算法总体是在去年提出的U 2 Net remove background 的基础上实现了人物肖像的生成 并且较好地将细节复刻了下来 论文地址 https arxiv org pdf 2005 09007 pdf GitHub项目 https
  • Opencv图像增强算法(对比度增强)-opencv

    由于项目需要 这几天找了网上一个基于opencv的图像对比度增强算法的博客 但算法发布的日期太过久远了 2012年的代码放到现在很多类和类方法已经不再适用于新版本的opencv库了 所以我花了点时间重写了一下 并加入一些个人对于算法的理解与
  • Embedded image missed after moving page to another space in Confluence

    There is a resolution https confluence atlassian com display CONFKB Resolve Missing Attachments in Confluence The issue
  • 如何用递归解决n皇后问题?

    问题描述 在n n的棋盘中摆放n个皇后 要求每个皇后不攻击 输出所有的解 输入 一个正整数n 输出 所有的解 例如 输入 4 输出 2 4 1 3 输出的第1个数的数值x表示 该皇后放在第一行的第x列 3 1 4 2 include
  • PL2303HXA自2012已停产,请联系供货商的解决办法

    一 概述 PL2303 是Prolific 公司生产的一种高度集成的接口转换器 可提供一个RS232 全双工异步串行通信装置与USB 功能接口便利连接的解决方案 PL2303具有多个历史版本 早期的版本是PL2303HX 近年有PL2303
  • 掉电无法启动数据库问题解决

    由于突然掉电 造成客户在windows平台上10 2 0 1数据库无法驱动 以下是具体解决步骤 一 定位故障问题 1 启动数据库 查看错误 SQL gt startup ora 01113 file 1 needs media recove
  • 文献管理软件工具讲解-------阿冬专栏!!!

    一 Endnote Mendeley Zotero NoteExpress 和 NoteFirst 这些文献管理软件从功能上各有特色 网上的评论文章也不少 我自己的的使用体验 如下 A 功能方面 在导入中文文献数据的准确性上 Endnote
  • Python手册

    前言 Python编程语言可以很好地协调一些看起来似乎很明显的矛盾 Python编程语言格式优雅并注重实效 简单而且功能强大 非常高层但是并不妨碍用户对底层的比特 bit 和字节 Byte 的处理 Python编程语言适合于编程新手 对Py
  • Oracle中的子程序和程序包

    存储过程的语法 CREATE OR REPLACE PROCEDURE