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. Pandas python

    原文:  https://github.com/catalystfrank/Python4DataScience.CH   和大熊猫们(Pandas)一起游戏吧!   Pandas是Python的一个 ...

  2. sqrt函数的实现

    原文:http://blog.csdn.net/legend050709/article/details/39394381 sqrt算法实现: (一)int sqrt1(int n);求取整数x的平方 ...

  3. python命令行参数传递JSON串

    有点小问题,一是传递的双引号被自动删除了,但是如果用单引号,JSON解析又不认. 所以,最后的方案是,传递单引号,但程序处理时做一个替换,替换成单引号.

  4. idea缓存目录mac cache

    IDEA如果出现卡顿,Index疯狂扫描,建议清空一下如下目录 ~/Library/Caches/IntelliJIdea2017.3 Resource nexus-maven-repository- ...

  5. mysql忘记密码解决方法

    在windows下:打开命令行窗口,停止mysql服务: net stop mysql 启动mysql,执行: mysqld -nt --skip-grant-tables 另外打开一个命令行窗口,执 ...

  6. C++ 容器元素的存储和获取

    1.存储对象,存储的是对象的副本,并不是原对象.2.获取对象,获取的是对象的引用,为什么要这样设计?a.存储对象只发生一次,而获取对象往往会有多次,获取对象,如果每次都返回对象的副本,这个开销很大.b ...

  7. Office办公 如何给WPS 的文字添加黑框

    双击文本框,弹出的设置对象格式中选择线条颜色和样式即可   要做成虚线框也是可以的   弄完之后字体也可以改大一点   还有一种需要时文本不在黑框的中间位置,比如顶部的某个位置,可以设置文字锁定点是顶 ...

  8. 数据库同步相关的SQL语句

    一.目标: 本文重点给大家介绍几款SQL用法,一般常用于数据库同步之类的. 二.例子: 1.找出A表中不存在于B表的记录. from B where A.[序号]=B.[序号]); 2.将A表中不存在 ...

  9. linux发送邮件的功能总结

    今天添加了发送邮件的功能,总结一下,供以后参考: 1.直接使用管道发送邮件 echo "hello,this is the content of mail.welcome to www.mz ...

  10. dir for RequestHandler and request

    两个对象的dir # RequestHandler ['GET', 'GETPOST', 'POST', 'SUPPORTED_METHODS', '_ARG_DEFAULT', '_INVALID_ ...