@[TOP]
在 Oracle PL/SQL 中,无名块(Anonymous Block)是一种可以立即执行的代码段, 它没有名字,因此不能被复用。
无名块通常用于执行一次性的任务,比如临时查询数据库、执行 DML 操作等。
它们通常直接在 SQL*Plus 或者其他 PL/SQL 编辑器中编写并执行。
一、无名块的结构
DECLARE
-- 变量声明
变量名 变量类型;
BEGIN --执行部分,(核心)
-- SQL 语句或者 PL/SQL 逻辑
变量名 := 值;
-- 执行 SQL 语句的例子
INSERT INTO table_name (column1, column2) VALUES (value1, value2);
-- 提交事务
COMMIT;
EXCEPTION --可选
-- 处理异常情况
WHEN others THEN
-- 发生错误时的操作
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('An error occurred: ' || SQLERRM);
END;
二、变量
变量是用来接收可变动的值,只能接收一个值。
1、变量命名规范
1). 要见名知意 ;
2). 必须以字母开头,并且不要用除了_以外的特殊符号
声明变量:
DECLARE
变量名1 变量类型;
变量名2 变量类型;
----程序块当中 每完成一句话都要有分号
BEGIN
END;
--例:打印输出 hello world
DECLARE
V_a VARCHAR2(30);
BEGIN
V_a := 'Hello World';
dbms_output.put_line(V_a); --打印输出
END;
2、给变量赋值
1). 在 BEGIN 后面 用 赋值符号 := 给变量赋值
2). 在 declare 后面 用 赋值符号 := 给变量赋值
DECLARE
V_a VARCHAR2(30):='HELLO WORLD'; ---初始值
BEGIN
dbms_output.put_line(V_a); --打印输出V_a
END;
3、利用 SELECT INTO 语句 给变量赋值
--语法
DECLARE
变量1 变量类型;
......
BEGIN
SELECT 列名1, ...... INTO 变量1...... FROM 表名 ..... WHERE 条件........;
---将sql查询语句的结果交给变量,注意只能是一行结果
---变量的个数 顺序 属性 要和列一致
END;
例1:打印输出 7788的员工的姓名和岗位
DECLARE
V_ename VARCHAR2(30);
V_job VARCHAR2(30);
BEGIN
SELECT ename,job
INTO V_ename , V_job
FROM emp
WHERE empno=7788;
--dbms_output.put_line(v_ename || V_job ); --打印多个值需用||连接
--为了美观可以拼接' '
dbms_output.put_line(v_ename ||' '|| V_job );
END;
结果:
例2:打印输出 10号部门平均工资
DECLARE
V_avgsal NUMBER;
BEGIN
SELECT AVG(sal) INTO V_avgsal
FROM emp
WHERE deptno=10;
dbms_output.put_line(V_avgsal);
END;
结果:
例3:打印输出7788 的员工的姓名岗位薪资部门编号部门名称以及对应的部门平均工资
DECLARE
V_ename VARCHAR2(30);
V_job VARCHAR2(30);
V_sal NUMBER;
V_deptno NUMBER;
V_dname VARCHAR2(30);
V_avgsal NUMBER;
BEGIN
SELECT ENAME,
JOB,
SAL,
A.DEPTNO,
DNAME,
(SELECT AVG(SAL) FROM EMP B WHERE B.DEPTNO = A.DEPTNO)
INTO V_ename,V_job,V_sal,V_deptno,V_dname,V_avgsal
FROM EMP A
LEFT JOIN DEPT
ON A.DEPTNO = DEPT.DEPTNO
WHERE EMPNO = 7788;
dbms_output.put_line(V_ename||' '||V_job||' '||V_sal||' '||V_deptno||' '||V_dname||' '||V_avgsal);
END;
结果:
三、打印输出
1.换行输出
打印输出结束后会另起一行:
dbms_output.put_line()
例:
DECLARE
V_a NUMBER:=123;
BEGIN
dbms_output.put_line(V_a);
END;
结果:
2. 不换行输出
打印输出完之后不换行
注意不换行输出结果后面一定要跟一个换行输出,否则没有结果
dbms_output.put(1个参数);
例:不跟换行
DECLARE
V_a NUMBER:=123;
BEGIN
dbms_output.put(V_a);
END;
结果:可以看到没有输出内容
不换行后跟换行:
DECLARE
V_a NUMBER:=123;
BEGIN
dbms_output.put(V_a);
dbms_output.put_line('');
END;
结果:可以看到有结果输出
四、手动输入 &
例1:手动输入一个员工编号 输出该员工的姓名
DECLARE
V_ename VARCHAR2(30);
V_empno NUMBER :='&请输入';
---最好加上单引号
---提示词不能一样
BEGIN
SELECT ename
INTO v_ename
FROM emp
WHERE empno=V_empno;
dbms_output.put_line(v_ename );
END;
结果:
例2:输入一个部门编号返回该部门的工资最高的员工的姓名
DECLARE
V_DEPTNO NUMBER := '&请输入';
V_ENAME VARCHAR2(30);
BEGIN
SELECT ENAME
INTO V_ename
FROM EMP
WHERE SAL = (SELECT MAX(SAL) FROM EMP WHERE DEPTNO = V_DEPTNO)
AND DEPTNO = V_DEPTNO;
dbms_output.put_line(V_ename);
END;
结果:
例3:输入一个员工编号 打印输出该员工所在部门平均工资 以及该员工姓名和岗位以及部门名称
DECLARE
V_empno NUMBER:='&请输入';
V_avgsal NUMBER;
V_ename VARCHAR2(30);
V_job VARCHAR2(30);
V_dname VARCHAR2(30);
BEGIN
SELECT ENAME,
JOB,
DNAME,
(SELECT AVG(SAL) FROM EMP B WHERE B.DEPTNO = A.DEPTNO)
INTO V_ename,V_job,V_dname,V_avgsal
FROM EMP A
LEFT JOIN DEPT
ON A.DEPTNO = DEPT.DEPTNO
WHERE EMPNO =V_empno;
dbms_output.put_line(V_ename||' '||V_job||' '||V_dname||' '||V_avgsal);
END;
结果: