首页 > 数据库 >5 Oracle PL/SQL 存储过程--函数--包

5 Oracle PL/SQL 存储过程--函数--包

时间:2024-12-17 10:12:14浏览次数:8  
标签:存储 END -- num emp SQL Oracle

一、存储过程

之前写的代码 declare begin end;称为匿名块,没有名称,没有存储在数据库中;
存储过程:Stored Procedure,简称sp、存过,它是一种数据库对象,它遵从PL/SQL基本语法;
语法:
CREATE [OR REPLACE] PROCEDURE 存储过程名[参数1 [IN/OUT]参数类型,参数2 [IN/OUT] 参数类型,...]
IS | AS
声明变量
BEGIN
执行部分
EXCEPTION
异常部门
END [存储过程名];
--写一个PL/SQL,打印员工编号为7788的员工 编号、姓名,工资

CREATE OR REPLACE PROCEDURE pr_print_emp
AS
v_empno NUMBER;
v_ename VARCHAR2(20);
v_sal NUMBER(8,2);
BEGIN
SELECT empno,ename,sal INTO v_empno,v_ename,v_sal FROM emp WHERE empno=7369;
dbms_output.put_line(v_empno||v_ename||v_sal);
END;

SELECT * FROM emp;
---需要注意:存储过程需要先编译,后调用;
---存储过程调用方式:
--1、CALL 存储过程名();--不管存储过程是否有参数都要加()
CALL pr_print_emp();
--2、exec 存储过程名();--这是一个数据库命令,需要在命令行窗口执行,不能在SQL窗口执行;
EXEC pr_print_emp();--如果有打印命令,需要先设置set serveroutput on
--3、在PL/SQL中调用
BEGIN
pr_print_emp;()
END;
--4、browser窗口找到procedures下的pr_print_emp右键test;

---存储过程的删除:
DROP PROCEDURE pr_print_emp;

 

--例题1(有输入参数的):调用存储过程,实现功能:输入员工编号,打印对应员工编号的信息(编号、姓名、工资)
CREATE OR REPLACE PROCEDURE pr_print_emp2(in_num IN NUMBER)--这里注意:1、参数类型不要给长度2、IN 可以省略默认为IN
IS
v_emp_rec emp%ROWTYPE;
BEGIN
SELECT * INTO v_emp_rec FROM emp WHERE empno=in_num;
dbms_output.put_line(v_emp_rec.empno||v_emp_rec.ename);
END;
---注意:我们上节写存储过程,使用的是SQL窗口编写。
---这个SQL窗口有一个问题,如果存储过程写错了,编译存储过程时,不会提示错误在哪。
--这时候还有另外一种方法,在程序窗口中编写;
--我们建议可以先使用SQL窗口编写,编译后如果在brower中看到有红叉号,右键edit在程序窗口中编译找到错误所在并修改;

CALL pr_print_emp2(7788);

例2(有输出参数):调用存储过程实现功能:输入员工编号,打印员工信息(编号姓名工资),同时还要有一个参数接收领导的编号;

CREATE OR REPLACE PROCEDURE pr_print_emp3(in_num IN NUMBER,o_num OUT NUMBER)
IS
v_emp_rec emp%ROWTYPE;
BEGIN
SELECT * INTO v_emp_rec FROM emp WHERE empno=in_num;
o_num:=v_emp_rec.mgr;
END;

DECLARE
v_num NUMBER(8);
BEGIN
pr_print_emp3(7788,v_num);
dbms_output.put_line('7788号员工的领导编号是:'||v_num);
END;

例3(有输入输出参数):上述例2,要用一个参数实现
CREATE OR REPLACE PROCEDURE pr_print_emp4(v_num IN OUT NUMBER)
IS
v_emp_rec emp%ROWTYPE;
BEGIN
SELECT * INTO v_emp_rec FROM emp WHERE empno=v_num;
dbms_output.put_line(v_emp_rec.empno||v_emp_rec.ename);
v_num:=v_emp_rec.mgr;
END;
----调用:
DECLARE
v_num NUMBER(8):=7788;
BEGIN
pr_print_emp4(v_num);
dbms_output.put_line(v_num);
END;

一般在(数据分析、数仓开发)项目中,使用最多的是输入参数,偶有输出参数,即使有输出参数,也是有关存储过程执行状态的输出(0/1之类的),仅此而已。

而输入参数也通常是一个日期,输入一个年份月份等。

 

二、函数 Funciton

是一种数据库对象,遵从PL/SQL基本语法。

语法:

CREATE OR REPLACE FUNCITON 函数名[(参数1 参数类型,参数2 参数类型...)]

RETURN  数据类型

IS | AS

BEGIN

RETURN 结果;
EXCEPTION

END;

调用:1、放在SQL语句中调用
SELECT fun_helo() FROM dual;
2、放在PL/SQL中调用
DECLARE
v_str VARCHAR2(20);
BEGIN
v_str :=fun_helo();
dbms_output.put_line(v_str);
END;
--例题1(无参数):调用函数返回'hello,world!'
CREATE OR REPLACE FUNCTION fun_helo
RETURN VARCHAR2
IS
BEGIN
RETURN 'hello,world!';
END;

--例题2(有参数):写一个翻倍函数,实现功能,输入一数字,返回双倍结果。
CREATE OR REPLACE FUNCTION fun_double(v_num NUMBER)
RETURN NUMBER
IS
v_res NUMBER;
BEGIN
v_res:=v_num*2;
RETURN v_res;
END;

SELECT fun_double(3) FROM dual;

 

三、包 Package和包体 package body

包是一个数据库对象,是一组用于实现功能的函数、存储过程、变量、常量等PL/SQL设计元素的组合
作用类似于收纳盒。

语法:

包:包头声明包里有哪些元素,类似于目录,大概说明包里有什么
CREATE OR REPLACE PACKAGE 包名 IS
PROCEDURE 存储过程名(..);
FUNCTION 函数名(..);
声明变量等..
...
END;

包体:
CREATE OR REPLACE PACKAGE BODY 包名 IS
PROCEDURE 存储过程名(..) IS ...begin ..end;
FUNCTION 函数名(..) RETURN ..IS.. begin..end;
..
..
END;
注意:包头里面有的,包体里面必须有,包头和包体要保持一致。

包的作用:
1、方便管理维护:把实现相同功能的过程和函数放在一起;
2、增加安全性;
3、可以创建私有函数和存储过程,只能被指定的同包内容引用;

 

标签:存储,END,--,num,emp,SQL,Oracle
From: https://www.cnblogs.com/jxlizi/p/18606678

相关文章

  • 鸿蒙Next数据懒加载LazyForEach用法总结
    在鸿蒙Next开发中,LazyForEach提供了高效的数据懒加载机制,适用于处理大量数据的列表展示等场景,可有效提升性能和内存管理。以下是其详细用法总结。一、使用限制容器组件要求:必须在特定容器组件(List、Grid、Swiper、WaterFlow)内使用,且这些组件支持配置cachedCount属性实现按需加......
  • ROS 中仿真 UR 机械臂
    本文参考:UR5机械臂+ROSnoetic+Ubuntu20.04+moveit实物和仿真驱动_little蔡的博客-CSDN博客ROS中仿真UR机械臂 仿真环境:本文使用的Ubantu版本:Ubuntu20.04ros版本:ros-noetic-desktop-full,安装此版本ros无需再安装moveit运动规划库创建工作空:创建工作空间进入工作空间......
  • 在 Windows 下编写 Linux 脚本,传至 Linux 中执行时,会遇到 not found 错误
    在Windows下建立脚本#!/bin/bashechohello传至Linux下执行脚本./test.sh执行出错-bash:./test.sh:Permissiondenied问题原因:未对文件添加可执行权限添加权限chmod+xtest.sh再次执行脚本./test.sh执行出错-bash:./test.sh:/bin/bash^M:badinterpreter:......
  • 常用网站
    C++GraphicsLibrary小熊猫C++XEGE绘图库SimulIDE电路仿真软件Java绘图库,类似XEGEPython绘图库,类似XEGEeasyxDev-C++codeblockswxwidgetswxwidgets练习题知识库宝塔discuz知识库码云MSSQLEGE、EasyX、WindowsGDI......
  • 【工具】类html 字符串转换成html 进行数据解析
    【lxml】【方案一】使用lxml库进行解析,目前使用1fromlxmlimporthtml23#假设这是你的HTML内容4html_content="""5<html>6<head><title>Example</title></head>7<body>8<divid="content"&g......
  • 如何用python批量转换.doc文件为.docx文件
    需要用到的库:pywin32、os 实现效果:把文件夹下的文件1.doc、2.doc、3.doc转化成1.docx、2.docx、3.docx,保存到output文件夹下。代码运行前: 代码运行后:  实现代码: #批量把".doc"文件另存在".docx"文件importosfromwin32comimportclientdefdoc_to_docx(p,......
  • Ubuntu如何下载nvidia驱动和Cuda Toolkit
    Ubuntu如何下载nvidia驱动和CudaToolkit前言‍手快不小心把nvidia​的某个东西删除了,现在不得不全部卸载后再重新安装了。我再也不敢在不确认内容的情况下,确认删除了......‍Note:‍笔者环境为Ubuntu24.04LTS​‍‍目录‍目录Ubuntu如何下载nvidia驱动和Cuda......
  • 最初级的黑客入门教程,可实现简单的黑客基础操作
    黑客守则1、不恶意破坏任何的系统,这样只会给你带来麻烦。恶意破坏他人的软件将导致法律责任,如果你只是使用电脑,那仅为非法使用!注意:千万不要破坏别人的软件或资料!2、不修改任何的系统档,如果你是为了要进入系统而修改它,请在达到目的后将它改回原状。3、不要轻易的将你要ha......
  • RT-DETR融合[ICCV2023]DySample中的上采样模块
    RT-DETR使用教程: RT-DETR使用教程RT-DETR改进汇总贴:RT-DETR更新汇总贴《DySample:LearningtoUpsamplebyLearningtoSample》一、模块介绍    论文链接: https://arxiv.org/abs/2308.15085    代码链接:https://github.com/tiny-smart/dysam......
  • python语言匹配链接下载代码
    importrequestsimportreimportostext=“”“”“”使用正确的正则表达式模式,这里的模式匹配以http或https开头,后面跟着任意字符直到.ebt结尾的字符串pattern=r’(https://res.doc88.com.*?))’ebt_urls=re.findall(pattern,text)#print(ebt_url......