PL/SQL


```sql
DECLARE---声明部分BEGIN---执行部分  ---必选EXCEPTION---异常处理部分
END;/
DECLARE
```sql
BEGINDBMS_OUTPUT.PUT_LINE('HELLO WORLD');DBMS_OUTPUT.PUT('HELLO');
END;
/BEGIN DBMS_OUTPUT.PUT('HELLO');DBMS_OUTPUT.NEW_LINE;DBMS_OUTPUT.PUT('WMJ');DBMS_OUTPUT.NEW_LINE;
END;
/
BEGINDBMS_OUTPUT.PUT_LINE('HELLO ORACLE');DBMS_OUTPUT.PUT_LINE('员工SMITH的工资是800元每月');\
END;
/
BEGINDBMS_OUTPUT.PUT_LINE('员工SMITH的工资是800元每月');
END;

/

```sql
DECLARE
V_NAME1  VARCHAR2(100);
V_NAME2 VARCHAR2(100);
V_NAME3 NUMBER(10);
BEGIN
V_NAME1:='你好,李焕英!';
V_NAME2:='hello';
V_NAME3:='123';DBMS_OUTPUT.PUT_LINE(V_NAME1);DBMS_OUTPUT.PUT_LINE(V_NAME2);DBMS_OUTPUT.PUT_LINE(V_NAME3);
END;/

BEGINDBMS_OUTPUT.PUT_LINE('海绵宝宝:你好,派大星');DBMS_OUTPUT.PUT_LINE('派大星:你好,海绵宝宝');
END;
/BEGINDBMS_OUTPUT.PUT_LINE('    *     *   ');DBMS_OUTPUT.PUT_LINE('  *^^^ * ^^^*   ');DBMS_OUTPUT.PUT_LINE(' *^^^^^^^^^^^*');DBMS_OUTPUT.PUT_LINE('  *^^^^^^^^^*   ');DBMS_OUTPUT.PUT_LINE('    *^^^^^*   ');DBMS_OUTPUT.PUT_LINE('       *   ');
END;
BEGINDBMS_OUTPUT.PUT_LINE('     $$    $$      ');DBMS_OUTPUT.PUT_LINE('  $$     $     $$  ');DBMS_OUTPUT.PUT_LINE('$                 $');DBMS_OUTPUT.PUT_LINE('$                 $');DBMS_OUTPUT.PUT_LINE('  $$           $$  ');DBMS_OUTPUT.PUT_LINE('     $$     $$     ');DBMS_OUTPUT.PUT_LINE('         $         ');
END;

在PL/SQL程序中,DML操作可以直接运行。
DML操作需要在程序中运行COMMIT命令才能自动提交!

SELECT * FROM EMP;CREATE TABLE EMP_0419 AS SELECT * FROM EMP;
---备份表emp_0419
SELECT * FROM EMP_0419;
--查询备份表emp_0419
---DML语句
BEGINDELETE FROM EMP WHERE DEPTNO=10;COMMIT;---清理emp表中10号部门的数据INSERT INTO EMP SELECT * FROM EMP_0419 WHERE DEPTNO=10;COMMIT;---从备份表中把10号部门的数据局恢复UPDATE EMP SET SAL=SAL/2 WHERE DEPTNO=30;COMMIT;---把30号部门的薪资调整为原来的2倍END;
CREATE TABLE EMP1 AS SELECT * FROM EMP;
SELECT * FROM EMP1;
SELECT * FROM EMP  ;SELECT *  FROM EMP_20210330;
MERGE INTO EMP A
USING  EMP_20210330 B
ON(A.EMPNO=B.EMPNO)
WHEN MATCHED THENUPDATESET A.ENAME=B.ENAME,A.JOB=B.JOB,A.MGR=B.MGR,A.HIREDATE=B.HIREDATE,A.SAL=B.SAL,A.COMM=B.COMM,A.DEPTNO=B.DEPTNO
WHEN NOT MATCHED THENINSERT(A.ENAME,A.JOB,A.MGR,A.HIREDATE,A.SAL,A.COMM,A.DEPTNO)VALUES(B.ENAME,B.JOB,B.MGR,B.HIREDATE,B.SAL,B.COMM,B.DEPTNO);

执行部分-DDL操作 在PL/SQL中,DDL不能直接操作,需要借助EXECUTE命令来实现。 EXECUTE IMMEDIATE
‘SQL语句’ ; 其中SQL语句可以是DML语句也可以是DDL语句
PL/SQL程序运行时,ORACLE会首先检查程序的合理性,如若有语法等问题,程序将不予执行。

---DDL语句
BEGINEXECUTE IMMEDIATE 'CREATE TABLE EMP2 AS SELECT * FROM EMP';---备份emp表EXECUTE IMMEDIATE 'TRUNCATE TABLE EMP2';---清空emp表EXECUTE IMMEDIATE 'INSERT INTO EMP2 SELECT * FROM  EMP WHERE DEPTNO =30';---从备份表中恢复数据END;
SELECT * FROM EMP2;

合法性检查是在程序运行之前,不是在程序运行过程中 但是写在EXECUTE命令中的SQL,会避开最初的合法检查,
等到该EXECUTE命令真正运行时,会检查该EXECUTE命令携带的SQL的合法性

声明部分

声明基本都是由两部分组成:名称和类型,类似于建表语句中声明每一个字段,每个量要有自己的名字(也称标识符),同时还要有自己的属性(含数据类型与精度)。

声明部分-定义变量和常量

变量与常量都必须在声明部分完成声明,而后在执行部分中,变量与常量都只能被使用,但不能被定义。

DECLAREA NUMBER(4) := 30 ;      --部门编号BEGINUPDATE EMP_0419 SET SAL=100 WHERE DEPTNO=A;COMMIT;DBMS_OUTPUT.PUT_LINE(A||'部门薪资已更新');A := 10;  ---赋值DELETE FROM EMP_0419 WHERE DEPTNO =A;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              COMMIT;DBMS_OUTPUT.PUT_LINE(A||'部门数据已经删除');/*A=10;*/ ---判断(条件)A :=20;UPDATE EMP_0419 SET SAL=5 WHERE DEPTNO=A;COMMIT;DBMS_OUTPUT.PUT_LINE(A||'部门薪资已更新');
END;特殊数据类型:
1)%TYPEDECLARE V_ENAME EMP.ENAME%TYPE;
BEGINSELECT ENAME INTO V_ENAME FROM EMP WHERE EMPNO=7369;---把查到的值ENAME放到V_ENAME中DBMS_OUTPUT.PUT_LINE(V_ENAME);
END;
DECLARE V_ENAME EMP.ENAME%TYPE;
BEGINSELECT ENAME,SAL,HIREDATE INTO V_ENAME FROM EMP WHERE EMPNO=7369;---ERROR   不能把不同的数据类型放到一个里DBMS_OUTPUT.PUT_LINE(V_ENAME);
END;
/
DECLAREV_EMPNO NUMBER(4);V_ENAME VARCHAR2(20);V_JOB EMP.JOB%TYPE;BEGINSELECT EMPNO,ENAME,JOB INTO V_EMPNO,V_ENAME,V_JOB FROM EMP WHERE EMPNO=7369;DBMS_OUTPUT.PUT_LINE(V_EMPNO||V_ENAME||V_JOB);
END;
/2)TYPE...DECORD
/*RECORD :*/
DECLARETYPE A IS RECORD(V_EMPNO NUMBER(4),V_ENAME VARCHAR2(20),V_JOB EMP.JOB%TYPE);V_EMP A;
BEGINSELECT EMPNO,ENAME,JOB INTO V_EMP FROM EMP WHERE EMPNO=7369;DBMS_OUTPUT.PUT_LINE(V_EMP.V_EMPNO||V_EMP.V_ENAME||V_EMP.V_JOB);
END;3)%ROWTYPE
DECLAREV_EMP  EMP%ROWTYPE;BEGINSELECT * INTO V_EMP FROM EMP WHERE EMPNO=7369;DBMS_OUTPUT.PUT_LINE(V_EMP.EMPNO||V_EMP.ENAME);
END;/DECLAREV_SQL VARCHAR(2000);V_NAME VARCHAR2(20):=UPPER('&ENAME');NN EMP%ROWTYPE;BEGINV_SQL:='SELECT * FROM EMP WHERE  ENAME='''||V_NAME||'''';EXECUTE IMMEDIATE V_SQL INTO NN;DBMS_OUTPUT.PUT_LINE(NN.EMPNO||','||NN.ENAME||','||NN.JOB||','||NN.SAL||','||NN.MGR||','||NVL(NN.COMM,0)||','||TO_CHAR(NN.HIREDATE,'YYYY/MM/DD')||','||NN.DEPTNO);END;/
DECLARE
--声明记录类型的变量,引用EMP表中的行记录
emp_info emp1%ROWTYPE;
BEGIN--从emp表中取出字段值赋给记录类型SELECT * INTO EMP_INFO FROM EMP1 WHERE EMPNO= 7369;--为记录类型的变量更新新的值EMP_INFO.EMPNO:=7888;EMP_INFO.ENAME:='李焕英';EMP_INFO.JOB:='职员';EMP_INFO.SAL:='500';--向数据库表中插入记录类型的值INSERT INTO EMP1 VALUES EMP_INFO;COMMIT;
EXCEPTIONWHEN OTHERSTHEN NULL;
END;
SELECT * FROM EMP1;变量的赋值:
变量和常量在声明部分声明,不能在执行部分声明
在执行部分被使用不能定义DECLARE A NUMBER :=10;    ---A赋值为10 B  CONSTANT NUMBER :=20;   ---常量B赋值为20
BEGINDBMS_OUTPUT.PUT_LINE(A);DBMS_OUTPUT.PUT_LINE(B);
END;DECLARE V_DEPTNO NUMBER :=&请输入部门编号;--弹出窗口,键盘输入
BEGINDELETE FROM EMP_0419 WHERE DEPTNO=V_DEPTNO;  DBMS_OUTPUT.PUT_LINE(V_DEPTNO||号部门已删除);
END;DECLARE V_ENAME VARCHAR2(20) :=&请输入员工姓名;--弹出窗口,键盘输入
BEGINDELETE FROM EMP_0419 WHERE ENAME=UPPER(V_ENAME);---如果不用upper()则输入小写不会转化为大写----小写不能被删除DBMS_OUTPUT.PUT_LINE(V_ENAME||员工已被删除);
END;/DECLARE V_ENAME VARCHAR2(20) :=&请输入员工姓名;BEGINDBMS_OUTPUT.PUT_LINE(V_ENAME);V_ENAME:=UPPER(V_ENAME)DBMS_OUTPUT.PUT_LINE(V_ENAME);DELETE FROM EMP_0419 WHERE ENAME=V_ENAME;DBMS_OUTPUT.PUT_LINE(V_ENAME||员工已被删除);
END;
DECLARE A VARCHAR2(20);BEGIN/*SELECT * INTO V_EMP FROM EMP WHERE EMPNO=7369;*/EXECUTE IMMEDIATE 'SELECT ENAME FROM EMP WHERE EMPNO=7369' INTO A;DBMS_OUTPUT.PUT_LINE(A);
END;
----EXECUTE IMMEDIATE ...INTO ..赋值
---把SELECT ENAME FROM EMP WHERE EMPNO=7369 的结果赋值给 ADECLARE A VARCHAR2(20);V_SQL VARCHAR2(2000);BEGIN/*SELECT * INTO V_EMP FROM EMP WHERE EMPNO=7369;*//*EXECUTE IMMEDIATE 'SELECT ENAME FROM EMP WHERE EMPNO=7369' INTO A;*/V_SQL := 'SELECT ENAME  FROM EMP WHERE EMPNO=7566';EXECUTE IMMEDIATE V_SQL INTO A;DBMS_OUTPUT.PUT_LINE(A);
END;----在V_SQL  里面不能用into----在V_SQL里是一个sql语句DECLARE V_ENAME VARCHAR2(10) :='SMITH';V_SAL   NUMBER :=1000;V_SQL   VARCHAR2(1000);C_DEPTNO CONSTANT NUMBER :=10;BEGINSELECT SAL INTO V_SAL FROM EMP WHERE ENAME=V_ENAME;DBMS_OUTPUT.put_line(V_ENAME||'的工资是'||V_SAL);V_ENAME:='SCOTT';V_SQL:='SELECT SAL FROM EMP WHERE ENAME ='''||V_ENAME||'''';EXECUTE IMMEDIATE V_SQL INTO V_SAL;DBMS_OUTPUT.put_line(V_ENAME||'的工资是'||V_SAL);SELECT SUM(SAL) INTO V_SAL FROM EMP WHERE DEPTNO = C_DEPTNO;DBMS_OUTPUT.put_line(C_DEPTNO||'部门的工资是'||V_SAL);
END;

-----ERROR


DECLAREV_SQL VARCHAR2(2000);----动态SQL
BEGINV_SQL :='DELETE FROM EMP_0419 WHERE ENAME='JAMES' ';-----james名字的引号与v_sql的引号分别不清DBMS_OUTPUT.put_line(V_SQL);EXECUTE IMMEDIATE V_SQL;COMMIT;END;
SELECT * FROM EMP_0419;
DECLAREV_SQL VARCHAR2(2000);----动态SQL
BEGINV_SQL := 'DELETE FROM EMP_0419 WHERE ENAME=''SMITH'' ';DBMS_OUTPUT.put_line(V_SQL);EXECUTE IMMEDIATE V_SQL;COMMIT;END;
SELECT * FROM EMP_0419;
DECLAREV_SQL VARCHAR2(2000);V_ENAME VARCHAR2(20) :='&请指定员工姓名';----动态SQL
BEGIN--V_SQL := 'DELETE FROM EMP_0419 WHERE ENAME=''V_ENAME'' ';---不会删除数据V_SQL := 'DELETE FROM EMP_0419 WHERE ENAME='''||V_ENAME||'''';DBMS_OUTPUT.put_line(V_SQL);EXECUTE IMMEDIATE V_SQL;COMMIT;END;DELETE FROM EMP_0419 WHERE ENAME='
ALLEN
'

插入一条数据用executeimmediate

DECLAREV_SQL VARCHAR2(2000);BEGINV_SQL := 'INSERT INTO EMP_0419(EMPNO,ENAME,SAL) VALUES (1234,'||'''ZHANGSAN'''||',800)';DBMS_OUTPUT.put_line(V_SQL);EXECUTE IMMEDIATE  V_SQL;COMMIT;
END;
/SELECT * FROM EMP_0419 FOR UPDATE;/
DECLAREV_SQL VARCHAR2(2000);BEGINV_SQL := 'INSERT INTO EMP_0419(EMPNO,ENAME,SAL) VALUES (1234,''ZHANGSAN'',800)';DBMS_OUTPUT.put_line(V_SQL);EXECUTE IMMEDIATE  V_SQL;COMMIT;
END;

从键盘获取MAX/MIN/AVG/SUM中的一种 返回所有员工对应的最大薪资/最小薪资/平均薪资/合计薪资
统计结果按四舍五入处理到整数位 eg:输入:MAX,返回:所有员工的最大薪资是5000元
输入:AVG,返回:所有员工的平均薪资是2073元

DECLAREV_SAL NUMBER;V_SQL VARCHAR2(2000);V_VALUE VARCHAR2(30) :='&请输入' ;---键盘获取MAX/MIN/AVG/SUM中的一种
BEGINIF V_VALUE = 'MAX' THENV_SQL := 'SELECT MAX(SAL) FROM EMP';DBMS_OUTPUT.put_line(V_SQL);EXECUTE IMMEDIATE V_SQL INTO V_SAL;DBMS_OUTPUT.put_line('所有员工的最大薪资是'||V_SAL||'元');ELSIF V_VALUE ='MIN' THEN V_SQL := 'SELECT MIN(SAL) FROM EMP';DBMS_OUTPUT.put_line(V_SQL);EXECUTE IMMEDIATE V_SQL INTO V_SAL;DBMS_OUTPUT.put_line('所有员工的最小薪资是'||V_SAL||'元');ELSIF V_VALUE ='AVG' THEN V_SQL := 'SELECT AVG(SAL) FROM EMP';DBMS_OUTPUT.put_line(V_SQL);EXECUTE IMMEDIATE V_SQL INTO V_SAL;DBMS_OUTPUT.put_line('所有员工的平均薪资是'||V_SAL||'元');ELSIF V_VALUE ='SUM' THENV_SQL := 'SELECT SUM(SAL) FROM EMP';DBMS_OUTPUT.put_line(V_SQL);EXECUTE IMMEDIATE V_SQL INTO V_SAL;DBMS_OUTPUT.put_line('所有员工的合计薪资是'||V_SAL||CHR(13)||'元');END IF;END;/DECLAREV_SAL NUMBER;V_SQL VARCHAR2(2000);V_VALUE VARCHAR2(30) :='&请输入';----键盘获取MAX/MIN/AVG/SUM中的一种
BEGINIF V_VALUE IN('MAX','MIN','AVG','SUM') THENV_SQL := 'SELECT '||V_VALUE||'(SAL) FROM EMP';DBMS_OUTPUT.put_line(V_SQL);EXECUTE IMMEDIATE V_SQL INTO V_SAL;DBMS_OUTPUT.put_line('所有员工的'||CASE WHEN V_VALUE ='MAX' THEN  '最大'WHEN V_VALUE ='MIN' THEN  '最小'WHEN V_VALUE ='AVG' THEN  '平均'WHEN V_VALUE ='SUM' THEN  '合计'END||'薪资是'||ROUND(V_SAL)||CHR(13)||'元');   ----CHR(13)  换行ELSEDBMS_OUTPUT.put_line('请输入正确的类型');END IF;END;

PL/SQL----pl/sql块相关推荐

  1. oracle数据库匿名快,pl/sql分匿名块和命名块

    命名块:存储过程,函数,触发器,包等 pl/sql语句块分3部分: (1)声明部分 (2)可执行部分 (3)异常处理部分 其中可执行部分是语句块中唯一要求必须存在的部分,声明部分和异常处理部分是可选的 ...

  2. PL/SQL -- 动态SQL调用包中函数或过程

    动态SQL主要是用于针对不同的条件或查询任务来生成不同的SQL语句.最常用的方法是直接使用EXECUTE IMMEDIATE来执行动态SQL语句字符串或字符串变量.但是对于系统自定义的包或用户自定的包 ...

  3. PL/SQL -- 动态SQL

    --==================== -- PL/SQL --> 动态SQL --==================== 使用动态SQL是在编写PL/SQL过程时经常使用的方法之一.很 ...

  4. t–sql pl–sql_SQL存储过程–终极指南

    t–sql pl–sql Hey, folks! In this article, we will be focusing on SQL Stored Procedures. 嘿伙计! 在本文中,我们 ...

  5. SQL/PL SQL

    1 sql(数据定义语言) 和PL/Sql的区别: 答:SQL是结构化查询语言,比较接近自然语言,使用SQL,只需要说干什么,不需要说怎么干.由数据定义语言.数据操纵语言.数据控制语言构成,它不面向过 ...

  6. PL/SQL和sql是什么区别?

    https://zhidao.baidu.com/question/187511430.html PL/SQL和sql是什么区别? cgxnjnj | 浏览 17977 次 2010-09-30 20 ...

  7. t–sql pl–sql_SQL Server性能疑难解答的DBA指南–第1部分–问题和性能指标

    t–sql pl–sql It doesn't mean that every SQL Server slowdown is a performance problem. Some specific ...

  8. t–sql pl–sql_SQL Server处理器性能指标–第3部分–指示硬件组件问题的指标

    t–sql pl–sql Part 1 and 第1部分和Part 2 of the SQL Server processor performance metrics series, we descr ...

  9. t–sql pl–sql_SQL Server处理器性能指标–第4部分–处理器指标有助于更深入的调查和故障排除

    t–sql pl–sql In the previous part of this series, we presented the processor metrics that indicate h ...

  10. t–sql pl–sql_SQL View –完整的介绍和演练

    t–sql pl–sql In relational databases, data is structured using various database objects like tables, ...

最新文章

  1. R语言数据结构之因子
  2. 基于redis的分布式任务管理
  3. master中的系统目录与用户数据库中的区别
  4. 我的jQuery动态表格插件二
  5. 【Flask项目2】项目基本架构配置(1)
  6. jQuery对象和DOM对象互转的问题、jQuery文件引入问题、DOM版本的网页开关灯
  7. 11 操作系统第三章 内存管理 内存的基本知识 内存管理 内存空间扩充 连续分配管理方式
  8. api 创建zookeeper客户端_一文了解 Zookeeper 基本原理与应用场景
  9. 漫步微积分三十一——定积分的直观含义
  10. 个人计算机预防勒索病毒,Windows10如何开启预防勒索病毒功能|电脑安全开启防御勒索软件的方法...
  11. python修改pip源脚本_修改python的pip源为国内源
  12. oracle创建表空间并赋予权限
  13. Yii在控制层中引入模版进行渲染的几种方式。
  14. M2Det 论文笔记
  15. Github 源码阅读神器:Octotree
  16. JAVA面试总结(初版)
  17. 三星6.0系统机器(亲测有效)激活XPOSED框架的流程
  18. html实现雪花飘落
  19. 破圈的《张朝阳的物理课》,开启“知识突围”的搜狐视频
  20. 流行的软件测试工具介绍

热门文章

  1. Base64与BLOB互相转换
  2. PPT - PPT 能自定义的设置快捷键吗?
  3. 为什么WPF在code behind使用RelativeSource的binding会出现错误
  4. 新四级冲刺需牢记的700核心词 --有毅力才能看完
  5. 使用export_graphviz报错“FileNotFoundError”
  6. 【Echarts】echarts饼图、圆环图配置代码详解
  7. Flutter 强制横屏竖屏设置
  8. 比心app源码,Java 单例模式
  9. java项目 异常如何解决方案,java 项目
  10. 节能降耗方案-医院能源管理系统平台的研究与应用分析