ORACLE数据库 —— PL/SQL知识点2

这篇具有很好参考价值的文章主要介绍了ORACLE数据库 —— PL/SQL知识点2。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ORACLE数据库  PL/SQL语句基础知识点  适合有SQL基础的人群。 禁止转载!

内置函数
字符串函数
    lower(列名|字符串)函数用于返回字符串的小写形式。
        eg.SELECT ename,sal FROM emp WHERE ename=lower('&ename');

    upper(列名|字符串)函数用于返回字符串的大写形式。
        eg.SELECT ename,sal FROM emp WHERE ename=upper('&ename');

    initcap(列名|字符串)函数将单词的首字母大写。
        SELECT initcap('big') FROM dual;

    lpad(字符串,长度,填充字符)函数用于左补全字符串。 
        SELECT lpad('21','6','0') stock_code FROM dual;        //输出  000021
        SELECT lpad('1234567',6,'0') stock_code FROM dual;     //输出  123456 当原字符串的长度大于预期长度时,实际进行的是截取字符串操作。
    
    rpad(字符串,长度,填充字符)函数用于右补全字符串。 
        SELECT rpad('abc', 10, '*') FROM dual;            //输出  abc*******
        SELECT rpad('abcdefg', 6, '*') FROM dual;        //输出  abcdef    截取字符串时,都是从左端开始截取!

    length(列名|字符串)函数用于返回字符串的长度。
        SELECT length('abcde ') FROM dual;            //输出  6
        SELECT length('') FROM dual;                //输出  null
        SELECT length(12.51) FROM dual;            //输出  5
    
    substr(列名|字符串,截取字符串开始位置,[截取长度])函数用于截取字符串。
        SELECT substr('1234567890', 5, 4) FROM dual;        //输出  5678
    
    instr(父字符串, 子字符串, 起始位置, 匹配序号)函数用于获得子字符串在父字符串中出现的位置。
        SELECT instr('big big tiger', 'big') FROM dual;        //输出  1
        SELECT instr('big big tiger', 'big', 2) FROM dual;         //输出  3       以命令该函数从指定位置开始搜索。
        SELECT instr('big big tiger', 'big', 2, 2) FROM dual;    //输出  0     指定是第几次搜索到子字符串

    trim()函数可用于删除首尾空白符。
    ltrim() 函数用于删除字符串左端的空白符。 rtrim()函数用于删除字符串右端空白符。
        SELECT trim('   abc      ') FROM dual;            //输出abc


数学函数
    round(列名|数值,保留小数位)函数用于返回某个数字的四舍五入值。
        SELECT round(2745.173, 2) FROM dual;         //输出2745.17
        SELECT round(2745.173) FROM dual;             //输出2745     默认精确到整数
        SELECT round(2745, -1) FROM dual;             //输出2750    负数将数值精确到小数点之前的位数。
        SELECT round(-15.53, 1), round(-15.55, 1) FROM dual;    //输出-15.5    -15.6

    trunc(列名|数值)函数用于截取部分数字。该函数不对数值做四舍五入处理,而是直接截取。
        SELECT trunc(2745.575, 2) FROM dual;             //输出2745.57
        SELECT trunc(2745.575) FROM dual;            //输出2745
        当保留位数小于0时,表示保留到小数点之前的位数。    //输出2740

    mod(列1|数值1,列2|数值2)函数,第一个参数为被除数,第二个参数为除数。获得两数相除之后的余数。
        SELECT mod(5,2) FROM dual;                //输出1

    floor(列名|数值)函数用于返回小于等于某个数值的最大整数,向下取整。
        SELECT floor(21.897),floor(-21.897) FROM dual;        //输出21    -22
    
    ceil(|列名|数值), 函数将参数向上取整,以获得大于等于该参数的最小整数。
        SELECT ceil(21.897) , ceil(-21.897) FROM dual;        //输出22    -21

    sign(列名|数值)函数返回数字的正负性,若正,返回值为1; 若负,返回值为-1;若0,返回值为0
        SELECT sign(8), sign(-8) , sign(0) FROM dual;         //输出1,-1,0


日期函数
    日期+数字n=日期(n天后的日期)
    日期-数字n=日期(n天前的日期)
    日期1-日期2=n(天)
    
        eg1.查询emp表获得所有员工的雇用年数。
        SELECT ename,sysdate-hiredate FROM emp;

    months_between(日期1,日期2)函数用于获取两个日期所间隔的月数。该函数的返回值是一个实数。
        eg2.查询emp表获得所有员工的雇用年数。
        SELECT empno,hiredate,trunc(months_between(sysdate,hiredate)/12) as 雇佣年限 FROM emp;
    
    add_months(日期,数字)函数将为日期添加特定月份,并获得新的日期。
        SELECT to_char(add_months(sysdate, 20), 'yyyy-mm-dd') result FROM dual;        //返回2023-6-12

    last_day(日期) 该函数获得该月最后一天的日期。
        eg3.查询emp表获得雇用日期是月末倒数第二天的所有员工的信息。
            SELECT empno,hiredate,last_day(hiredate) FROM emp WHERE hiredate = last_day(hiredate)-2;

    to_char(日期|数字|列名,转换格式)函数用于将其他数据类型的数据转换为字符型。
        eg4.查询出所有1987年雇用的员工姓名、职位和薪水。
            SELECT ename,job,sal FROM emp WHERE to_char(hiredate,'yyyy') = '1987';
    
    to_date(字符串,转换格式)函数用于将字符串转换为日期。被转换的字符串必须符合特定的日期格式。转换格式为某种日期格式
        SELECT to_date('12/02/09', 'mm/dd/yy') result FROM dual;        // 返回02-12月-09

    to_number(字符串)函数可以将字符串转换为数值型。
        SELECT to_number('257.90') result FROM dual;            //如果不是数字,ORACLE会报错


通用函数
    nvl(列名,数值)函数用于处理某列的值。    nvl(comm,0)用于处理空值,如果其值不为空,返回comm,如果为空,则返回第二个参数的值0。
    eg5.查询每个雇员的年薪(基本工资+佣金)
        SELECT ename,sal,comm,sal*12+nvl(comm,0) 年薪 FROM emp;

    decode(列名,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)函数用于多值判断。其执行过程类似于解码操作。
    eg6.查询每个雇员的工作岗位中文名称
        SELECT ename, job, decode(job, 'CLERK','办事员','SALESMAN','销售员',
            'MANAGER','经理','ANALYST','分析员','主席') 中文岗位 FROM emp;

Oracle会根据操作符来自动进行数据类型的转换(隐式转换)
    * 字符串到数值。
    * 数值到字符串。
    * 字符串到日期。
    * 日期到字符串。
    eg7. SELECT '123' + 200, '123' || 200 FROM dual;
    eg8. SELECT months_between(sysdate , '01-1月-20') result1, '今天的日期是' || sysdate result2 FROM dual;

游标
    游标是一种PL/SQL控制结构,用来处理使用select语句从数据库中检索到的多行记录的工具,可以对多行数据逐条进行处理。游标是一个返回数据集的指针。
使用过程:1.声明游标    2.打开游标    3.检索数据    4.关闭游标

游标定义语法:
    CURSOR cursor_name [(parameter[, parameter]…)] [RETURN return_type] IS select statement;

游标的属性:
%FOUND         检验FETCH语句是否指向了记录
%ISOPEN         检查游标当前是否处在打开状态
%NOTFOUND         %FOUND的相反属性
%ROWCOUNT         检测任意给定的时刻,已从游标中获取的记录行数
%BULK_EXCEPTIONS     为批操作或Bulk Collect操作中产生的异常提供相关信息
%BULK_ROWCOUNT     提供Bulk操作过程中更改的行数信息

显式游标的使用方法:
    定义游标
         语法:CURSOR cur_name IS ..
    打开游标
         语法:OPEN cur_name
    取值游标
        语法: FETCH cur_name INTO variable_list
             variable_list必须与从游标提取的结果集类型相同
    关闭游标
         语法:CLOSE cur_name
             关闭游标后,所有资源都将被释放,且不能在此被打开。

eg9.使用游标查询每位雇员的编号和姓名
DECLARE
    CURSOR curTest IS SELECT * FROM emp;
    recEMP emp%ROWTYPE;
BEGIN
    OPEN curTest;
    FETCH curTest INTO recEMP;
    WHILE curTest%FOUND LOOP
        DBMS_OUTPUT.PUT_LINE(recEmp.empno||'号员工的姓名是'||recEmp.ename);
        FETCH curTest INTO recEMP;
    END LOOP;
    CLOSE curTest;
END;
/

eg10.(带参数) 使用游标查询某部门每位雇员姓名
DECLARE
    CURSOR cur_with_Parammm(did number) IS SELECT * FROM emp WHERE deptno = did;
    recemp emp%rowtype
BEGIN
    open cur_with_Parammm(10);
    FETCH cur_with_Parammm INTO recemp;
    IF cur_with_Parammm%NOTFOUND = true THEN
        dbms_output.put_line('该部门不存在');
    ELSE 
        LOOP
            dbms_output.put_line(recemp.ename||'是部门的员工。');
            FETCH cur_with_Parammm INTO recemp;
            EXIT WHEN cur_with_Parammm%NOTFOUND;
        END LOOP;
    dbms_output.put_line('部门共有员工'|| cur_with_Param%ROWCOUNT ||'名');
    END IF;
    CLOSE cur_with_Parammm;
END;
/

eg11.(带参数) 使用循环游标查询每位雇员的姓名            //使用for循环时,自动打开游标,而无需使用open语句;PL/SQL会自动对变量进行隐式声明;当循环结束后,游标会自动关闭。
DECLARE
    CURSOR cur_with_param(did number) ISSELECT * from emp where deptno=did;
BEGIN
     FOR recEmp IN cur_with_param(10) LOOP
         DBMS_OUTPUT.PUT_LINE(recEmp.ename||'是部门的员工。');
    END LOOP;
END;
/


使用游标更新表中数据
    使用FOR UPDATE子句,对要修改或删除的数据加行级锁。
    eg12.更新newemp表部门10的员工工资,使其工资增加100
        DEECLARE
            CURSOR salcur(v_deptno number) IS 
            SELECT sal FROM emp WHERE deptno = v_deptno  FOR UPDATE;
        BEGIN
            FOR vemp in salcur(10) LOOP
                UPDATE newemp SET sal = sal+100 WHERE CURRENT OF salcur;
            END LOOP
        END;
        /
    

游标变量
显示游标用于命名一个工作区域,其中保存多行查询的信息,而且该游标始终指向工作区域的内容。

创建游标变量:
第一步:创建一个引用的游标类型;
第二步:必须声明一个具有引用游标类型的游标变量。
通用的语法如下:
    TYPE cursortype_name is REF CURSOR [RETURN     return_type];
    Cursorvarname cursortype_name;
打开游标变量:
    OPEN Cursorvarname FOR select statement;

eg13.查询输出emp表部门10的员工工资和dept表的所有信息
    DECLARE
        TYPE v_cursortype is REF CURSOR;
        mycursort v_cursortype;
        recemp emp%rowtype;
        recdept dept%rowtype;
    BEGIN
        OPEN mycursort FOR SELECT * FROM emp WHERE deptno = 10;
        FETCH mycursort INTO recemp;
        WHILE mycursort%FOUND LOOP
             dbms_output.put_line('部门10的员工'||recemp.ename||'工资为: '|| recemp.sal);
             FETCH mycursort INTO recemp;
         END LOOP;
         OPEN mycursort FOR SELECT * FROM dept;
         FETCH mycursort INTO recdept;
         WHILE mycursort%FOUND LOOP
            dbms_output.put_line('部门'||recdept.deptno||'坐落于: '|| recdept.loc);
            FETCH mycursort INTO recdept;
        END LOOP;
         CLOSE mycursort;
    END;
    /文章来源地址https://www.toymoban.com/news/detail-480431.html

到了这里,关于ORACLE数据库 —— PL/SQL知识点2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 用PL/SQL Developer连接远程Oracle数据库

    oracle数据库安装教程参考 注意: 第六步中的Oracle基目录中的用户名为中文的话,需要去掉中文部分。然后管理口令一定保存好。 2.打开oracle安装目录(默认在C盘,我的在D盘),找到tnsnames.ora文件 这是oracle客户端所需要的一个文件,通过该文件可以配置数据库的连接地址,

    2024年02月13日
    浏览(45)
  • PL/SQL+cpolar公网访问内网Oracle数据库

    Oracle,是甲骨文公司的一款关系数据库管理系统,它在数据库领域一直处于领先地位。可以说Oracle数据库系统是世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小微机环境。它是一种高效率的、可靠性好的、适应高吞吐量的数据

    2024年02月08日
    浏览(42)
  • 数据库知识点

    索引本质上是一张表,保存了主键与索引字段,在对数据做频繁的查询或排序时,可在某些字段上添加索引,提高检索的的效率,降低IO成本,并可以使用索引列,对数据进行排序,降低排序的成本。盲目的添加索引是不正确的。索引表保存数据占用空间,在对数据进行增删

    2024年02月06日
    浏览(45)
  • 【期末专题】数据库知识点整理

    1.要求:修改表的“价格”列,使其数据类型为decimal(6,2) 语句:alter table BookInfo modify price decimal(6,2); 注意点:修改一个表中已有列的数据类型的语句格式:         alter table 表名 modify 列名 数据类型 2.要求: 语句: 注意点: 创建触发器的语法: create trigger 触发器名   

    2024年02月11日
    浏览(38)
  • 数据库相关理论知识(有目录便于直接锁定相关知识点+期末复习)

    一,数据模型,关系型数据模型,网状模型,层次模型 1. 数据库模型 是用来描述和表示现实世界中的事物、概念以及它们之间的关系的工具, 但是并不是越专业越好,还要平衡它的模型的复杂性、通用性和成本效益等因素 。数据模型按不同的应用层次可以分为 三个层次 ,

    2024年03月16日
    浏览(56)
  • 软考软件设计师 数据库知识点笔记

    了解即可 外模式对应视图 概念模式对应的是数据库管理系统里面的基本表 内模式对应的是数据库里的一些存储文件 上图可直接背下面概念 有内模式跟物理独立性相关,有外模式跟逻辑独立性相关 两级映像其中有一方肯定是模式,如下提d选项 候选码的意思它只能表示那个

    2023年04月13日
    浏览(68)
  • 软考系统架构师知识点集锦九:数据库系统

    2.1.1数据库模式 (1)三级模式:外模式对应视图,模式(也称为概念模式)对应数据库表,内模式对应物理文件。 (2)两层映像:外模式-模式映像,模式-内模式映像;两层映像可以保证数据库中的数据具有较高的逻辑独立性和物理独立性。 (3)物理独立性:即数据库的内模式发生改变时,

    2024年02月07日
    浏览(49)
  • 数据库系统概述——第六章 关系数据理论(知识点复习+练习题)

    🌟 博主: 命运之光 🦄 专栏: 离散数学考前复习(知识点+题) 🍓 专栏: 概率论期末速成(一套卷) 🐳 专栏: 数字电路考前复习 🦚 专栏: 数据库系统概述 ☀️ 博主的其他文章: 点击进入博主的主页​​​​​ 前言: 身为大学生考前复习一定十分痛苦,你有没有过

    2024年02月09日
    浏览(52)
  • 教你如何通过内网穿透轻松实现PL/SQL远程连接Oracle数据库【内网穿透】

    转发自CSDN远程穿透的文章:公网远程连接Oracle数据库【内网穿透】 Oracle,是甲骨文公司的一款关系数据库管理系统,它在数据库领域一直处于领先地位。可以说Oracle数据库系统是世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、

    2024年02月03日
    浏览(59)
  • 【数据库通关之路】 MySQL 全路线学习知识点梳理(下)

    本文是MYSQL零基础小白学习系列的第三篇文章,点此阅读 上一篇文章 文末 包邮随机送《MySQL数据库进阶实战 》 五本 (点击下方目录直达) 目的:主键是一行数据的唯一标识,要求非空且唯一 添加约束: 建完表后添加主键约束: 删除约束: 目的:保存数据时,未指定值则采

    2024年02月04日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包