本人最近在学PL/SQL,闲来无事做了一套练习题,写了点笔记,供大家参考。
第一题,要求选出不合法的声明。A多余声明,C缺少冒号,D类型不匹配,只有B是正确的的。
第二题,要求给出变量类型。答案如下,不多解释。
a. CHAR / VARCHAR2
b. DATE
c. NUMBER
d. BOOLEAN
e. BOOLEAN
f. DATE
第三题,要求分别给出在1和2位置,每个变量的取值。这里要注意每个变量的作用域,看清楚一个匿名块里套着另一个匿名块,以及匿名块的范围,很容易得到答案。
我的测试代码如下:
DECLARE v_custid NUMBER(4) := 1600; v_custname VARCHAR2(300) := 'Women Sports Club'; v_new_custid NUMBER(3) := 500; BEGIN DECLARE v_custid NUMBER(4) := 0; v_custname VARCHAR2(300) := 'Shape up Sports Club'; v_new_custid NUMBER(3) := 300; v_new_custname VARCHAR2(300) := 'Jansports Club'; BEGIN v_custid := v_new_custid; v_custname := v_custname || ' ' || v_new_custname; DBMS_OUTPUT.put_line('(1) ' || v_custid || '——' || v_custname || '——' || v_new_custid || '——' || v_new_custname); END; DBMS_OUTPUT.put_line('(2) ' || v_custid || '——' || v_custname || '——' || v_new_custid); v_custid := (v_custid * 12) / 10; END;
屏幕上的输出如图:
因此,可以得出答案:
a. The value of V_CUSTID at position 1 is: 300
b. The value of V_CUSTNAME at position 1 is: Shape up Sports Club Jansports Club
c. The value of V_NEW_CUSTID at position 2 is: 500
d. The value of V_NEW_CUSTNAME at position 1 is: Jansports Club
e. The value of V_CUSTID at position 2 is: 1920
f. The value of V_CUSTNAME at position 2 is: Women Sports Club
第四题,要求写一个匿名块,根据输入的年份判断是否是闰年。
输入使用替代变量,IF...THEN的条件判断不多说,这里提一下那一长串的条件。
判断闰年的标准是:(1) 能被4整除且不被100整除;(2) 能被400整除。条件(1)中是通过AND连接的,条件(2)是通过OR连接的。初步确定条件应该这么写:
((= 4 AND <> 100) OR (= 400))
由于AND的优先级是高于OR的(即使平级,在这道题里也是相同的做法),这里可以省去一层括号,即(= 4 AND <> 100 OR = 400)。
给出代码如下,测试通过。
DECLARE v_year INTEGER(4); BEGIN v_year := '&请输入年份:'; -- AND的优先级是高于OR的,因此执行的顺序是((= 4 AND <> 100) OR = 400) IF MOD(v_year, 4) = 0 AND MOD(v_year, 100) <> 0 OR MOD(v_year, 400) = 0 THEN DBMS_OUTPUT.put_line(v_year || ' is a leap year.'); ELSE DBMS_OUTPUT.put_line(v_year || ' is not a leap year.'); END IF; END;