
CREATE OR REPLACE PROCEDURE TEST_RECORD
AS
TYPE user_record_type IS RECORD(
id users id%TYPE
login_id users login_id%TYPE
name users name%TYPE);
u_r_t user_record_type;
BEGIN
FOR recd IN (SELECT FROM users) LOOP
SELECT id login_id name INTO u_r_t FROM users WHERE id=recd id;
dbms_output put_line( ID: ||u_r_t id || LOGIN_ID: ||u_r_t login_id|| NAME: ||u_r_t name);
END LOOP;
NULL;
END;
一 什么是记录(Record)?
由单行多列的标量构成的复合结构 可以看做是一种用户自定义数据类型 组成类似于多维数组
将一个或多个标量封装成一个对象进行 *** 作 是一种临时复合对象类型
记录可以直接赋值 RECORD :=RECORD
记录不可以整体比较
记录不可以整体判断为空
二 %ROWTYPE和记录(Record)?
请区别%ROWTYPE和记录(Record)类型 %ROWTYPE可以说是Record的升级简化版
区别在与前者结构为表结构 后者为自定义结构 二者在使用上没有很大区别 前者方便 后者灵活 在实际中根据情况来具体决定使用
Record + PL/SQL表可以进行数据的多行多列存储
三 如何创建和使用记录?
①创建记录类型
语法
TYPE 记录名 IS RECORD
(
filed type [NOT NULL] [ =eXPr ]
filedN typen [NOT NULL] [ =exprn]
)
其中 filed 是标量的名字
②声明记录类型变量
记录类型变量名 记录类型
③填充记录
④访问记录成员
记录类型变量名 filed
记录类型变量名 filedN
注意
表字段类型修改后 还需要修改记录字段类型 有时候可能会忘记 从而出现错误
对于记录内每个字段(filed ) 可以指定也可以使用%TYPE和%ROWTYPE动态指定记录字段类型
好处是表字段发生变化 记录字段自动改变 但是 由于每次执行前 遇到%TYPR或%ROWTYPE
数据库系统都会去查看对应表字段类型 会造成一定的数据库开销 如果系统中大量使用记录类型 则对性能会有一定影响
另外如果删除了某一字段 而自定义记录中使用了该字段 也会有可能忘记删除该字段
对数据库负荷偏低的系统 性能问题一般可以不重点关注 但是对于高负荷数据库服务器
各个环节都要考虑性能问题 每处节省一点出来 性能整体就有很大提高
语法
TYPE 记录名 IS RECORD
(
filed table Filed%Type [NOT NULL] [ =eXPr ]
filed table Filed%Type [NOT NULL] [ =eXPr ]
filedn table Filed%Type [NOT NULL] [ =exprn]
);
例子 记录可以整体赋值
Declare
Type EmpType is Record(
EMPNO number( )
ENAME varchar ( )
JOB varchar ( )
SAL number( )
DEPTNO number( )
);
EmpRec EmpType;
EmpRec EmpType;
Begin
EmpRec Empno:= ;
EmpRec Ename:= SMITH ;
EmpRec Job:= CLERK ;
EmpRec Sal:= ;
EmpRec Deptno:= ;
EmpRec := EmpRec ;
DBMS_output put_line(EmpRec empno);
End;
例子 记录不可以整体比较 只可以比较记录字段
Declare
Type EmpType is Record(
EMPNO number( )
ENAME varchar ( )
JOB varchar ( )
SAL number( )
DEPTNO number( )
);
EmpRec EmpType;
EmpRec EmpType;
Begin
EmpRec Empno:= ;
EmpRec Ename:= SMITH ;
EmpRec Job:= CLERK ;
EmpRec Sal:= ;
EmpRec Deptno:= ;
if EmpRec sal < EmpRec sal then
DBMS_output put_line( Xiao Xiao Xiao );
end if;
End;
例子 记录不可以整体判断为空 只可以判断记录字段
Declare
Type EmpType is Record(
EMPNO number( )
ENAME varchar ( )
JOB varchar ( )
SAL number( )
DEPTNO number( )
);
EmpRec EmpType;
Begin
if EmpRec ename is null then
DBMS_output put_line( Kong Kong Kong );
end if;
End;
例子 使用%TYPE和%ROWTYPE动态指定记录字段
DECLARE
Type MyRecType Is Record
(
RENO EMPA EMPNO%Type
RENAME EMPA ENAME%Type
RJOB EMPA JOB%Type
);
EmpRec MyRecType;
Begin
Select EMPNO ENAME JOB InTo EmpRec From empa Where empa EMPNO = ;
If EmpRec RJOB = CLERK Then
DBMS_OUTPUT PUT_LINE( Name: ||EmpRec RENAME);
End If;
End;
例子 数据集中的记录和记录类型中的数据关系
DECLARE
Type MyRecType Is Record
(
RENO EMPA EMPNO%Type
RENAME EMPA ENAME%Type
RJOB EMPA JOB%Type
);
EmpRec MyRecType;
vJob EMPA JOB%Type;
Begin
Select EMPNO ENAME JOB InTo EmpRec From empa Where empa EMPNO = ;
DBMS_OUTPUT PUT_LINE( MyRecType RJOB: ||EmpRec RJOB);
EmpRec RJOB := 修改值后 ;
DBMS_OUTPUT PUT_LINE( MyRecType RJOB: ||EmpRec RJOB);
Select JOB InTo vJob from empa Where empa EMPNO = EmpRec RENO;
DBMS_OUTPUT PUT_LINE( EMPA JOB: ||vJob);
End;
/
四 使用记录向表中插入数据?
根据表结构合理安排记录字段 比如主外键
如果用记录(RECORD)插入数据 那么只能使用记录成员
如果用%ROWTYPE插入数据 可以直接使用%ROWTYPE
例子 使用记录成员向表中插入数据
DECLARE
Type MyRecType Is Record
(
RENO EMPA EMPNO%Type
RENAME VARCHAR ( )
RJOB EMPA JOB%Type
);
EmpRec MyRecType;
Begin
Select EMPNO ENAME JOB InTo EmpRec From empa Where empa EMPNO = ;
DBMS_OUTPUT PUT_LINE(EmpRec RENO|| ||EmpRec RENAME|| ||EmpRec RJOB);
EmpRec RENO := ;
EmpRec RENAME := 杰克 ;
EmpRec RJOB := 办事员 ;
Insert InTo empa(EMPNO ENAME JOB) Values(EmpRec RENO EmpRec RENAME EmpRec RJOB);
Select EMPNO ENAME JOB InTo EmpRec From empa Where empa EMPNO = ;
DBMS_OUTPUT PUT_LINE(EmpRec RENO|| ||EmpRec RENAME|| ||EmpRec RJOB);
End;
五 使用记录更新数据?
如果用记录(RECORD)更新数据 那么只能使用记录成员
如果用%ROWTYPE更新数据 可以直接使用%ROWTYPE
例子 使用%ROWTYPE向表中插入数据
DECLARE
vEmp empa%RowType;
Begin
Select InTo vEmp From empa Where empa EMPNO = ;
UpDate empa Set ROW = vEmp Where EMPNO = ;
End;
六 使用记录删除数据?
lishixinzhi/Article/program/Oracle/201311/17783
oracle的存储过程要获取结果集的话,建议你用游标;
如下:
包和存储过程的修改
1、包内定义的变量deptrec类型更改为:
TYPE deptrec IS REF CURSOR;
2、存储过程 procedure query_dept(dept_no number)
增加输出参数:
procedure query_dept(dept_no number,p_res OUT deptrec);
3、存储过程内容更改为:
procedure query_dept(dept_no number,p_res OUT deptrec)
is
sqlstr VARCHAR2(512);
begin
if check_dept(dept_no)=1 then
sqlstr := 'select from dept where deptno=:d_no';
OPEN p_res FOR sqlstr USING dept_no;
end if;
end query_dept;
java代码的调用如下:
CallableStatement st = connprepareCall("{call query_dept(,)}");
stsetLong(1,deptno);
stregisterOutParameter(2,OracleTypesCURSOR);
stexecute();
ResultSet r = (ResultSet)stgetObject(1);
while(rnext()){
// rgetLong(dept_no);之类的了
}
如不想定义deptrec,可以直接把过程的输出参数更改为p_res OUT sys_refcursor,其它过程内部及java获取同上
常用的数据库字段类型如下:
字段类型 中文说明 限制条件 其它说明
CHAR 固定长度字符串 最大长度2000 bytes
VARCHAR2 可变长度的字符串 最大长度4000 bytes 可做索引的最大长度749
NCHAR 根据字符集而定的固定长度字符串 最大长度2000 bytes
NVARCHAR2 根据字符集而定的可变长度字符串 最大长度4000 bytes
DATE 日期(日-月-年) DD-MM-YY(HH-MI-SS) 经过严格测试,无千虫问题
LONG 超长字符串 最大长度2G(231-1) 足够存储大部头著作
RAW 固定长度的二进制数据 最大长度2000 bytes 可存放多媒体图象声音等
LONG RAW 可变长度的二进制数据 最大长度2G 同上
BLOB 二进制数据 最大长度4G
CLOB 字符数据 最大长度4G
NCLOB 根据字符集而定的字符数据 最大长度4G
BFILE 存放在数据库外的二进制数据 最大长度4G
ROWID 数据表中记录的唯一行号 10 bytes 格式,为0或1
NROWID 二进制数据表中记录的唯一行号 最大长度4000 bytes
NUMBER(P,S) 数字类型 P为整数位,S为小数位
DECIMAL(P,S) 数字类型 P为整数位,S为小数位
INTEGER 整数类型 小的整数
FLOAT 浮点数类型 NUMBER(38),双精度
REAL 实数类型 NUMBER(63),精度更高
数据类型 参数 描述
char(n) n=1 to 2000字节 定长字符串,n字节长,如果不指定长度,缺省为1个字节长(一个汉字为2字节)
varchar2(n) n=1 to 4000字节 可变长的字符串,具体定义时指明最大长度n,这种数据类型可以放数字、字母以及ASCII码字符集(或者EBCDIC等数据库系统接受的字符集标准)中的所有符号。
如果数据长度没有达到最大值n,Oracle 8i会根据数据大小自动调节字段长度,如果你的数据前后有空格,Oracle 8i会自动将其删去。VARCHAR2是最常用的数据类型。可做索引的最大长度3209。
number(m,n) m=1 to 38
n=-84 to 127 可变长的数值列,允许0、正值及负值,m是所有有效数字的位数,n是小数点以后的位数。
如:number(5,2),则这个字段的最大值是99,999,如果数值超出了位数限制就会被截取多余的位数。
如:number(5,2),但在一行数据中的这个字段输入575316,则真正保存到字段中的数值是57532。
如:number(3,0),输入575316,真正保存的数据是575。
date 无 从公元前4712年1月1日到公元4712年12月31日的所有合法日期,Oracle 8i其实在内部是按7个字节来保存日期数据,在定义中还包括小时、分、秒。
缺省格式为DD-MON-YY,如07-11月-00 表示2000年11月7日。
long 无 可变长字符列,最大长度限制是2GB,用于不需要作字符串搜索的长串数据,如果要进行字符搜索就要用varchar2类型。long是一种较老的数据类型,将来会逐渐被BLOB、CLOB、NCLOB等大的对象数据类型所取代。
raw(n) n=1 to 2000 可变长二进制数据,在具体定义字段的时候必须指明最大长度n,Oracle 8i用这种格式来保存较小的图形文件或带格式的文本文件,如Miceosoft Word文档。
raw是一种较老的数据类型,将来会逐渐被BLOB、CLOB、NCLOB等大的对象数据类型所取代。
long raw 无 可变长二进制数据,最大长度是2GB。Oracle 8i用这种格式来保存较大的图形文件或带格式的文本文件,如Miceosoft Word文档,以及音频、视频等非文本文件。
在同一张表中不能同时有long类型和long raw类型,long raw也是一种较老的数据类型,将来会逐渐被BLOB、CLOB、NCLOB等大的对象数据类型所取代。
blob /clob /nclob 无 三种大型对象(LOB),用来保存较大的图形文件或带格式的文本文件,如Miceosoft Word文档,以及音频、视频等非文本文件,最大长度是4GB。
LOB有几种类型,取决于你使用的字节的类型,Oracle 8i实实在在地将这些数据存储在数据库内部保存。
可以执行读取、存储、写入等特殊 *** 作。
bfile 无 在数据库外部保存的大型二进制对象文件,最大长度是4GB。
这种外部的LOB类型,通过数据库记录变化情况,但是数据的具体保存是在数据库外部进行的。
Oracle 8i可以读取、查询BFILE,但是不能写入。
大小由 *** 作系统决定。
number属于oracle内置数据类型 plsql也是兼容的
NUMBER ( precision, scale)
precision表示数字中的有效位。如果没有指定precision的话,Oracle将使用38作为精度。
scale表示数字小数点右边的位数,scale默认设置为0 如果把scale设成负数,Oracle将把该数字取舍到小数点左边的指定位数。
integer是准属于plsql的数据类型 一般我们使用 pls_integer
以上就是关于Oracle复合变量之RECORD全部的内容,包括:Oracle复合变量之RECORD、java调用oracle中定义的包内的存储过程如何取到包内记录类型的值、请教几个关于oracle数据库里常见数据类型的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)