-----语法
declare
-----声明部分
---定义变量 类型 以及 游标
begin
---- 执行部分 必须有内容
dbms_output.put_line('大家好 我的第一个 匿名块');
--exception
----异常处理 执行体
end;
--- 最简单的 匿名块
begin
dbms_output.put_line('hello');
end;
---------------- 定义变量
declare
v_empid number(4):=1111; ---定义 并赋初值
v_name varchar2(10):='风清扬';
v_date date :=sysdate;
v_boolean boolean :=true;
v_mgr binary_integer:=-1 ;
begin
dbms_output.put_line(v_empid);
dbms_output.put_line(v_name);
dbms_output.put_line(to_char(v_date,'yyyy-mm-dd'));
---dbms_output.put_line(v_boolean);---boolean 不能 使用 输出 用于条件判定
dbms_output.put_line(v_mgr);
end;
---- 变量赋值
declare
v_emp_id number(4);
begin
--- 赋值方式 1
v_emp_id:=12;
--- 赋值方式 2 借助一个查询语句
select my_num3.nextval into v_emp_id from dual;
dbms_output.put_line(v_emp_id);
insert into emp(empno) values(v_emp_id);
commit;
end;
select *from emp;
select my_num3.nextval from dual
----------- 类型 常量 not null
declare
v_empid number(4):=1111; ---定义 并赋初值
v_name constant varchar2(10):='清扬' ; --- 必须赋初值 不能被修改
v_date date not null :=sysdate; --- 必须赋初值 能被修改
v_boolean boolean :=true;
v_mgr binary_integer:=-1 ;
begin
-----变量可以修改
v_empid :=2222;
dbms_output.put_line('---------变量');
dbms_output.put_line(v_empid);
dbms_output.put_line('----------常量');
-- v_name:='风清扬'; -- 不能被修改
--- v_name:='清扬';
dbms_output.put_line(v_name);
dbms_output.put_line('----------not null');
v_date:=to_date('1999-12-12','yyyy-mm-dd');
dbms_output.put_line(to_char(v_date,'yyyy-mm-dd'));
dbms_output.put_line(v_mgr);
end;
-------- 复杂类型 ----
---列类型
declare
v_empno emp.empno%type;---- 已知emp表的empno 列的数据类型 引用给当前变量
v_job emp.job%type;
begin
----- 打印 King的 员工编号 不能select 做查询语句 可以做 赋值语句
select empno ,job into v_empno ,v_job from emp where ename='KING';
dbms_output.put_line(v_empno);
end;
----------------问题 不建议 变量名 和 表的列名称 相同 ---------
declare
empno emp.empno%type:=8888;---- 已知emp表的empno 列的数据类型 引用给当前变量
begin
----- 打印 King的 员工编号 不能select 做查询语句 可以做 赋值语句
select empno into empno from emp where empno=empno; ---- 返回了多条数据 不能给 一个变量赋值
dbms_output.put_line(empno);
end;
------------------------------
----- 行类型
declare
v_emprow emp%rowtype;
v_deptrow dept%rowtype;
begin
select * into v_emprow from emp where empno=7839;
select 1,2,3 into v_deptrow from dual;-- dept where deptno=v_emprow.deptno;
--行类型 变量 不能直接输出打印
dbms_output.put_line('员工编号'||v_emprow.empno||'员工姓名'||v_emprow.ename);
dbms_output.put_line('部门编号'||v_deptrow.deptno||'部门地址'||v_deptrow.loc);
end;
----记录类型 record
--------01
declare
-------声明一个记录类型
type my_record_type is record (
eno emp.empno%type,
empname emp.ename%type,
emphiredate emp.hiredate%type not null :=sysdate
) ;
-----声明一个记录类型 的变量
v_myinfo my_record_type;
--行类型变量
v_empinfo emp%rowtype;
begin
select * into v_empinfo from emp where empno=7839;
dbms_output.put_line('员工编号'||v_empinfo.empno||'员工姓名'||v_empinfo.ename||'工作'||v_empinfo.job);
select empno ,ename ,hiredate into v_myinfo from emp where empno=7839;
dbms_output.put_line('员工编号'||v_myinfo.eno||'员工姓名'||v_myinfo.empname||'入职日期'||v_myinfo.emphiredate);
end;
--------------02
declare
-------声明一个记录类型
type my_record_type is record (
empno emp.empno%type,
ename emp.ename%type,
emphiredate emp.hiredate%type not null :=sysdate
) ;
-----声明一个记录类型 的变量
v_myinfo my_record_type;
--行类型变量
v_empinfo emp%rowtype;
begin
select * into v_empinfo from emp where empno=7839;
dbms_output.put_line('员工编号'||v_empinfo.empno||'员工姓名'||v_empinfo.ename||'工作'||v_empinfo.job);
select empno ,ename ,hiredate into v_myinfo from emp where empno=0000; --- select 赋值语句 没有查到结果 会有异常
dbms_output.put_line('员工编号'||v_myinfo.empno||'员工姓名'||v_myinfo.ename||'入职日期'||v_myinfo.emphiredate);
end;
-------------------表类型 ----------------
--- 表类型 和行类型搭配
declare
----声明表类型 emp%rowtype 表中的每一行数据的 列类型
type my_table_type is table of emp%rowtype index by binary_integer;
---声明一个表类型的变量
v_myinfos my_table_type;
begin
select * into v_myinfos(1) from emp where empno=7839;
select * into v_myinfos(2) from emp where empno=7369;
dbms_output.put_line(v_myinfos(1).empno||v_myinfos(1).ename);
dbms_output.put_line(v_myinfos(2).empno||v_myinfos(2).ename);
end;
-------表类型 和记录类型搭配
declare
---记录类型
type emp_row_record is record(
empno emp.empno%type,
ename emp.ename%type,
ehiredate emp.hiredate%type
);
---表类型
type my_table_type is table of emp_row_record index by binary_integer;
---定义变量
v_myinfos my_table_type;
begin
select empno,ename,hiredate into v_myinfos(10) from emp where empno=7369;
dbms_output.put_line(v_myinfos(10).empno||v_myinfos(10).ename||v_myinfos(10).ehiredate);
end;
-------表类型 和列类型搭配 一列数据
declare
---表类型
type my_table_type is table of number(4) index by binary_integer;
---定义变量
v_myinfos my_table_type;
begin
select empno into v_myinfos(10) from emp where empno=7369;
dbms_output.put_line(v_myinfos(10));---------v_myinfos(10) --
end;
------------------ 将返回的所有数据 赋值给指定表类型变量
declare
---表类型
type my_table_type is table of number(4) index by binary_integer;
---定义变量
v_myinfos my_table_type;
begin
select empno bulk collect into v_myinfos from emp ;---bulk collect into 所有数据 赋值给指定表类型变量
dbms_output.put_line(v_myinfos(1));
dbms_output.put_line(v_myinfos(2));
dbms_output.put_line(v_myinfos(3));
dbms_output.put_line(v_myinfos(4));
end;
----------- 可变 数组 类型
declare
type array_type is varray(5) of number(4) ;---- 定义数组类型 被使用时 最大的存放 5个数据 每个数据的类型是 number(4)
--变量‘
v_myarray array_type:= array_type(); ---必须 赋初值 长度 (数组的初始化 长度是 0 并且长度最大到5 )
begin
v_myarray.extend;--- 扩容一个
v_myarray(1):=111;
v_myarray.extend;--- 扩容一个
v_myarray(2):=222;
v_myarray.extend;--- 扩容一个
v_myarray(3):=333;
v_myarray.extend;--- 扩容一个
v_myarray(4):=444;
v_myarray.extend;--- 扩容一个
v_myarray(5):=555;
----------- 数组容量 最大
v_myarray.extend;--- 扩容一个 报错 下标超出限制
dbms_output.put_line(v_myarray(1));
dbms_output.put_line(v_myarray(5));
end;
-------------- 指定数组的内容 长度
declare
type array_type is varray(5) of number(4) ;---- 定义数组类型 被使用时 最大的存放 5个数据 每个数据的类型是 number(4)
--变量‘
v_myarray array_type:= array_type(5,4,3,2,1); --- (数组的初始化 内容就是 数组的内容 )
begin
dbms_output.put_line(v_myarray(1));
dbms_output.put_line(v_myarray(2));
dbms_output.put_line(v_myarray(3));
dbms_output.put_line(v_myarray(4));
dbms_output.put_line(v_myarray(5));
end;
----- 数组 类型 记录类型
declare
type my_record is record(
ename emp.ename%type,
sal emp.sal%type
);
--数组类型
type array_type is varray(16) of my_record;
--变量
v_infos array_type:=array_type();
begin
--- 赋值 单条
--v_infos.extend;
-- select ename,sal into v_infos(1) from emp where empno=8888;
----- 赋值多条 bulk collect 自动扩容
select ename,sal bulk collect into v_infos from emp ;
dbms_output.put_line(v_infos(1).ename||v_infos(1).sal);
dbms_output.put_line(v_infos(10).ename||v_infos(10).sal);
dbms_output.put_line(v_infos(16).ename||v_infos(16).sal);
end;
--------------- 数组 表 属性
declare
type table_type is table of emp%rowtype index by binary_integer;
type array_type is varray(10) of dept%rowtype;
--声明变量
v_table table_type;
v_array array_type:=array_type();
--- 记录元素的个数
v_count number(2);
begin
--- 赋值操作
select * bulk collect into v_table from emp ;
select * bulk collect into v_array from dept ;---- 自动扩容
dbms_output.put_line('-----------count 返回当前集合中 内容的数量 ------------');
v_count:=v_table.count;
dbms_output.put_line('table ---'||v_count);
v_count:=v_array.count;
dbms_output.put_line('array ---'||v_count);
dbms_output.put_line('-----------exists 指定元素是否存在------------');
if v_table.exists(17) then
dbms_output.put_line('存在');
end if;
if v_array.exists(5) then
dbms_output.put_line('存在');
end if;
dbms_output.put_line('-----------trim 数组 删除最后一位 ------------');
dbms_output.put_line('array 4'||v_array(1).loc||v_array(2).loc||v_array(3).loc||v_array(4).loc);
--v_array.trim() ;
v_array.trim(3); ---删除最后三位 3 表删除多少个 删除之后 数量会减少
dbms_output.put_line('array 4'||v_array(1).loc);
dbms_output.put_line('array ---'||v_array.count);
if v_array.exists(1) then
dbms_output.put_line('1存在');
end if;
if v_array.exists(2) then
dbms_output.put_line('2存在');
end if;
if v_array.exists(3) then
dbms_output.put_line('3存在');
end if;
if v_array.exists(4) then
dbms_output.put_line('4存在');
end if;
dbms_output.put_line('-----------delete 表 删除指定位置 ------------');
--v_table.delete(); -- 将数据清空
dbms_output.put_line('table ---'||v_table.count);
v_table.delete(1);--删除 指定 位的元素 表示当前行的数据 清除 不会影响其他行
dbms_output.put_line('table --- 1'||v_table(2).ename);
dbms_output.put_line('table --delete 1 之后-'||v_table.count);
------------------------------------------------------
dbms_output.put_line('table -'||v_table.first);
dbms_output.put_line('table -'||v_table.last);
dbms_output.put_line('array -'||v_array.first);
dbms_output.put_line('array -'||v_array.last);
dbms_output.put_line('table -'||v_table.next(2));
dbms_output.put_line('table -'||v_table.prior(2));
dbms_output.put_line('array -'||v_array.next(4));
dbms_output.put_line('array -'||v_array.prior(0));
----- limit 数组 ----- mysql 分页语句
dbms_output.put_line('array -'||v_array.limit); --- 数组的最大容量
end;
--------------- 作用域 嵌套
declare
v_id number(5) :=10;
begin
declare v_name varchar2(20);
begin
dbms_output.put_line('v_id -'||v_id);
v_name:='行不行';
dbms_output.put_line('v_name -'||v_name);
end;
dbms_output.put_line('v_id -'||v_id);
--v_name:='行不行';
-- dbms_output.put_line('v_name -'||v_name);
end;
----------------- 使用 DML 可以返回数据 当前受影响的行数据 可以单行 或者 多行
declare
v_id number(4) ;
v_date date;
type array_type is varray(20) of number(4);
emp_array array_type:=array_type();
begin
insert into emp(empno,ename,hiredate) values(1015,'java',to_date('2019-10-14','yyyy-mm-dd'));
---返回一行
insert into emp(empno,ename,hiredate) values(1014,'java',to_date('2019-10-14','yyyy-mm-dd')) returning empno,hiredate into v_id,v_date;
dbms_output.put_line('v_id - '||v_id ||' v_date '||v_date);
---返回多行
delete from emp returning empno bulk collect into emp_array;
dbms_output.put_line('emp_array 数量'||emp_array.count);
dbms_output.put_line(emp_array(1));
dbms_output.put_line(emp_array(16 ));
end;