PL/SQL基本结构---PLSQL复合类型---表类型变量table

表类型变量table 
语法如下: 
     type 表类型  is table of  类型  index by binary_integer; 
     表变量名  表类型; 
类型可以是前面的类型定义,index by binary_integer 子句代表以符号整数为索引,这样访问表
类型变量中的数据方法就是“表变量名(索引符号整数)”。table类型,相当于java中的Map容器,
就是一个可变长的数组,key(符号整数索引)必须是整数,可以是负数,value(类型)可以是
标量,也可以是record类型。可以不按顺序赋值,但必须先赋值后使用。 
1. 定义一维表类型变量 
    ――――――――――――――――――――――――――――――――――――― 
    declare 
         type t_tb is table of varchar2(20) index by binary_integer; 
         v_tb t_tb; 
    begin 
       v_tb(100):=‘hello‘; 
       v_tb(98):=‘world‘; 
       dbms_output.put_line(v_tb(100)); 
       dbms_output.put_line(v_tb(98)); 
    end;     
    类型为record的表类型变量  
    declare 
         type t_rd is record(id number,name varchar2(20)); 
         type t_tb is table of t_rd index by binary_integer; 
         v_tb2 t_tb; 
    begin 
         v_tb2(100).id:=1; 
         v_tb2(100).name:=‘hello‘; 
         --dbms_output.put_line(v_tb2(100).id); 
         --dbms_output.put_line(v_tb2(100).name); 
         dbms_output.put_line(v_tb2(100).id||‘     ‘||v_tb2(100).name); 
    end; 
    ―――――――――――――――――――――――――――――――――――――

2. 定义多维表类型变量 
该程序定义了名为tabletype1的多维表类型,相当于多维数组,table1是多维表类型变量,将数
据表tempuser.testtable中recordnumber为60的记录提取出来 
存放在table1中并显示。 
    ――――――――――――――――――――――――――――――――――――― 
    declare 
       type tabletype1 is table of testtable%rowtype index by binary_integer; 
       table1 tabletype1; 
    begin 
        select * into table1(60) from tempuser.testtable where recordnumber=60; 
        dbms_output.put_line(table1(60).recordnumber||table1(60).currentdate); 
    end; 
    
   备注:在定义好的表类型变量里,可以使用count、delete、first、last、next、exists和prior
等属性进行操作,使用方法为“表变量名.属性”,返回的是数字。 
     
    set serveroutput on 
    declare 
         type tabletype1 is table of varchar2(9) index by binary_integer; 
         table1 tabletype1; 
    begin 
         table1(1):=‘成都市‘; 
         table1(2):=‘北京市‘; 
         table1(3):=‘青岛市‘; 
         dbms_output.put_line(‘总记录数:‘||to_char(table1.count)); 
         dbms_output.put_line(‘第一条记录:‘||table1.first); 
         dbms_output.put_line(‘最后条记录:‘||table1.last); 
         dbms_output.put_line(‘第二条的前一条记录:‘||table1.prior(2)); 
         dbms_output.put_line(‘第二条的后一条记录:‘||table1.next(2)); 
     end; 
     ――――――――――――――――――――――――――――――――――――― 
***************************************** 
      %type和%rowtype 
***************************************** 
使用%type定义变量,为了让PL/SQL中变量的类型和数据表中的字段的数据类型一致,Oracle 
9i提供了%type定义方法。这样当数据表的字段类型修改后,PL/SQL程序中相应变量的类型也
自动修改。 
     ――――――――――――――――――――――――――――――――――――― 
     create table student( 
        id number, 
        name varchar2(20), 
        age number(3,0) 
     ); 
     insert into student(id,name,age) values(1,‘susu‘,23); 
     --查找一个字段的变量 
     declare 
        v_name varchar2(20); 
        v_name2 student.name%type; 
     begin 
        select name into v_name2 from student where rownum=1; 
        dbms_output.put_line(v_name2); 
     end; 
     --查找多个字段的变量 
     declare 
         v_id student.id%type; 
         v_name student.name%type; 
         v_age student.age%type; 
     begin 
       select id,name,age into v_id,v_name,v_age from student where rownum=1; 
       dbms_output.put_line(v_id||‘   ‘||v_name||‘   ‘||v_age); 
     end; 
     --查找一个类型的变量,推荐用* 
     declare 
        v_student student%rowtype; 
     begin 
        select * into v_student from student where rownum=1; 
        dbms_output.put_line(v_student.id||‘   ‘||v_student.name||‘   ‘||v_student.age); 
     end; 
     --也可以按字段查找,但是字段顺序必须一样,不推荐这样做 
     declare 
        v_student student%rowtype; 
     begin 
      select id,name,age into v_student from student where rownum=1; 
      dbms_output.put_line(v_student.id||‘   ‘||v_student.name||‘   ‘||v_student.age); 
     end; 
     declare 
        v_student student%rowtype; 
     begin 
      select id,name,age into v_student.id,v_student.name,v_student.age from student where 
id=1; 
      --select * into v_student.id,v_student.name,v_student.age from student where id=1; 
      dbms_output.put_line(); 
     end; 
     ――――――――――――――――――――――――――――――――――――― 
    备注:insert,update,delete,select都可以,create table,drop table不行。DPL,DML,
和流程控制语句可以在pl/sql里用,但DDL语句不行。 
     
     declare 
        v_name student.name%type:=‘wang‘; 
     begin 
        insert into student(id,name,age) values(2,v_name,26); 
     end; 
     
     begin 
        insert into student(id,name,age) values(5,‘hehe‘,25); 
     end; 
     declare 
        v_name student.name%type:=‘hexian‘; 
     begin 
        update student set name=v_name where id=1; 
     end; 
     begin 
        update student set name=‘qinaide‘ where id=2; 
     end; 
     ―――――――――――――――――――――――――――――――――――――

时间: 2024-11-10 07:36:06

PL/SQL基本结构---PLSQL复合类型---表类型变量table的相关文章

PL/SQL基本结构---PLSQL复合类型---记录类型record

记录类型record  record类型最常用,声明的时候可以加not null,但必须给初始值,如果record类型一致可以相互赋值,如果类型不同,里面的字段恰好相同,不能互相赋值.引用记录型变量的方法是“记录变量名.基本类型变量名”.    ―――――――――――――――――――――――――――――――――――――    declare         type t_first is record(              id number(3),              name v

PL/SQL基本结构---PLSQL复合类型---流程控制

*****************************************    PLSQL流程控制 ***************************************** if判断 declare         v_b boolean:=true; begin if v_b then           dbms_output.put_line('ok');        end if; end; if else判断 declare          v_b boolea

PL/SQL程序结构概要

一.条件与顺序控制 IF语句 要点: a.一个if总要有一个匹配的end if: b.在关键字end和if之间一定要有空格: c.关键字elsif中不要夹带e: d.只在关键字end if后使用分号(:) 具体表现形式: a.IF THEN END IF if和then之间的条件决定then与end if之间的逻辑是否会被执行:如果条件为false或null时,指定逻辑不被执行. b.IF THEN ELSE END IF 此种情况实现了逻辑上的二选一:通过if与then之间的条件结果决定是th

解决登录PL/SQL 对象窗口查看Tables没有表的问题.

有时候PL/SQL登陆上在左侧对象窗口查看表的时候,没有显示,注意现在系统显示的用户: 可以先查看一下当前用户有没有创建表, select count(*) from user_tables; 一般选择为,当前用户就可以显示出来TABLES了!

PL\SQL 打开时出现"动态执行表不可访问,本会话的自动统计被禁止"

这个报错信息在不同的PL/SQL Developer版本都会出现,从上面详细的报错提示信息中我们可以判断得到,报错原因不在工具本身. 在此,详细记录一下这个小问题的三种处理方法. 1.第一种处理方法(不推荐) 就是在报错的Error对话框中将"Don't show this message again"选项选中,下次就不在提示这个错误了. 这种方法应该可以叫做"鸵鸟方式"的处理方法.没有从根本上解决这个问题. 2.第二种处理方法(可以采纳) 报错信息中描述的非常详细

PL/SQL基本结构---函数

数据类型转换函数 PL/SQL程序中提供了很多函数供扩展功能,除了标准SQL语言的函数可以使用外,最常见的数据类型转换函数有以下3个.      To_char:将其他类型数据转换为字符型.      To_date:将其他类型数据转换为日期型.       To_number:将其他类型数据转换为数值型. 系统输出打印      利用pl/sql在数据库服务器端打印一句话:      --set serveroutput on--设置数据库输出,默认为关闭,每次重新打开窗口需要重新设置.   

PL/SQL基本结构---基本数据类型变量

1. 基本数据类型      Number 数字型       Int 整数型       Pls_integer 整数型,产生溢出时出现错误       Binary_integer 整数型,表示带符号的整数       Char 定长字符型,最大255个字符       Varchar2 变长字符型,最大2000个字符       Long 变长字符型,最长2GB       Date 日期型       Boolean 布尔型(TRUE.FALSE.NULL三者取一)       在PL/

PL/SQL 导出dmp文件时发现表少了

(1)查看日志,是否有如下提示信息: EXP-00003: no storage definition found for segment(0, 0) 解决方法: http://www.it165.net/database/html/201404/6145.html sys登陆 show parameter deferred_segment_creation; alter system set deferred_segment_creation = false;(自己尝试后还是缺少表) (2)若

PL/SQL基本结构---表达式

1. 数值表达式 算术运算符包括+(加法).-(减法).*(乘法)./(除法 )和**(乘方)等 2. 字符表达式 字符表达式由字符型常数.变量.函数和字符运算符组成,唯一可以使用的字符运算符就是连接运算符“||”. 3. 关系表达式 关系表达式由字符表达式或数值表达式与关系运算符组成,可以使用的关系运算符包括以下9种.      < 小于      > 大于      = 等于(不是赋值运算符:=)      like  类似于      in 在……之中      <= 小于等于