plsql判断练习题 # Oracle PL/SQL IF 判断练习题约束**禁止使用循环、异常处理、触发器、游标**只允许使用 IF…ELSIF…ELSE、简单变量赋值、DBMS_OUTPUT.PUT_LINE共10题**2道中等8道中等偏上中等以上**全部只靠分支判断完成。 说明中等题侧重基础多条件组合中等以上侧重多条件嵌套、区间逻辑、多变量联合判断、优先级、边界值、业务场景判断。---## 中等难度2题T1‑T2### T1【中等】分数等级判定编写PL/SQL块定义变量v_score NUMBER给变量赋值测试值可分别为95、72、58。规则- ≥90输出优秀- 80~89输出良好- 70~79输出及格- 70输出不及格要求只用IF‑ELSIF‑ELSE不许case不许循环异常游标。declareV_score number:请输入;beginif V_score 90 thendbms_output.put_line(优秀);elsif V_score 80 thendbms_output.put_line(良好);elsif V_score 70 thendbms_output.put_line(及格);elsedbms_output.put_line(不及格);end if;end;### T2【中等】判断三角形类型定义3个数字变量a,b,c代表三条边长。逻辑1. 任意边长小于等于0 →输出“边长非法”2. 不满足两边之和大于第三边 →输出“不能构成三角形”3. 三边相等输出“等边三角形”4. 两边相等输出“等腰三角形”5. 其余输出普通三角形。要求仅IF分支不能用循环、游标、异常。declarea number:请输入a;b number:请输入b;c number:请输入c;beginif a0 or b0 or c0 thendbms_output.put_line(边长非法);elseif abc or acb or bca thendbms_output.put_line(不能构成三角形);elsif ab and bc thendbms_output.put_line(等边三角形);elsif ab and ac or ac and ab or bc and ba thendbms_output.put_line(等腰三角形);elsedbms_output.put_line(普通三角形);end if;end if;end;---## 中等以上难度8题T3‑T10 特点多变量联合、条件嵌套、多区间叠加、互斥条件、业务规则、边界临界判断。### T3【中等以上】会员折扣计算多变量联合判断变量- v_member_type VARCHAR2(10)会员类型取值 普通,银卡,金卡- v_amount NUMBER消费金额折扣规则1. 非会员无折扣2. 银卡消费≥1000打9折小于1000打9.5折3. 金卡消费≥1000打8折小于1000打8.5折4. 如果消费金额≤0输出“金额无效”。输出 原始金额、会员类型、折后金额。要求只能IF分支不使用CASE不允许循环、异常。declarev_member_type VARCHAR2(10):会员类型;v_amount NUMBER :消费金额;n number;beginif v_member_type普通 thendbms_output.put_line(非会员无折扣);elsif V_member_type银卡 thenif v_amount1000 thenn:v_amount*0.9; -------折后金额、elsif v_amount1000 and v_amount0 thenn:v_amount*0.95;elsif v_amount0 thendbms_output.put_line(金额无效);end if;elsif V_member_type金卡 thenif v_amount1000 thenn:v_amount*0.8; -------折后金额、elsif v_amount1000 and v_amount0 thenn:v_amount*0.85;elsif v_amount0 thendbms_output.put_line(金额无效);end if;end if;dbms_output.put_line(v_amount||n||v_member_type);end;-----------------------------------------------------------------### T4【中等以上】季节判断月份边界变量v_month NUMBER代表月份1‑12。业务规则- 3‑5月春季- 6‑8月夏季- 9‑11月秋季- 12,1,2月冬季- 如果月份不在1‑12输出“月份输入错误”**附加约束不使用IN全部用IF条件比较完成。**### T5【中等以上】薪资调薪逻辑嵌套IF变量- v_sal NUMBER 当前工资- v_level VARCHAR2(10) 岗位等级A,B,C调薪规则1. 如果等级A- 工资大于15000加薪5%否则加薪10%2. 如果等级B- 工资大于10000加薪3%否则加薪6%3. 如果等级C统一加薪2%4. 其他等级输出“无效岗位等级不调薪”输出调薪前后工资。要求必须使用IF嵌套禁止case禁止循环异常游标。declareV_empno number:员工编号;v_sal NUMBER;v_level VARCHAR2(10):请输入;n number;beginselect sal into V_sal from emp where empnoV_empno;if v_level A thenif V_sal15000 thenn: V_sal*1.05;----涨薪后的薪资elsenv_sal*1.1;end if;elsif v_levelB thenif V_sal10000 thenn: V_sal*1.03;----涨薪后的薪资elsenv_sal*1.06;end if;elsif v_levelC thenn:V_sal*1.02;elsedbms_output.put_line(无效岗位等级不调薪);end if;end;### T6【中等以上】快递运费计算多条件叠加、临界边界变量- v_weight NUMBER 包裹重量kg- v_is_remote BOOLEAN 是否偏远地区 true/false计费规则1. 重量≤0输出重量非法2. 基础重量≤2kg基础运费10元超过2kg每超1kg加收3元只做逻辑判断不用循环用算术直接算3. 如果是偏远地区在上述结果基础上额外加15元。输出最终运费。 提示用算术表达式完成超重加价**严禁循环累加**只用IF做分支判断。### T6【中等以上】快递运费计算多条件叠加、临界边界### T6【中等以上】快递运费计算多条件叠加、临界边界变量- v_weight NUMBER包裹重量kg- v_is_remote BOOLEAN是否偏远地区 true/false计费规则1. 重量≤0输出重量非法2. 基础重量≤2kg基础运费10元超过2kg每超1kg加收3元只做逻辑判断不用循环用算术直接算3. 如果是偏远地区在上述结果基础上额外加15元。输出最终运费。 提示用算术表达式完成超重加价**严禁循环累加**只用IF做分支判断。DECLAREv_weight NUMBER : 6;v_is_remote BOOLEAN :请输入;V_money number;BEGINif V_is_remote false thenif V_weight 0 thendbms_output.put_line(重量非法);elsif V_weight 2 thenV_money : 10;elsif V_weight 2 thenV_money : 10 ceil(V_weight - 2) * 3;end if;ELSIF V_is_remote true thenif V_weight 0 thendbms_output.put_line(重量非法);elsif V_weight 2 thenV_money : 10 15;elsif V_weight 2 thenV_money : 10 ceil(V_weight - 2) * 3 15;end if;end if;dbms_output.put_line(V_money);end;T7【中等以上】入学资格审核多条件同时满足/互斥变量- v_age NUMBER 年龄- v_exam_score NUMBER 考试分数- v_has_certificate BOOLEAN 是否持有证书入学规则1. 年龄小于16 直接拒绝输出“年龄不足”2. 年龄大于30直接拒绝输出“年龄超限”3. 年龄16‑30范围内- 考试分数≥600 →直接录取- 分数450~599有证书才录取无证书不录取- 分数小于450一律不予录取输出审核结果。全部用IF分支。DECLAREv_age NUMBER : 18;v_exam_score NUMBER : 500;v_has_certificate BOOLEAN : true;BEGINIF V_age 16 thendbms_output.put_line(年龄不足);elsif V_age 30 thendbms_output.put_line(年龄超限);elsif V_age BETWEEN 16 AND 30 thenif V_exam_score 600 thendbms_output.put_line(录取);ELSIF V_exam_score BETWEEN 450 AND 599 thenif V_has_certificate true thendbms_output.put_line(录取);elsif V_has_certificate false thendbms_output.put_line(不录取);end if;ELSIF V_exam_score 450 thendbms_output.put_line(不录取);end if;end if;end;### T8【中等以上】流量套餐扣费多分支优先级变量- v_total_flow NUMBER总套餐流量GB- v_used_flow NUMBER已使用流量GB规则1. 已用或总流量小于0输出流量数据错误2. 已用 ≤总流量不额外扣费3. 超出部分- 超出0‑5GB超出部分每GB扣10元- 超出5GB统一按封顶80元扣费输出超出流量、额外扣费金额。 要求只用IF判断不能循环不能case。DECLAREv_total_flow NUMBER : 80;v_used_flow NUMBER : 84;V_c_flow number;V_money NUMBER;BEGINV_c_flow : V_used_flow - V_total_flow;--超出的流量if V_used_flow 0 OR V_total_flow 0 thendbms_output.put_line(流量数据错误);ELSIF V_used_flow V_total_flow thenV_money : 0;ELSIF V_used_flow V_total_flow thenif V_c_flow BETWEEN 0 and 5 thenV_money : ceil(V_used_flow - V_total_flow) * 10;elsif V_c_flow 5 thenV_money : 80;end if;end if;dbms_output.put_line(V_c_flow || V_money);end;### T9【中等以上】奖学金评定多变量复杂组合变量- v_avg_score NUMBER平均分- v_is_party BOOLEAN是否团员 true/false- v_moral_score NUMBER德育分评定规则1. 平均分70无奖学金2. 平均分≥90- 德育分≥85一等奖学金- 德育分85二等奖学金3. 平均分70~89- 是团员 并且 德育≥80三等奖学金- 其余情况无奖学金输出奖学金等级。DECLAREv_avg_score NUMBER : 75;v_is_party BOOLEAN : false;v_moral_score NUMBER : 79;V_grade_sal VARCHAR(20);BEGINIF V_avg_score 70 thendbms_output.put_line(无奖学金);ELSIF V_avg_score 90 thenif V_moral_score 85 thenV_grade_sal : 一等奖学金;ELSIF V_moral_score 85 thenV_grade_sal : 二等奖学金;end if;ELSif V_avg_score BETWEEN 70 and 89 thenif V_is_party true and V_moral_score 80 thenV_grade_sal : 三等奖学金;elsedbms_output.put_line(无奖学金);end if;end if;dbms_output.put_line(V_grade_sal);end;### T10【中等以上】设备告警等级判断多条件与或组合变量- v_cpu NUMBER cpu使用率百分比0‑100- v_mem NUMBER内存使用率百分比0‑100- v_disk NUMBER磁盘使用率百分比0‑100告警逻辑1. cpu90 或者 mem90 →严重告警2. 不满足严重告警前提下cpu75 OR mem75 OR disk85 →一般告警3. 全部指标都正常输出“设备运行正常”4. 如果任意指标小于0或大于100输出采集数据异常。要求条件顺序很关键思考优先级只用IF‑ELSIF‑ELSE实现。DECLAREv_cpu NUMBER : 91;v_mem NUMBER : 70;v_disk NUMBER : 65;beginIF V_cpu 90 OR V_mem 90 thendbms_output.put_line(严重警告);ELSIF V_cpu 75 and V_cpu 90 or V_mem 90 AND V_mem 75 orV_disk 85 thendbms_output.put_line(一般警告);ELSif V_cpu 0 or V_cpu 100 or V_mem 0 OR V_mem 100 or V_disk 0 orV_disk 100 thendbms_output.put_line(采集数据异常);elsedbms_output.put_line(设备运行正常);end if;end;*******************************************************************************************