代码编织梦想

目录

引言

PL/SQL函数

1、语法 

2、实例

3、函数的调用

4、参数默认值 

5、其他实例


引言

        过程和函数(另外还有包与触发器)统称为PL/SQL子程序,是命名的PL/SQL块。被编译后存储在数据库中,以备执行,因此,其它PL/SQL块可以按名称来使用他们。过程和函数通过输入、输出参数或输入/输出参数与其调用者交换信息。过程和函数的唯一区别是函数总向调用者返回数据,而过程则不返回数据。

PL/SQL函数

        PL/SQL函数是返回值的PL / SQL块或方法,因此它可以在赋值的右侧使用。例:

n_value := to_number('123.45'); 

由于函数返回一个值,因此也可以在SQL语句中使用它,例:

select to_number('1') from dual;

1、语法 

CREATE [OR REPLACE] FUNCTION <function_name> [(
<parameter_name_1> [IN | OUT | IN OUT] <parameter_data_type_1> [DEFAULT value_1],
<parameter_name_2> [IN | OUT | IN OUT] <parameter_data_type_2> [DEFAULT value_2],
...
<parameter_name_N> [IN | OUT | IN OUT] <parameter_data_type_N> [DEFAULT value_N] )]
RETURN <return_data_type>
IS
    -- 类型.变量的声明部分
BEGIN
    -- 执行部分
    return <return_data_type>;
EXCEPTION
    -- 异常处理部分
END function_name;
/
  • <function_name>是函数的名称;
  • <parameter_name>是要传递的参数的名称,参数模式有[IN|OUT|IN OUT]三种;
  • <parameter_data_type>是相应参数的PL / SQL数据类型; 
  • <return_data_type>是函数完成执行时将返回的值的PL / SQL数据类型。

        一般,只有在确认function_name函数是新函数或是要更新的函数时,才使用OR REPALCE关键字,否则容易删除有用的函数。 

        IN,OUT,IN OUT是形参的模式。若省略,则为IN模式。IN模式的形参只能将实参传递给形参,进入函数内部,只能读不能写,函数返回时实参的值不变。OUT模式的形参会忽略调用时的实参值(或说该形参的初始值总是NULL),但在函数内部可以被读或写,函数返回时形参的值会赋予给实参。IN OUT具有前两种模式的特性,即调用时,实参的值总是传递给形参,结束时,形参的值传递给实参。调用时,对于IN模式的实参可以是常量或变量,但对于OUT和IN OUT模式的实参必须是变量。

2、实例

(1)获取某部门的工资总和:

--获取某部门的工资总和
CREATE OR REPLACE FUNCTION GET_SALARY
(
    N_DEP_NO NUMBER
   ,N_EMP_COUNT OUT NUMBER
)
RETURN NUMBER
IS
    N_SUM_COUNT NUMBER;
BEGIN
    SELECT SUM(EMP_SALARY), COUNT(*) INTO N_SUM_COUNT, N_EMP_COUNT
    FROM EMP WHERE DEP_NO = N_DEP_NO;
    RETURN N_SUM_COUNT;
EXCEPTION
    WHEN NO_DATA_FOUND THEN 
      DBMS_OUTPUT.PUT_LINE('data not found!');
    WHEN OTHERS THEN 
      DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
END GET_SALARY;
/

3、函数的调用

        函数声明时所定义的参数称为形式参数,应用程序调用时为函数传递的参数称为实际参数。应用程序在调用函数时,可以使用以下三种方法向函数传递参数:

  • 位置表示法:

        即在调用时按形参的排列顺序,依次写出实参的名称,而将形参与实参关联起来进行传递。用这种方法进行调用,形参与实参的名称是相互独立,没有关系,强调次序才是重要的。

DECLARE
    V_SUM NUMBER;
    V_NUM NUMBER;
BEGIN
    V_SUM := GET_SALARY(501, V_NUM);
    DBMS_OUTPUT.PUT_LINE('部门号为:501的工资总和:'||V_SUM||',人数为:'||V_NUM);
END;
/
  •  名称表示法:

        即在调用时按形参的名称与实参的名称,写出实参对应的形参,而将形参与实参关联起来进行传递。这种方法,形参与实参的名称是相互独立的,没有关系,名称的对应关系才是最重要的,次序并不重要。

DECLARE
    V_SUM NUMBER;
    V_NUM NUMBER;
BEGIN
    V_SUM := GET_SALARY(N_EMP_COUNT => V_NUM, N_DEP_NO => 501);
    DBMS_OUTPUT.PUT_LINE('部门号为:501的工资总和:'||V_SUM||',人数为:'||V_NUM);
END;
/
  • 组合传递:

        即在调用一个函数时,同时使用位置表示法名称表示法为函数传递参数。采用这种方式传递参数时,使用位置表示法所传递的参数必须放在名称表示法所传递的参数前面。

DECLARE
    V_SUM NUMBER;
    V_NUM NUMBER;
BEGIN
    V_SUM := GET_SALARY(501, N_EMP_COUNT => V_NUM);
    DBMS_OUTPUT.PUT_LINE('部门号为:501的工资总和:'||V_SUM||',人数为:'||V_NUM);
END;
/

        无论采用哪一种参数传递方法,实际参数和形式参数之间的数据传递只有两种方法:传址法和传值法。

        所谓传址法是指在调用函数时,将实际参数的地址指针传递给形式参数,使形式参数和实际参数指向内存中的同一区域,从而实现参数数据的传递。这种方法又称作参照法,即形式参数参照实际参数数据。输入参数均采用传址法传递数据。

        传值法是指将实际参数的数据拷贝到形式参数,而不是传递实际参数的地址。默认时,输出参数和输入/输出参数均采用传值法。在函数调用时,ORACLE将实际参数数据拷贝到输入/输出参数,而当函数正常运行退出时,又将输出形式参数和输入/输出形式参数数据拷贝到实际参数变量中。

4、参数默认值 

        在CREATE OR REPLACE FUNCTION 语句中声明函数参数时可以使用DEFAULT关键字为输入参数指定默认值(不能为输入/输出参数设置默认值)。

CREATE OR REPLACE FUNCTION demo_fun(
    Name VARCHAR2,
    Age INTEGER,
    Sex VARCHAR2 DEFAULT '男')
    RETURN VARCHAR2 
AS
    V_var VARCHAR2(32);
BEGIN
    V_var := name||':'||TO_CHAR(age)||'岁'||sex;
    RETURN v_var;
END DEMO_FUN;
/

DECLARE
    Var VARCHAR(32);
BEGIN
    Var := demo_fun('user1', 30);
    DBMS_OUTPUT.PUT_LINE(var);

    Var := demo_fun('user2', age => 40);
    DBMS_OUTPUT.PUT_LINE(var);

    Var := demo_fun('user3', sex => '女', age => 20);
    DBMS_OUTPUT.PUT_LINE(var);
END;

5、其他实例

(1)以下代码创建一个to_mmssyy_or_null()函数。

CREATE OR REPLACE FUNCTION TO_MMSSYY_OR_NULL (V_DATE IN VARCHAR2)
RETURN DATE IS
BEGIN
    RETURN TO_DATE(V_DATE,'MM/DD/YYYY');
EXCEPTION
    WHEN OTHERS THEN
    RETURN NULL;
END TO_MMSSYY_OR_NULL;
/

(2)调用方式:

-- 第一种方式
SELECT TO_MMSSYY_OR_NULL('01012022') FROM DUAL;

-- 第二种方式
BEGIN
    DBMS_OUTPUT.PUT_LINE(TO_MMSSYY_OR_NULL('01012022'));
END;
/

-- 第三种方式
DECLARE
    V_DATE DATE;
BEGIN
    V_DATE := TO_MMSSYY_OR_NULL('01012022');
    DBMS_OUTPUT.PUT_LINE(TO_MMSSYY_OR_NULL('01012022'));
END;
/
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42051619/article/details/125122978

卷妹带你学数据库---5天冲刺day1_京与旧铺的博客-爱代码爱编程

卷妹带你学数据库—5天冲刺Day1 👩‍💻博客主页:京与旧铺的博客主页 ✨欢迎关注🖱点赞🎀收藏⭐留言✒ 🔮本文由京与旧铺原创,csdn首发! 😘系列专栏:java学习 👕参考网课:尚硅谷 💻首发时间:🎞2022年5月31日🎠 🎨你做三四月的事,八九月就会有答案,一起加油吧 🀄如果觉得博主的文章还不错的话,请三

mysql引入_秦朝胖子得加钱的博客-爱代码爱编程

1 创建配置文件 安装目录创建文件my.ini文件内容port=3306 basedir=/usr/local/mysql datadir=/usr/local/mysql/data 2 数据库基础操作         登录数据库 mysql -uroot -p 2.1 创建数据库(文件夹) create database 数据库名字 DEFAU

3104—ef code记录_zhang_yling的博客-爱代码爱编程

一、基本       1—建立数据库上下文和表实体        使用nuget引入Microsoft.EntityframeworkCore.sqlserver和Microsoft.Entityframeworkcore.tools组件。 Scaffold-DbContext -Force “Server=服务器名;Database=数据库名;uid

python桌面可视化应用利用pymysql连接数据库的实例教程_任聪聪的博客-爱代码爱编程

本篇文章主要讲解python桌面可视化应用利用pymysql连接数据库的实例教程 作者:任聪聪 日期:2022年6月1日 桌面应用的sql连接方式实际上就是把我们的sql账户和信息写在我们的代码中,进行封装,可以对其书写在一个特定的文件中,将其封装并在其他文件中【函数或者服务】进行调用即可。 python链接数据库的方法是很多的,常见的有py

mysql增加外键约束具体方法_shengyin714959的博客-爱代码爱编程

本教程操作环境:windows7系统、mysql8版本、Dell G3电脑。 MySQL 外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。 外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性

mysql 中 in 的用法_乔木晨子的博客-爱代码爱编程

1. select * from student s where s.id in (20,30); 查询id是20或者是30,等同于select * from student s where s.id = 20 or s.id = 30; 2.select * from student s where s.id in (select age fro

关于oracle数据库字符集的选择及乱码情况_三岁funny的博客-爱代码爱编程

关于Oracle数据库字符集的选择及乱码情况 背景: 在项目上,开发人员在安装Oracle数据库时采用的默认的编码集,导致后期正式运行时出现某些生僻字和中文符号. 出现乱码。出现的情况就是某些生僻字或中文符号点一经保存,数据库里面就直接变成了问号 (1)查看数据库字符集设置 select * from nls_database_parameters

sql盲注_extractvalue报错注入_是莱莱鸭的博客-爱代码爱编程

什么是报错注入 这是一种页面响应形式,响应过程如下: 用户1在前台页面输入检索内容------>后台将前台页面上输入的检索内容无加区别的拼成sql语句,送到数据库执行------->数据库将执行的结果无加区别的显示到前台页面上 俩个“无加区别”<-----报错注入存在的基础----->后台对输入输出的合理性没有做检查 也就是说输入进

spark sql 快速入门(第二集)_技术能量站的博客-爱代码爱编程

1. 前言 Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块。 1.1 Spark SQL 的作用 Spark SQL 的一种用途是执行 SQL 查询Spark SQL 也可用于从现有 Hive 安装中读取数据1.2 Hive 和spark SQL 的关系 SparkSQL 的前身是 Sh

kingbase 数据备份与恢复_renren-100的博客-爱代码爱编程

1,逻辑备份恢复 指定模式备份以及恢复 “备份数据” sys_dump -Usystem -pPort dbname -n schemaName -f schema20220603.sql sys_dump -Usystem -p3004 XC1 -n test_schema -f test_schema_20220602.sql “还原数据” ./

mysql学习笔记十一-爱代码爱编程

1. 约束的基本介绍 约束用于确保数据库的数据满足特定的商业规则。 在mysql中,约束包括:not null、unique、primary key 、 foreign key 和 check 5种 2. primary

sql自动生成字段功能实现_sql排序后自动显示字段-爱代码爱编程

背景 最近在维护的一款数据产品,有一个数据推送功能,就是把数据从A数据源同步到B数据源。通过SQL指定A数据源里面的数据表,和字段。 前面有SQL编辑框,可以提交语法无误的SQL。上面截图中的字段,表示期望推送到下游数据

oracle高级数据库复习-爱代码爱编程

考试大纲 文章目录 ==考试大纲====分章考点==第三章、Oracle数据库系统结构图:数据库系统结构内部关系 第四章、数据库设计第五章、数据库存储设置与管理表空间的设置与管理(要记sql语句)