PLSQL程序块中的无名块

news/2024/11/15 4:36:09/

文章目录

  • PLsql ---过程化语言
  • 程序块:
    • 无名块
      • 变量
        • 利用 select into 语句给变量赋值
      • 打印输出
      • 手动输入
        • 变量类型
          • 引用型变量类型
            • %TYPE
            • %ROWTYPE
          • 记录型变量类型
    • 在程序块下的增删改
      • RETURNING INTO
        • 增加数据
        • 修改数据
        • 删除数据

PLsql —过程化语言

程序块
plsql是Oracle默认的核心语言
是SQL的进阶。
plsql的核心是循环 判断 变量

程序块:

无名块

没有名字,只能执行一次,不能保存
无名块的结构

DECLARE       --1.声明部分(可选)--声明变量,变量类型,游标
BEGIN         --2.执行部分(核心)--能直接使用dml语句--能直接使用tcl语句(commit,rollback)--可以使用select into 语句--不能直接使用ddl语句,可以通过动态sql来实现ddl语句--循环,判断EXCEPTION   --3.异常处理部分(可选)
END;          --4.结束部分 

变量

.
变量是用来接受可变动的值的
声明变量:

DECLARE变量名1 变量类型;变量名2 变量类型;	--程序块中,每完成一句话都要有分号
BEGIN
END;

给变量赋值:
1.在BEGIN后面用 赋值符号 := 给变量赋值
2.在DECLARE后面用赋值符号 := 给变量赋值
例题,打印输出你好CSDN
3.利用 select into 语句给变量赋值

DECLAREV_a varchar2(20);V_b varchar2(20) :='HELLO www'
BEGIN V_a :='你好CSDN';dbms_output.put_line(V_a);dbms_output.put_line(V_b);
END;

在这里插入图片描述

练习:打印输出hello world

DECLAREV_hellow varchar2(20);
BEGIN
dbms_output.put_line(V_hellow);
END;

变量名命名规范:
1.要见名知意
2.必须以字母开头,不要用除了_以外的特殊符号

利用 select into 语句给变量赋值
DECLARE 变量1 变量类型;
BEGINSELECT 列名1 INTO 变量1 FROM 表名 WHERE 条件--将SQL查询语句的结果交给变量,注意结果只能是一行结果--变量的个数,顺序,属性要和列一致
END;

例题:打印输出7788的员工姓名和岗位

DECLARE E_name varchar2(20);E_job varchar2(20);
BEGINSELECT ename,jobINTO E_name,E_jobFROM empwhere empno = 7788;dbms_output.put_line(E_name||E_job);
END;

练习:
1.打印输出10号部门平均工资

DECLARE avg_sal NUMBER;
BEGIN SELECT AVG(sal) INTO avg_sal FROM emp WHERE deptno = 10 GROUP BY deptno;dbms_output.put_line(avg_sal);
END;

2.打印输出7788 的员工的姓名岗位薪资部门编号部门名称以及对应的部门平均工资

DECLAREE_name VARCHAR2(20);E_job VARCHAR2(20);E_sal NUMBER;E_deptno NUMBER;E_D_name VARCHAR2(20);E_D_avgsal NUMBER;
BEGIN SELECT A.ENAME, A.JOB, A.SAL, A.DEPTNO, B.DNAME, C.AINTO E_NAME, E_JOB, E_SAL, E_DEPTNO, E_D_NAME, E_D_AVGSALFROM EMP ALEFT JOIN DEPT BON A.DEPTNO = B.DEPTNOLEFT JOIN (SELECT AVG(SAL) A, DEPTNO FROM EMP GROUP BY DEPTNO) CON A.DEPTNO = C.DEPTNOWHERE a.empno = 7788;dbms_output.put_line(E_NAME|| E_JOB||E_SAL||E_DEPTNO||E_D_NAME|| E_D_AVGSAL);
END;

打印输出

1.换行输出:

dbms_output.put_line(1个参数)

2.不换行输出:

dbms_output.put(1个参数)

注意:不换行输出结果后面一定要跟一个换行输出

手动输入

&
例题:手动输入一个员工编号 输出该员工姓名

DELCAREV_ename varchar2(20);V_empno number :'&请输入';      --最好加上单引号--提示词不能一样
BEGIN END;

练习:输入一个部门编号返回该部门的工资最高的员工的姓名

DECLAREV_NAME VARCHAR2(20);D_deptno NUMBER :='&请输入';
BEGINSELECT ENAMEINTO V_NAMEFROM EMPWHERE SAL = (SELECT MAX(SAL) FROM EMP WHERE DEPTNO = D_DEPTNO) AND deptno = D_DEPTNO;
dbms_output.put_line(V_NAME);
END;

练习:输入一个员工编号,打印输入该员工所在部门平均工资以及该员工姓名和岗位以及部门名称

DECLAREV_empno NUMBER :='&请输入';V_avgsal NUMBER;V_ename VARCHAR2(20);V_job VARCHAR2(20);V_dname VARCHAR(20);
BEGINSELECT c.al,a.ename,a.job,b.dname INTO V_avgsal,V_ename,V_job,V_dname FROM EMP ALEFT JOIN DEPT BON A.DEPTNO = B.DEPTNOLEFT JOIN (SELECT AVG(SAL) Al, DEPTNO FROM EMP GROUP BY DEPTNO) CON A.DEPTNO = C.DEPTNOWHERE empno = V_empno;dbms_output.put_line(V_avgsal||'-'||V_ename||'-'||V_job||'-'||V_dname);      
END;
变量类型
引用型变量类型
%TYPE

是一个引用型变量类型,可以引用某张表的某个列的属性,也可以引用已经定义好的变量类型
优点:
1.可以不用知道引用的列的属性
2.可以跟随引用的列的属性变化而变化。
例题:
查询7788员工的姓名,岗位,薪资,入职日期以及部门编号

DECLARE V_ename emp.ename%TYPE;      --引用emp表的ename字段的属性  表名.列名%TYPEV_job emp,job%TYPE;V_sal emp.sal%TYPE;V_hiredate emp.hiredate%TYPE;V_deptno V_sal%TYPE          --引用已经定义好的变量类型,变量%TYPE
BEGINselect ename,job,sal,hiredate,deptno into V_ename,V_job,V_sal,V_hiredate,V_deptnofrom emp where empno =7788;dbms_output.put_line(...)
END;

练习:输入一个员工编号打印输出该员工的员工信息以及该员工对应的工资等级

DECLAREV_empno NUMBER:='&请输入';V_ename emp.ename%TYPE;V_job emp.job%TYPE;V_hiredate emp.hiredate%TYPE;V_sal emp.sal%TYPE;V_comm emp.comm%TYPE;V_deptno emp.deptno%TYPE;V_MGR emp.MGR%TYPE;V_grade salgrade.grade%TYPE;BEGINSELECT A.ENAME, A.JOB, A.HIREDATE, A.SAL, A.COMM, A.DEPTNO, A.MGR, B.GRADEINTO V_ENAME,V_JOB,V_HIREDATE,V_SAL,V_COMM,V_DEPTNO,V_MGR,V_GRADEFROM EMP ALEFT JOIN SALGRADE BON A.SAL BETWEEN B.LOSAL AND B.HISALWHERE a.empno = V_empno;
dbms_output.put_line( V_ENAME||'-'||V_JOB||'-'||V_HIREDATE||'-'||V_SAL||'-'||V_COMM||'-'||V_DEPTNO||'-'||V_MGR||'-'||V_GRADE);      
END;
%ROWTYPE

是一个引用型变量类型,可以引用每张表的一行的字段属性
优点:
1.可以不用知道引用的列的属性
2.可以跟随引用的列的属性变化而变化。
例题:查询7788号员工的姓名行尾薪资部门编号以及入职日期

DECLAREV_a emp%ROWTYPE;         ---引用emp表一行的字段属性--表名%ROWTYPE--V_a   是一个复合变量,很多小变量的集合,此时包含了V_a.empno,V_a.ename,V_a.job....
BEGINselect ename,job,sal,deptno,hiredateinto V_a.ename,V_a.job,V_a.sal,V_a.deptno,V_a.hiredateFROM empWHERE empno = 7788;
dbms_output.put_line(V_a.ename||V_a.job||V_a.sal||V_a.deptno||V_a.hiredate);
END;

练习:打印输出史密斯的员工信息以及对应的部门平均工资

DECLAREV_A emp%ROWTYPE;V_avgsal emp.sal%TYPE;
BEGIN
SELECT A.EMPNO, A.ENAME, A.JOB, A.HIREDATE, A.SAL, A.COMM, A.DEPTNO, B.AAINTO V_A.EMPNO,V_A.ENAME,V_A.JOB,V_A.HIREDATE,V_A.SAL,V_A.COMM,V_A.DEPTNO,V_AVGSALFROM EMP ALEFT JOIN (SELECT AVG(SAL) AA, DEPTNO FROM EMP GROUP BY DEPTNO) BON A.DEPTNO = B.DEPTNOWHERE A.ENAME = 'SMITH';dbms_output.put_line( V_a.EMPNO||'-'||V_a.ENAME||'-'||V_a.job||'-'||V_a.HIREDATE||'-'||V_a.SAL||'-'||V_a.COMM||'-'||V_a.DEPTNO||'-'||V_avgsal);    
END;
记录型变量类型

RECORD
语法:

DECLARE TYPE 类型名 IS RECODE(变量1 变量类型,变量2 变量类型.....);   --1.声明类型,复合类型变量 类型名                                               --2.声明变量  复合变量, 变量.变量1,变量.变量2,

在这里插入图片描述

练习:输入一个员工编号打印输出该员工的员工信息以及该员工对应的工资等级

DECLARETYPE C1 IS RECORD(E_EMPNO    EMP.EMPNO%TYPE,E_NAME     EMP.ENAME%TYPE,E_JOB      EMP.JOB%TYPE,E_HIREDATE EMP.HIREDATE%TYPE,E_SAL      EMP.SAL%TYPE,E_COMM     EMP.COMM%TYPE,E_DEPTNO   EMP.DEPTNO%TYPE,E_MGR      EMP.MGR%TYPE,E_GRADE    SALGRADE.GRADE%TYPE);V_A     C1;V_EMPNO EMP.EMPNO%TYPE := '&请输入';
BEGINSELECT A.EMPNO,A.ENAME,A.JOB,A.HIREDATE,A.SAL,A.COMM,A.DEPTNO,A.MGR,B.GRADEINTO V_A.E_EMPNO,V_A.E_NAME,V_A.E_JOB,V_A.E_HIREDATE,V_A.E_SAL,V_A.E_COMM,V_A.E_DEPTNO,V_A.E_MGR,V_A.E_GRADEFROM EMP ALEFT JOIN SALGRADE BON SAL BETWEEN LOSAL AND HISALWHERE A.EMPNO = V_EMPNO;DBMS_OUTPUT.PUT_LINE(V_A.E_EMPNO || '-' || V_A.E_NAME || '-' ||V_A.E_JOB || '-' || V_A.E_HIREDATE || '-' ||V_A.E_SAL || '-' || V_A.E_COMM || '-' ||V_A.E_DEPTNO || '-' || V_A.E_MGR || '-' ||V_A.E_GRADE);END;

在程序块下的增删改

RETURNING INTO

增加数据

INSERT

DECLARE
BEGININSERT INTO emp(empno,ename) VALUES(1,'小明');
END;

RETURNING
是将dml语句影响的值返回交给变量
RETURNING 列名1,列名2 … INTO 变量1,变量2

DECLAREV_name varchar2(20);V_empno number;
BEGININSERT INTO emp(empno,ename) VALUES(1,'小明')RETURNING empno,ename into V_empno,V_name;
END;

插入时,RETURNING接受的是插入的值

修改数据
DECLAREV_sal number;
BEGINUPDATE emp set sal = 666 where empno = 7788RETURNING sal into V_sal;
END;

在修改时,RETURNING INTO 是将修改后的值交给变量。

删除数据
DECLAREV_ENAME EMP.ENAME%TYPE;
BEGINDELETE FROM EMP WHERE EMPNO = 1 RETURNING ENAME INTO V_ENAME;
END;

在删除时,RETURNING INTO 是将删除的值交给变量。


http://www.ppmy.cn/news/1430071.html

相关文章

elment-plus 中 table 左对齐

elment-plus 中 table 左对齐 <el-tablev-loading"loading"class"flex-1 !h-auto":data"roleList":header-cell-style"{text-align: left }":row-style"{ height: 55px }":cell-style"{ text-align: left }"&…

Python零基础从小白打怪升级中~~~~~~~Python正则表达式

Python正在表达式 一、re模块中三个函数 1、match函数 re.match 尝试从字符串的起始位置匹配一个模式&#xff0c;匹配成功则返回的是一个匹配对象&#xff08;这个对象包含了我们匹配的信息&#xff09;&#xff0c;如果不是起始位置匹配成功的话&#xff0c;match()返回的…

如何使用docker-compose安装数据可视化应用JSON Crack并实现远程访问

文章目录 1. 在Linux上使用Docker安装JSONCrack2. 安装Cpolar内网穿透工具3. 配置JSON Crack界面公网地址4. 远程访问 JSONCrack 界面5. 固定 JSONCrack公网地址 JSON Crack 是一款免费的开源数据可视化应用程序&#xff0c;能够将 JSON、YAML、XML、CSV 等数据格式可视化为交互…

【Linux】 OpenSSH_7.4p1 升级到 OpenSSH_9.6p1(亲测无问题,建议收藏)

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…

”Python+”多技术融合在蒸散发与植被总初级生产力估算中的实践应用

熟悉蒸散发ET及其组分&#xff08;植被蒸腾Ec、土壤蒸发Es、冠层截留Ei&#xff09;、植被总初级生产力GPP的概念和碳水耦合的基本原理&#xff1b;掌握利用Python与ArcGIS工具进行课程相关的操作&#xff1b;熟练掌握国际上流行的Penman-Monteith模型&#xff0c;并能够应用该…

linux实用C++库之json

目录 1 介绍2 内容 1 介绍 本博客用来记录linux下json库的基本使用。 2 内容 安装&#xff1a; 使用&#xff1a; CMakeLists.txt编写&#xff1a;

【前端Vue】Vue从0基础完整教程第7篇:组件化开发,组件通信【附代码文档】

Vue从0基础到大神学习完整教程完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;vue基本概念&#xff0c;vue-cli的使用&#xff0c;vue的插值表达式&#xff0c;{{ gaga }}&#xff0c;{{ if (obj.age > 18 ) { } }}&#xff0c;vue指令&#xff0c;综合…

【MySQL 数据宝典】【磁盘结构】- 003 双写缓冲区

一、双写缓冲区 ( Doublewrite Buffer Files) 1.1 背景介绍 写失效 (部分页失效) InnoDB的页和操作系统的页大小不一致&#xff0c;InnoDB页大小一般为16K&#xff0c;操作系统页大小为4K&#xff0c;InnoDB的页写入到磁盘时&#xff0c;一个页需要分4次写。如果存储引擎正在…