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中复合数据类型的更多相关文章

  1. Oracle中的数据类型和数据类型之间的转换

    Oracle中的数据类型 /* ORACLE 中的数据类型: char 长度固定 范围:1-2000 VARCHAR2 长度可变 范围:1-4000 LONG 长度可变 最大的范围2gb 长字符类型 ...

  2. C# 与 Oracle 中 BINARY_DOUBLE数据类型查询

    Oracle 10g新增 BINARY_DOUBLE 数据类型,而.NET暂不支持这个类型,查询时需要转换为 NUMBER. eg: "SELECT RAWTOHEX(OID) AS OID ...

  3. Oracle数据库 中的基础的一些语法结构

    方括号里的内容为可选项 大括号是必填 1PL/SQL结构块 DECLARE /* * 声明部分——定义常量.变量.复杂数据类型.游标.用户自定义异常 */ BEGIN /* * 执行部分——PL/SQ ...

  4. ORACLE数据库中执行计划出现INTERNAL_FUNCTION一定是隐式转换吗?

    ORACLE数据库中,我们会使用一些SQL语句找出存在隐式转换的问题SQL,其中网上流传的一个SQL语句如下,查询V$SQL_PLAN的字段FILTER_PREDICATES中是否存在INTERNAL ...

  5. Oracle存储过程中异常Exception的捕捉和处理

    Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...

  6. oracle表中字段的添加、删除

    在oracle数据库中为一张表添加一个字段: alter table tableName add ClIENT_OS varchar2(20) default '0' not null ; 在orac ...

  7. ORACLE存储过程中%TYPE和%ROWTYPE的区别

    ORACLE存储过程中%TYPE和%ROWTYPE的区别 在存储过程中%TYPE和%ROWTYPE常用来在PL/SQL中定义变量 因为 t_emp emp%rowtype ;这个语句的意思是 定义一个 ...

  8. oracle数据库——常用的数据类型

    2018-12-19    23:08:03 oracle数据库中常用的数据类型有23种,我们把数据类型分为字符型.数字型.日期型和其他数据类型. 一.字符型: 数据类型 取值范围 (字节) 说明 v ...

  9. Oracle 过程中变量赋值

    create or replace function get_sal1(id employees.employee_id%type) return number is sal employees.sa ...

随机推荐

  1. Sqlserver 2008 R2安装的盘符空间不够用的解决办法

    例如我把一个sqlserver数据库安装在了D盘,结果发现D盘只剩下20G的可用空间,可是数据却每天的在增长,如何办?于是百度到了以下解决办法 方法很多: 1.可以给primary文件组添加文件.选择 ...

  2. js递归遍历key

    需求:根据Json对象,查找到某key所有值 var obj = { first: "1", second: { name: "abc", mykey: &qu ...

  3. OpenGL ES 3.0 图元组合和光栅化(三)

    图元是能够被OpenGL ES 绘制的几何物体,如三角形.线条或者精灵.在图元组合过程 中,对每个图元必须判断是否位于投影 截体内,如果图元不完全在平截体内部,将被视图平截体剪贴,如果完全在平截体外, ...

  4. ESXI 6.5 从载到安装

    下载ESXI 访问官网 https://www.vmware.com 到download,选择vsphere 下载esxi https://my.vmware.com/en/group/vmware/ ...

  5. KVM 虚拟化技术

    1.1 前言 1.1.1 什么是虚拟化? 在计算机技术中,虚拟化(技术)或虚拟技术(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源(CPU.内存.磁盘空间.网络适配器 ...

  6. DELL平板如何安装WIN10系统 -标记活动分区的问题

    在计算机管理中没有这个选项   可以在分区助手软件中,选中C分区之后,左边有设置活动分区,然后左上角提交执行即可        

  7. Redis开发 - 1. 认识redis

    1. 什么是Redis? Redis is a very fast non-relational database that stores a mapping of keys to five diff ...

  8. [工具IDE]工具与书籍

    看到几个还不错的资源,记录于下: 一.使用 JavaScript 写的操作系统: http://www.admin10000.com/document/3811.html 演示地址参考:http:// ...

  9. 当Ruby的model名字出错时,在现实view时显示错误的提示

    app/controllers/courses_controller.rb:1:in `<top (required)>' app/controllers/courses_controll ...

  10. postman添加cookie

    检索cookie: 1.启动拦截器(需安装Postman Interceptor) 2.在测试部分,你可以使用responseCookies对象,他将返回一个cookie对象的数组.使用postman ...