【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 ...
随机推荐
- Eclipse中GitLab的配置和使用入门
一.Eclipse中配置GitLab的前提条件 1.1:安装Git客户端 去官网https://git-scm.com/downloads下载合适的版本即可,一般开发环境是windows的就下载win ...
- Effective JavaScript Item 63 注意异步调用中可能会被忽略的异常
异常处理是异步编程的一个难点. 在同步的代码中,异常可以非常easy地通过try catch语句来完毕: try { f(); g(); h(); } catch (e) { // handle an ...
- vc2008中mfc菜单、控件等汉字显示为问号或乱码的解决方法
在vc2008中建立基于mfc的project.在向导的Application type页面中如果在resource language选项中选择"英语(美国)"(图一),那么在pr ...
- lvs 隧道模式请求没有回应的解决
众所周知,lvs共有三种转发机制:NAT,IPTUNNELING与DIRECT ROUTING 我在做隧道模式实验时遇到了一个问题,客户端向虚拟ip(即隧道0的ip)发送请求后,lvs服务器接收到了请 ...
- (纪录片)现代生活的秘密规则:算法 The Secret Rules of Modern Living: Algorithms
简介: The Secret Rules of Modern Living: Algorithms (2015) 导演: David Briggs主演: Marcus du Sautoy类型: 纪录片 ...
- linux:C++实现ping
转载自: //http://blog.chinaunix.net/uid-25909722-id-2762079.html #include <stdio.h> #include < ...
- 使用Filter过滤非法内容
1.首先,需要编写一个响应的封装器ResponseReplaceWrapper,用它来缓存response中的内容,代码如下: ResponseReplaceWrapper.java package ...
- Jenkins 集成Unity3D Xcode
如果Mac 上没有安装brew.先安装:ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)& ...
- sqlalchemy 获取计数 count
from sqlalchemy import func message_count = self.db.query(func.count(Message.uid)).filter(Message.ui ...
- 算法笔记_217:黑洞数(Java)
目录 1 问题描述 2 解决方案 1 问题描述 任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456.求这两个数字的差,得:41 ...