Oracle-plsql_基本类型

-----语法 
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;

  


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值