Oracle学习05——PL/SQL的基本语法

作业
1-声明三个变量,初始值 分别为1,2,3,然后输出三个值的平均值、三个值的最大值。declare…begin…end

set serveroutput on
declare
num1 int;
num2 int;
num3 int;
begin
num1 := 1;
num2 := 2;
num3 := 3;
if num1 > num2 then
if num1 > num3 then
dbms_output.put_line('MAX : ' || num1);
else
dbms_output.put_line('MAX : ' || num3);
end if;
else
if num2 < num3 then
dbms_output.put_line('MAX  : ' || num3);
else
DBMS_OUTPUT.PUT_LINE('MAX  : ' || num2);
end if;
end if;
dbms_output.put_line('AVG:'||(num1+num2+num3)/3);
end;

在这里插入图片描述

2-number(7) number(7,2) 举例说明区别
number(7)是7位的整数,number(7,2) 是这个数字有7位数,有2位小数,5位整数
比如number(7):=1234567和number(7,2):=12345.67

3-字符类型主要包括哪些?
字符类型主要包括VARCHAR2、CHAR、 LONG、 NCHAR和NVARCHAR2等。这些类型的变量用来存储字符串或字符数据。

4-列举基本数据类型和三种特殊数据类型
基本数据类型有数值类型、字符类型、日期类型、布尔类型
数值类型主要包括NUMBER、PLS_ INTEGER和BINARY_ INTEGER三种基本类型。其中,NUMBER类型的变量可以存储整数或浮点数;而BINARY_ INTEGER或PLS_ INTEGER类型的变量只存储整数。
字符类型主要包括VARCHAR2、CHAR、 LONG、 NCHAR和NVARCHAR2等。这些类型的变量用来存储字符串或字符数据。
日期类型只有一个种一一即DATE类型,用来存储8期和时间信息,DATE类型的存储空间
是7个字节,分别使用一一个字节存储世纪、年、月、天、小时、分钟和秒。
布尔类型也只有一种一一即BOOLEAN,主要用于程序的流程控制和业务逻辑判断,其变量值可以是TRUE、FALSE或NULL中的一种。
特殊数据类型
%TYPE
使用%type关键字可以声明一个与指定列名相同的数据类型,它通常紧跟在指定列名的后面。
RECORD
RECORD类型也称作“记录类型”,使用该类型的变量可以存储由多个列值组成的一行数据。在声明记录类型变量之前,首先需要定义记录类型,然后才可以声明记录类型的变量。记录类型是-一种结构化的数据类型,它使用type语句进行定义,在记录类型的定义结构中包含成员变量及其数据类型,使用该类型的变量可以存储多个列值组成的一行数据。
%ROWTYPE
%ROWTYPE类型的变量结合了“%TYPE类型”和“记录类型”变量的优点,它可以根据数据表中行的结构定义一种特殊的数据类型,用来存储从数据表中检索到的一.行数据。它的语法形式很简中,如下所示。

5-使用%type定义 v_name v_job 查询emp的ename和job 并赋值给v_name和v_job并打印值…decalare…begin…end

set serveroutput on
declare
v_name emp.ename%type;
v_job emp.job%type;
begin
select empno,ename,job from emp where empno='7369';
dbms_output.put_line('姓名'||v_name||'工作'||v_job);
end;

在这里插入图片描述

6-使用record重写题目5的代码和题目1的代码。
题目5:

set serveroutput on
declare
type emp_type is record
(
var_ename emp.ename%type,
var_job emp.job%type,
);
emp_info emp_type
begin
select empno,ename,job from emp where empno='7369';
dbms_output.put_line('姓名'||emp_info.v_name||'工作'||emp_info.v_job);
end;

在这里插入图片描述

7-使用%rowtype重写题目5的代码和题目1的代码。

set serveroutput on
declare
rowvar_emp emp%rowtype;
begin
select empno,ename,job from emp where empno='7369';
dbms_output.put_line('姓名'||rowvar_emp.ename||'工作'||rowvar_emp.job);
end;

在这里插入图片描述
在这里插入图片描述

8-手写[03 流程控制语句]课程中的代码:输入a的值 输入b的值 计算c的值(a+b) declare…begin…exception…end

declare
a int;
b int;
c number;
begin
dbms_output.put_line('请输入a的值');
a:=&a;
dbms_output.put_line('请输入b的值');
b:=&b;
c:=a+b;
dbms_output.put_line(c);
execuption
when **zero_divide** then
dbms_output.put_line('除数不能为零');
end;

9-手写[03 流程控制语句]课程中的代码:if 比较字符串大小并输出结果

declare
v_name1 varchar2(50);
v_name2 varchar2(50);
begin
v_name1:='aad';
v_name2:='akjajihg';
if length(v_name1)<length(v_name2) then
dbms_ouput.put_line('字符串'||v_name1||'的长度小于'||v_name2||'的长度');
end if;
end;

10-手写[03 流程控制语句]课程中的代码:if …elsif…then…比较字符串大小并输出结果

declare
v_name1 varchar2(50);
v_name2 varchar2(50);
begin
v_name1:='aad';
v_name2:='akjajihg';
if length(v_name1)<length(v_name2) then
dbms_ouput.put_line('字符串'||v_name1||'的长度小于'||v_name2||'的长度');
elsif length(v_name1)>length(v_name2) then
dbms_ouput.put_line('字符串'||v_name1||'的长度大于'||v_name2||'的长度');
elsif length(v_name1)=length(v_name2) then
dbms_ouput.put_line('字符串'||v_name1||'的长度等于'||v_name2||'的长度'); 
end if;
end;

11-手写[03 流程控制语句]课程中的代码:if …elsif…then…判断你的年纪是否为90后并输出结果(录入出身年与1990比较)

declare
age int;
year int;
begin
dbms_output.put_line('请输入你的年龄');
age:=&age;
year:=2020-age;
if year>=1990 then
dbms_output.put_line('你是90后');
else
dbms_output.put_line('你不是90后');
end if;
end;

12-
loop…exit when…end loop;
while…loop…end loop;
区别是什么?

loop会至少执行一次循环体,而while在一开始就判断条件,符合后才会执行循环体,两者的语法如下:
loop
循环执行的语句块;
Iexit when循环结束条件;
循环结束条件修改;
end loop;

while(循环结束条件) loop
循环执行的语句块;
循环结束条件修改;
end loop;

13-分别用
loop…exit when…end loop;
while…loop…end loop;
for…in…loop…end loop;
写代码计算:循环200次时,跳出循环…

declare
sum_i int:=0;
i int:=0;
begin
loop
i:=i+1;
sum_i:=sum_i+i;
exit when i=200;
end loop;
dbms_output_put_line(sum_i);
end;
declare
sum_i int:=0;
i int:=0;
begin
for i in 1..200
sum_i:=sum_i+i;
end loop;
dbms_output_put_line(sum_i);
end;
declare
sum_i int:=0;
i int:=0;
begin
while i<200
i:=i+1;
sum_i:=sum_i+i;
end loop;
dbms_output_put_line(sum_i);
end;

14-
case…when.then…else…end case;
请用代码说明函数用法.

在case关键字的后面有一个选择器,它通常是-一个变量,程序就从这个选择器开始执行,接下来是when子句,并且在when关键字的后面是- .个表达式,程序将根据选择器的值去匹配每个when子句中的表达式的值,从而实现执行不同的PL/SQL语句

declare
season int;
info varchar2(50);
begin
case season
when 1 then
info:=season||'季度包含1、2、3月份';
when 2 then
info:=season||'季度包含4、5、6月份';
when 3 then
info:=season||'季度包含7、8、9月份';
when 4 then
info:=season||'季度包含10、11、12月份';
else
info:=season'季度不合法';
end case;
dbms_output_put_line(info);
end;

15-
手写[04 PL SQL游标]课程中的显式游标代码-emp查询。

declare 
cursor cur_emp(var_job varchar2:='SALESMAN') is select empno,ename,sal form emp where job=var_job;//声明
type record_emp is record
(
var_empno emp.empno%type;
var_ename emp.ename%type;
var_sal emp.sal%type;
);
emp_row record_emp;
begin
open cur_emp;
fetch cur_emp into emp_row;
while cur_emp%found loop
dbms_output.put_line(emp_row.var_ename||emp_row.var_empno||'的编号是:'||emp_row.var_empno||',工资是:'||emp_row.var_sal);
fetch cur_emp into emp_row;
END LOOP;
CLOSE CUR_EMP;
end;

16-
手写[04 PL SQL游标]课程中的隐式游标代码-工资上调。

begin
update emp set sal=sal*(1+0.2) where job='SALESMAN';
if sql %nofound then
dbms_output.put_line('没有工资上调');
else
dbms_output.put_line('有'||sql%roecount||'个员工的工资上调20%');
end if;
end;

17-系统预定义异常有哪些?列举其中2个的例子代码说明…
(1)ZERO_DIVIDE除数为 0

declare
a int;
b int;
c number;
begin
dbms_output.put_line('请输入a的值');
a:=&a;
dbms_output.put_line('请输入b的值');
b:=&b;
c:=a/b;
dbms_output.put_line(c);
execuption
when **zero_divide** then
dbms_output.put_line('除数不能为零');
end;

(2)VALUE_ERROR赋值时,变量长度不足以容纳实际数据

declare
v_vara varchar2(1);
v_varb varchar2(4):='java';
begin
v_vara:=v_varb;
exception
when value_error then
dbms_output.put_line('赋值错误');
end;

18-用代码解释自定义异常用法…
找了一个用户自定义的例子,是自己定义错误代码和错误内容,然后再返回相关内容:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值