[TOC]
### 变量
*****
变量名 + 变量类型。声明变量:
```
countNum number(10); --别忘了写上具体的长度,并且以分号结束
maxId number(10); --别忘了写上具体的长度,并且以分号结束
```
定义`type`的写法为`type type_name is record(col_name col_type);`这样,括号里可以写多个,中间用`,`分割,但最后一个不能有`,`,具体如下
```
set serveroutput on;
DECLARE
TYPE new_type IS RECORD --以TYPE type_name IS RECORD开始
(
v_ly_nl LY_DS.LY_NL%TYPE,
v_ly_mc varchar(100) --最后不要加,
); --最后以 ;结束
v_obj new_type; --将新对象定义为刚才声明的类型
BEGIN
--into赋值给v_obj,会按照定义的type顺序赋值
select ly_nl,ly_mc into v_obj from ly_ds where id='2';
dbms_output.put_line('第一个变量:'||v_obj.v_ly_nl);
dbms_output.put_line('第二个变量:'||v_obj.v_ly_mc);
END;
```
通过`%ROWTYPE`的声明写法
`%ROWTYPE`该类型是提取行记录时常用的存储数据的方式。这种声明方式,可以直接引用表中的行作为变量类型,它同`%TYPE`在优点上类似,避免因表中字段的数据类型改变,而导致`PL/SQL`块出错的问题。
下边是`%ROWTYPE`的用法例子,挺简单的:
```
set serveroutput on;
DECLARE
v_obj ly_ds%rowtype; --ROWTYPE不区分大小写
BEGIN
--into赋值给v_obj,会按照定义的type顺序赋值
select * into v_obj from ly_ds where id='2';
dbms_output.put_line('第一个变量:'||v_obj.ly_nl);
dbms_output.put_line('第二个变量:'||v_obj.ly_mc);
END;
```
>注意一个地方,**就是上边的`into`前边,只能为`*`,如果要写为具体的列,那就要写全**。
### 流程控制
*****
if
```
if ... then
elsif ... then
else
end if;
```
case
```
declare i number;
BEGIN
select count(*) into i from DVD_DVD;
case i
when 0 then dbms_output.put_line(0);
when 1 then dbms_output.put_line(1);
when 2 then dbms_output.put_line(2);
when 3 then dbms_output.put_line(3);
when 4 then dbms_output.put_line(4);
when 5 then dbms_output.put_line(5);
else dbms_output.put_line('else');
end case;
end;
```
while
```
```
### 循环
无条件循环 LOOP
```
declare
i number := 1;
j number := 0;
begin
loop
/* 另一种写法
if i >= 11 then
exit;
end if;
*/
exit when i>=5;
j := j + i;
i := i + 1;
end loop;
dbms_output.put_line(j);
end;
```
while循环
```
declare
i number := 1;
j number := 1;
begin
while i <= 100 loop
if mod(i, 2) = 0 then
j := j * i;
end if;
i := i + 1;
end loop;
dbms_output.put_line(j);
dbms_output.put_line(length(to_char(j)));
end;
```
for 循环
```
declare
i number := 1;
j number := 1;
begin
for i in 1..100 loop
if mod(i, 2) = 0 then
j := j * i;
end if;
end loop;
dbms_output.put_line(j);
dbms_output.put_line(length(to_char(j)));
end;
```
### 日期转化
```
declare
c_d varchar2(30);
d_d date;
c_d := '2017-1-1 00:00:00';
s,'yyyy-mm-dd hh24:mi:ss')
c_d = to_char(d_d,'yyyy-mm-dd hh24:mi:ss')
```