学习笔记22/1/18

学习笔记

一、程序块代码

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;  

整完收工,王者新赛季,回去整王者荣耀去了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值