PL/SQL----pl/sql块
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块相关推荐
- oracle数据库匿名快,pl/sql分匿名块和命名块
命名块:存储过程,函数,触发器,包等 pl/sql语句块分3部分: (1)声明部分 (2)可执行部分 (3)异常处理部分 其中可执行部分是语句块中唯一要求必须存在的部分,声明部分和异常处理部分是可选的 ...
- PL/SQL -- 动态SQL调用包中函数或过程
动态SQL主要是用于针对不同的条件或查询任务来生成不同的SQL语句.最常用的方法是直接使用EXECUTE IMMEDIATE来执行动态SQL语句字符串或字符串变量.但是对于系统自定义的包或用户自定的包 ...
- PL/SQL -- 动态SQL
--==================== -- PL/SQL --> 动态SQL --==================== 使用动态SQL是在编写PL/SQL过程时经常使用的方法之一.很 ...
- t–sql pl–sql_SQL存储过程–终极指南
t–sql pl–sql Hey, folks! In this article, we will be focusing on SQL Stored Procedures. 嘿伙计! 在本文中,我们 ...
- SQL/PL SQL
1 sql(数据定义语言) 和PL/Sql的区别: 答:SQL是结构化查询语言,比较接近自然语言,使用SQL,只需要说干什么,不需要说怎么干.由数据定义语言.数据操纵语言.数据控制语言构成,它不面向过 ...
- PL/SQL和sql是什么区别?
https://zhidao.baidu.com/question/187511430.html PL/SQL和sql是什么区别? cgxnjnj | 浏览 17977 次 2010-09-30 20 ...
- 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 ...
- 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 ...
- 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 ...
- t–sql pl–sql_SQL View –完整的介绍和演练
t–sql pl–sql In relational databases, data is structured using various database objects like tables, ...
最新文章
- R语言数据结构之因子
- 基于redis的分布式任务管理
- master中的系统目录与用户数据库中的区别
- 我的jQuery动态表格插件二
- 【Flask项目2】项目基本架构配置(1)
- jQuery对象和DOM对象互转的问题、jQuery文件引入问题、DOM版本的网页开关灯
- 11 操作系统第三章 内存管理 内存的基本知识 内存管理 内存空间扩充 连续分配管理方式
- api 创建zookeeper客户端_一文了解 Zookeeper 基本原理与应用场景
- 漫步微积分三十一——定积分的直观含义
- 个人计算机预防勒索病毒,Windows10如何开启预防勒索病毒功能|电脑安全开启防御勒索软件的方法...
- python修改pip源脚本_修改python的pip源为国内源
- oracle创建表空间并赋予权限
- Yii在控制层中引入模版进行渲染的几种方式。
- M2Det 论文笔记
- Github 源码阅读神器:Octotree
- JAVA面试总结(初版)
- 三星6.0系统机器(亲测有效)激活XPOSED框架的流程
- html实现雪花飘落
- 破圈的《张朝阳的物理课》,开启“知识突围”的搜狐视频
- 流行的软件测试工具介绍