学习笔记
一、程序块代码
1.条件判断(if else)
- 语法结构
IF 条件1 THEN
操作1;
ELSIF 条件2 THEN
操作2;
ELSIF 条件3 THEN
操作3;
...
ELSE 操作N;
END IF;
eg:传入一个员工的工号如果这个员工的 岗位是 ANALYST 或者 CLERK 或者 SALESMAN 就给员工加 500 块工资如果这个员工的 岗位MANAGER ,就给员工加 800 块工资如果是 PRESIDENT ,就不用管,什么都不干;
CREATE TABLE EMP_7521 AS SELECT * FROM EMP;
-- 建一个新表,防止emp表中数据被更改
DECLARE
V_ENO EMP_7521.EMPNO%TYPE := 7521;
V_JOB EMP_7521.JOB%TYPE;
BEGIN
SELECT E.JOB
INTO V_JOB
FROM EMP_7521 E
WHERE E.EMPNO = V_ENO;
IF V_JOB IN('ANALYST' , 'LERK' , 'SALESMAN') THEN
UPDATE EMP_7521 E SET E.SAL = E.SAL + 500
WHERE E.EMPNO = V_ENO;
ELSIF V_JOB = 'MANAGER' THEN
UPDATE EMP_7521 E SET E.SAL = E.SAL + 500
WHERE E.EMPNO = V_ENO;
END IF;
/*
CASE WHEN V_JOB IN('ANALYST' , 'LERK' , 'SALESMAN') THEN
UPDATE EMP_7521 E SET E.SAL = E.SAL + 500
WHERE E.EMPNO = V_ENO;
WHEN V_JOB = 'MANAGER' THEN
UPDATE EMP_7521 E SET E.SAL = E.SAL + 500
WHERE E.EMPNO = V_ENO;
END CASE; */
-- CASE WHEN 也可以起到相同的作用
COMMIT;
END;
SELECT * FROM EMP_7521; -- 用于查看修改后的表
2.if else 子句的嵌套
这部分没啥说的,就是套中套就完事了。
3.循环
(1)for循环
语法结构:
FOR 循环变量 IN 循环下限..循环上限 LOOP
--循环变量可以用任意的字母或者单词
循环体(要重复执行的逻辑)
END LOOP;
eg:计算 1 到 10 的数字中双数的累加值;
DECLARE
V_SUM NUMBER := 0;
BEGIN
FOR I IN 1..10 LOOP
IF MOD(I,2) = 0 THEN
V_SUM := V_SUM + I;
DBMS_OUTPUT.put_line(V_SUM);
END IF;
END LOOP;
DBMS_OUTPUT.put_line('累加值:'||V_SUM);
END;
PS:上题中出现了一个问题,我发现了 = 作为赋值和作比较时的区别,当 = 用来做比较的时候,就是单独使用或者后面加上 any、all等关键字,但是当它是用来赋值时,必须使用 := 的样式进行赋值,直接使用 = 赋值在PLSQL中是不被允许的;
(2)loop循环
语法结构:
LOOP
循环体;
-- EXIT 退出循环关键字
/*IF 退出条件 THEN
EXIT;*/
EXIT WHEN 退出条件;
END LOOP;
eg:计算 1 到 10 的累加值(LOOP循环);
DECLARE
V_SUM NUMBER := 0;
V_I NUMBER := 1;
BEGIN
LOOP
V_SUM := V_SUM + V_I;
/*IF V_I = 10 THEN
EXIT;
END IF;*/
-- 用 if 语句退出loop循环
EXIT WHEN V_I = 10;
V_I := V_I + 1;
END LOOP;
DBMS_OUTPUT.put_line(V_SUM);
END;
eg:计算 1 到 10 的数字中双数的累加值(LOOP循环);
DECLARE
V_SUM NUMBER := 0;
V_I NUMBER := 1;
BEGIN
LOOP
IF MOD(V_I,2) = 0 THEN
V_SUM := V_SUM + V_I;
END IF;
EXIT WHEN V_I = 10;
V_I := V_I + 1;
END LOOP;
DBMS_OUTPUT.put_line(V_SUM);
END;
(3)while循环
语法结构:
WHILE 进入循环的条件 LOOP
循环体;
END LOOP;
eg:计算 1 到 10 的累加值(while循环);
DECLARE
V_SUM NUMBER := 0;
V_I NUMBER := 1;
BEGIN
WHILE V_I <= 10 LOOP
V_SUM := V_SUM + V_I;
V_I := V_I + 1;
END LOOP;
DBMS_OUTPUT.put_line(V_SUM);
END;
eg:计算 1 到 10 的数字中双数的累加值(while循环);
DECLARE
V_SUM NUMBER := 0;
V_I NUMBER := 1;
BEGIN
WHILE V_I <= 10 LOOP
IF MOD(V_I,2) = 0 THEN
V_SUM := V_SUM + V_I;
END IF;
V_I := V_I + 1;
END LOOP;
DBMS_OUTPUT.put_line(V_SUM);
END;
eg;计算 1 到 100的素数的累加值;
DECLARE
V_SUM NUMBER := 0; -- 素数和
V_POW NUMBER; -- 开根号的v_i,用作判定条件
V_I NUMBER := 2; -- 从1~100的计数变量
V_J NUMBER := 2; -- 从2~v_pow的计数变量
V_FLAG NUMBER := 0; -- 是否为质数的标记
BEGIN
LOOP
V_POW := POWER(V_I,0.5);
WHILE V_J <= V_POW LOOP -- V_J 应小于v_i开根号
IF MOD(V_I,V_J) = 0 THEN
V_FLAG := 1;
EXIT; -- 如果能整除,不是素数,flag置1,退出内层循环
END IF;
V_J := V_J + 1; -- 如果不能整除,v_j自增后再进行循环
END LOOP;
V_J := 2; -- 为下次循环做准备
IF V_FLAG = 0 THEN
V_SUM := V_SUM + V_I;
DBMS_OUTPUT.put_line(V_SUM);
DBMS_OUTPUT.put_line(V_I);
DBMS_OUTPUT.put_line('----------------------');
-- 如果v_flag为零,则为素数,加至v_sum中去
ELSE V_FLAG := 0; -- 若不为零 ,将flag置零
END IF;
V_I := V_I + 1;
EXIT WHEN V_I > 100;
END LOOP;
DBMS_OUTPUT.put_line('0~100的素数和为:'||V_SUM);
END;
SELECT POWER(4,0.5)
FROM DUAL;
- 该题还有问题,但本人实在整不明白了,为什么按照逻辑4明显不会被加入进去,但是却会被判定为素数进行累加;
eg:九九乘法表;
DECLARE
V_MUL NUMBER;
V_I NUMBER := 1;
V_J NUMBER := 1;
BEGIN
WHILE V_I <= 9 LOOP
V_J := 1;
WHILE V_J <= V_I LOOP
V_MUL := V_I * V_J;
DBMS_OUTPUT.put(V_J||'*'||V_I||'='||V_MUL||'|');
V_J := V_J + 1;
END LOOP;
DBMS_OUTPUT.put_line(' ');
V_I := V_I + 1;
END LOOP;
END;
整完收工,王者新赛季,回去整王者荣耀去了。