记录相当于JAVA中的DTO,它代表的是一种类型,一种数据结构.它不是数组或列表.所以我们把一个查询结果赋给一个记录时,
查询结果应该只有一条,而不是多条.
自定义记录如下:
sql 代码
- DECLARE
- TYPE record_sale IS RECORD (
- area_code VARCHAR2 (10) NOT NULL DEFAULT 'NO_AREA',
- YEAR INTEGER NOT NULL := 1701,
- MONTH INTEGER NOT NULL := 1,
- SDATE INTEGER NOT NULL := 1,
- SALEROOM NUMBER NOT NULL := 0,
- SALER VARCHAR2 (10) NOT NULL := 'who?'
- );
- var_sale record_sale;
- i NUMBER := 1;
- BEGIN
- var_sale.area_code := 'WUHAN';
- var_sale.YEAR := 1324;
- var_sale.MONTH := 10;
- var_sale.sdate := 3;
- var_sale.saleroom := 435.23;
- var_sale.saler := 'wanwei';
- LOOP
- var_sale.YEAR := var_sale.YEAR + 1;
- var_sale.MONTH := var_sale.MONTH + 1;
- var_sale.sdate := var_sale.MONTH + 1;
- var_sale.saleroom := var_sale.saleroom + 100;
- INSERT INTO T_SALE_TEST VALUES var_sale;
- i := i + 1;
- EXIT WHEN i = 10;
- END LOOP;
- COMMIT;
- END;
- /
要注意的是,NOT NULL 字段要赋初值.
另外LOOP还有两种写法:
sql 代码
- for idx in 1..10 loop
- var_sale.YEAR := var_sale.YEAR + 1;
- var_sale.MONTH := var_sale.MONTH + 1;
- var_sale.sdate := var_sale.MONTH + 1;
- var_sale.saleroom := var_sale.saleroom + 100;
- INSERT INTO T_SALE_TEST VALUES var_sale;
- END LOOP;
sql 代码
- WHILE (i < 10) LOOP
- var_sale.YEAR := var_sale.YEAR + 1;
- var_sale.MONTH := var_sale.MONTH + 1;
- var_sale.sdate := var_sale.MONTH + 1;
- var_sale.saleroom := var_sale.saleroom + 100;
- INSERT INTO T_SALE_TEST VALUES var_sale;
- i := i + 1;
- END LOOP;
其中第一种和第三种变量i要在declare中定义.
想得到一张表的记录,简单的用:table_name%ROWTYPE.同样,一个游标的记录可以用:cursor_name%ROWTYPE.
还有,记录不是也不可能存在数据库中的,当我们定义一个记录类型时,并没有分配相应的内存,只在定义某个记录的变量时才开始分配内存.