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. jQuery对象

    $(document).ready(function(){ //第二种获取方法,通过标签的名<h2>Dom来获取 var h1 = document.getElementsByTagNam ...

  2. OpenGL ES 3.0之Fragment buffer objects(FBO)详解(一)

    片段操作图 这篇文章将介绍从写入帧缓冲和读取帧缓冲的方式. Buffers(缓冲) OpenGL ES支持三种缓冲: OpenGL ES •• Color buffer颜色缓冲 •• Depth bu ...

  3. Python编程工具pycharm的使用

    简介 俗话说工欲善其事必先利其器,所以对于程序员来说,使用python编程必须有一个强大的Python编程工具,这款工具就是pycharm. PyCharm是一种Python IDE,带有一整套可以帮 ...

  4. 曾经的超级明星类库jQuery未来也许不再会被前端程序猿追捧了!

    作为火了十多年的老牌明星类库jQuery, 相信做前端的小伙伴肯定都或多或少的使用和追捧过,当然我也不例外, 作为第一个学习的js类库,我曾经也觉得它是真正的唯一, 帮助你处理恶心的浏览器CSS/JS ...

  5. javascript实现金额大写转换函数

    function transform(tranvalue) { try { var i = 1; var dw2 = new Array("", "万", &q ...

  6. ASP.NET 打包多CSS或JS文件以加快页面加载速度的Handler

    ASP.NET 打包多CSS或JS文件以加快页面加载速度的Handler, 使用<link type="text/css" rel="Stylesheet" ...

  7. QT 截取屏幕的实现

    QPixmap提供了两个函数 grabWidget 和 grabWindow 可以将屏幕上的窗体存成一个 QPixmap 格式的图片,很容易再将 QPixmap 存成文件.函数使用很简单,两行代码就可 ...

  8. 利用WatchService监听文件变化

    在实现配置中心的多种方案中,有基于JDK7+的WatchService方法,其在单机应用中还是挺有实践的意义的. 代码如下: package com.longge.mytest; import jav ...

  9. python之函数用法islower()

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法islower() #http://www.runoob.com/python/att ...

  10. 转 Linux定时执行任务命令at和crontab

    本文介绍在Linux下的两种定时执行任务的方法:at命令,以及crontab服务. (1)at命令 假如我们只是想要让特定任务运行一次,那么,这时候就要用到at监控程序了. 设置at命令很简单,指示定 ...