【Oracle】Oracle中复合数据类型
1,常见的操作数据库的技术有那些
jdbc 使用java 访问数据库的技术
PLSQL (procedure 过程化sql) 在数据库内部操作数据的技术
proc/c++ c 和 c++ 访问数据库的技术
ODBC 微软提供访问数据库的技术
OCI oracle 底层的连接接口
2,Oracle中的复合数据类型
Oracle中的复合数据类型record,table,cursor
2.1 record类型
2.1.1 语法
/*定义一个record类型*/
type record类型名称 is record(
属性 数据类型,
属性 数据类型
...
);
/*使用record类型名称定义一个record变量*/
record变量名 record类型名称
也可以使用表的字段来定义,
/*使用表的字段类型定义一个record类型*/
type record类型名称 is record(
属性 表名.属性名%type,
属性 表名.属性名%type
...
);
/*使用record类型名称定义一个record变量*/
record变量名 record类型名称
2.1.2 示例
使用record类型存储来存储不同类型的数据:
set serveroutput on;
declare
type emptype is record(
id number,
name varchar2(5)
);
var_emp emptype;
begin
var_emp.id:=1;
var_emp.name:='jame';
dbms_output.put_line(var_emp.id);
end;
/
2.2 table类型
2.2.1 语法
/*定义一个table类型*/
type table类型名 is table of 元素类型名 index by binary_integer;
/*定义一个table变量*/
变量名 table类型名;
访问数据的方式,
table变量(下标):=值;
2.2.2 示例
使用表格存储同一种类型的数据:
declare
type numstype is table of number index by binary_integer;
var_nums numstype;
begin
var_nums(0):=9;
var_nums(1):=5;
var_nums(2):=2;
var_nums(3):=7;
var_nums(4):=0;
dbms_output.put_line(var_nums(3));/*打印下标为3的元素*/
end;
table中的数据也可以使用迭代的思想来操作
下标不连续时 遍历table类型的变量
迭代思想:
变量名.first() 获取第一个元素对应的下标 (元素对应的最小下标)
变量名.next(n) 根据一个元素的下标n 得到下一个元素对应的下标
变量名.last() 获取最后一个元素对应的下标
例如,使用迭代遍历表中的所有数据:
set serveroutput on;
declare
type numstype is table of number index by binary_integer;
var_nums numstype;
var_index binary_integer:=0;
begin
var_nums(0):=9;
var_nums(1):=5;
var_nums(-12):=2;
var_nums(3):=7;
var_nums(4):=0;
-- var_nums.count();
var_index := var_nums.first();
loop
dbms_output.put_line(var_nums(var_index));
var_index:=var_nums.next(var_index);
if var_index = var_nums.last() then
dbms_output.put_line(var_nums(var_index));
exit;
end if;
end loop;
end;
/
2.3 cursor类型
2.3.1 语法
/*声明游标*/
cursor 游标名 is select语句;
/*打开游标*/
open 游标名;
/*提取数据,将结果存储到变量中,一般都是record类型*/
fetch 游标名 into 变量;
/*关闭游标*/
close 游标名
2.3.2 游标的属性
% ISOPEN 判断游标是否打开,若打开就返回true,否则就返回false.
% ROWCOUNT 当前游标指针的偏移量.
%FOUND 如果游标提取到新数据,就返回true,否则就返回false.
%NOTFOUND 如果游标没有提取到新数据,就返回true,否则就返回false.
2.3.3 示例
遍历一个游标中的所有数据行:
declare
/*使用s_emp创建一个游标类型*/
cursor empcursor is select id,first_name,salary from s_emp;
/*使用游标创建一个record变量*/
var_emp empcursor % rowtype;
begin
open empcursor;
loop
fetch empcursor into var_emp;
/* 如果没有提取到 新数据 则结束循环 */
exit when empcursor%notfound;
dbms_output.put_line(var_emp.id||':'||var_emp.first_name||':'||var_emp.salary);
end loop;
close empcursor;
end;
/
/*
--也可以使用如下的的for循环快速的遍历游标中的数据
--使用for循环可以自动声明游标变量,可以自动打开游标,可以自动提取数据,可以自动关闭游标
--在调用游标类型的时候可以传递参数,上面的例子可以在打开游标的时候传入参数"open empcursor(20);"
declare
cursor empcursor(var_id number) is select id,first_name,salary from s_emp where id> var_id;
begin
FOR VAR_EMP IN empcursor(20) LOOP
dbms_output.put_line(var_emp.id||':'||var_emp.first_name||':'||var_emp.salary);
END LOOP;
end;
/
*/
2.3.4 参考游标 refer cursor
使用参考游标, 游标对应的sql语句,可以在程序执行的过程中发生改变 ,直到打开游标时确定对应的sql语句。
--定义一个参考游标类型
type 参考游标类型名 is ref cursor;
--使用这个类型 定义一个游标变量
游标变量 参考游标类型名;
--打开游标时 关联一个动态拼接好的字符串
open 游标变量 for SQL的字符串;
例如:
根据条件动态指定查询的数据,并且遍历所有得到的数据行:
declare
/*创建一个参考游标类型*/
type myrefcursor is ref cursor;
/*创建一个参考游标变量*/
refempcursor myrefcursor;
/* 为这个参考游标 定义一个动态字符串 */
sqlstr varchar2(200); var_id number:=10;
type emptype is record(
id s_emp.id%type,
salary s_emp.salary % type,
dept_id s_emp.dept_id%type
);
var_emp emptype;
begin
sqlstr := 'select id,salary,dept_id from s_emp';
if var_id != 0 then
sqlstr := sqlstr ||' where id > ' || var_id;
end if;
open refempcursor for sqlstr;
loop
fetch refempcursor into var_emp;
exit when refempcursor%notfound;
dbms_output.put_line(var_emp.id||':'||var_emp.salary||':'||var_emp.dept_id);
end loop;
close refempcursor;
end;
/
【Oracle】Oracle中复合数据类型的更多相关文章
- Oracle中的数据类型和数据类型之间的转换
Oracle中的数据类型 /* ORACLE 中的数据类型: char 长度固定 范围:1-2000 VARCHAR2 长度可变 范围:1-4000 LONG 长度可变 最大的范围2gb 长字符类型 ...
- C# 与 Oracle 中 BINARY_DOUBLE数据类型查询
Oracle 10g新增 BINARY_DOUBLE 数据类型,而.NET暂不支持这个类型,查询时需要转换为 NUMBER. eg: "SELECT RAWTOHEX(OID) AS OID ...
- Oracle数据库 中的基础的一些语法结构
方括号里的内容为可选项 大括号是必填 1PL/SQL结构块 DECLARE /* * 声明部分——定义常量.变量.复杂数据类型.游标.用户自定义异常 */ BEGIN /* * 执行部分——PL/SQ ...
- ORACLE数据库中执行计划出现INTERNAL_FUNCTION一定是隐式转换吗?
ORACLE数据库中,我们会使用一些SQL语句找出存在隐式转换的问题SQL,其中网上流传的一个SQL语句如下,查询V$SQL_PLAN的字段FILTER_PREDICATES中是否存在INTERNAL ...
- Oracle存储过程中异常Exception的捕捉和处理
Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...
- oracle表中字段的添加、删除
在oracle数据库中为一张表添加一个字段: alter table tableName add ClIENT_OS varchar2(20) default '0' not null ; 在orac ...
- ORACLE存储过程中%TYPE和%ROWTYPE的区别
ORACLE存储过程中%TYPE和%ROWTYPE的区别 在存储过程中%TYPE和%ROWTYPE常用来在PL/SQL中定义变量 因为 t_emp emp%rowtype ;这个语句的意思是 定义一个 ...
- oracle数据库——常用的数据类型
2018-12-19 23:08:03 oracle数据库中常用的数据类型有23种,我们把数据类型分为字符型.数字型.日期型和其他数据类型. 一.字符型: 数据类型 取值范围 (字节) 说明 v ...
- Oracle 过程中变量赋值
create or replace function get_sal1(id employees.employee_id%type) return number is sal employees.sa ...
随机推荐
- 转:查看linux系统版本号
转自: http://blog.csdn.net/zhuying_linux/article/details/6859286 lsb_release -a
- (转)SVN服务器搭建和使用(三) 附vs2013 svn插件
转自:http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2408089.html vs 2013 svn插件:http://www.visua ...
- hadoop集群配置SSH免登陆
今天给大家总结一下hadoop集群之间免登陆的步骤 node1 ssh node4 1.在node1中生成密钥 [root@node1 ~]# ssh-keygen -t dsa -P '' -f ~ ...
- mybatis 是如何与数据表对应上的 ?
MyBatis也需要进行表和实体 的关联.我们查询的是表,返回的结果是实体类.这之间有一个对应关系. 如果说实体类的属性和表的列名一一对应,名字一样,那就自动解决了这个问题.但是如果实体类的属性和表的 ...
- oauth2-server-php-docs 概念
PHP的OAuth2服务器库 将OAuth2.0干净地安装到您的PHP应用程序中. 从GitHub 下载代码开始. 要求 这个库需要PHP 5.3.9+.然而,有一个稳定的版本和开发分支的PHP 5. ...
- OpenGL ES 3.0顶点着色器(一)
OpenGL ES 3.0流程图 1.Vertex Shader(顶点着色器) 顶点着色实现了一种通用的可编程方法操作顶点. 顶点着色器的输入包括以下几个: • Shader program.程序的顶 ...
- Wifidog初分析
一.综述 wifidog是搭建无线热点认证系统的解决方案之一,他比nocat.nodog更适合互联网营销思路.常见的使用在openwrt系统上,它实现了路由器和认证服务器的数据交互,在路由器方(客户端 ...
- Nginx 用log_format设置日志格式
1.配置文件#vim /usr/local/nginx/conf/nginx.conflog_format access ‘$remote_addr – $remote_user [$time_loc ...
- MSSQL 2005/2008 日志压缩清理方法小结
适用于SQL Server 2005的方法 --------------------------------------------- 复制代码 代码如下: USE DNName GO 1,清理日志 ...
- 让你的ASP.NET虚拟主机也支持子网站
现在asp.net虚拟主机一般都可以绑定多个域名,但是通过这几个域名打开的页面都一样.如何使绑的这几个域名分别打开不通的页面(即实现子网站的功能)呢? 其实很简单,只需4个步骤: 1)给虚拟主机 ...