`
quningstudy
  • 浏览: 52869 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

oracle的数据库对象类型的使用——创建、增、删、改以及查询

阅读更多
数据库对象同JAVA中的对象是一样的.有属性和方法.
oracle创建对象类型
create or replace TYPE address_typ AS OBJECT
(
   street varchar2(15),
   city varchar2(15),
   state char(2),
   zip varchar2(5)
);
create or replace type person_typ as object
(
   id number,
   nanm varchar2(10),
   dob date,
   phone varchar2(12),
   address address_typ--引用上面的对象类型.(对象类型可以相互引用)
);
现在写一个带有函数的对象类型.这个对象用于表示产品.注意声明了一个函数
get_sell_by_date().这个函数根据days_valid属性和当前日期,返回产品的最晚售出时间.
create or replace product_typ as object
(
  id number,
  name varchar2(15),
  description varchar2(22),
  price number(5,2),
  days_valid  number,
  MEMBER Function get_sell_by_date Return Date
);
Member function子句用于声明get_sell_by_dat函数,
Member procedure子句用于声明一个过程.
---由于在对象类型product_typ 中声明了方法(函数),所以必须为product_typ创建对象体(body).下面是创建product_typ的对象体.
create or replace type body product_typ as
   Member function get_sell_by_date Return date is
   v_sell_by_date date;
  begin
     select days_valid+sysdate into v_sell_by_date from dual;
     return v_sell_by_date;
  end get_sell_by_date;
end product_typ;
可以看出,函数通过将days_valid属性与当前日期相加,计算并返回产品当前最晚必须售出时间.
---可以通过describe来获取有关对象类型的信息
describe product_typ;
--------------------------------------------------------
2.用对象类型定义列对象和对象表
对象类型可以用来定义表中的列,这种列称为列对象(Column object).同时,当对象类型包含嵌入对象类型时,嵌入对象类型也是一个列对象.person_typ(见上面)就是这样一个例子.
创建products表:--这种表是包含列对象的表
create table products
(
  product product_typ,
  quantity_in_stock number--库存数量
);
对象表:使用对象类型来定义整个表.这种表叫对象表.
下面这个例子创建两个对象表object_products和object_customers,分别使用product_typ和person_typ定义.注意OF子句用于将每个表标识为对象表:
例子:
create table object_products of product_typ;
create table object_customers of person_typ;
对象表与包含列对象的表这两者的区别是:
后者可以具有多列.
-------对象引用和对象标识符
对象表的另一个不同之处在于可以使用对象引用(object reference)为对象表之间的关系建立模型,而不是使用外键.对象引用使用REF类型进行定义,通常都用作指向对象表中对象的指针.对象表中的每个对象都具有惟一的对象标识符(object identified,OID),它可以存储在REF列中.下面创建表purchases,其中包含了两个REF列:
  create table purchases
  (
    id number primary key,
    customer REF person_typ SCOPE IS object_cusotmers,
    product REF product_typ SCOPE IS object_products
  );
SCOPE IS子句将对象引用限制在特定表中的对象上.例如列customer被限制在指向ojbect_customers表中的对象.
==========================================================================
下面对products,object_products,object_customers,purchases表进行DML操作.
------------------------------
-----对products(包含列对象的表)进行DML操作
1.插入
insert into products(product,quantity_in_stock)
  values(product_typ(1,'pasta','20 oz bag of pasta',3.95,10),50);
2.查询
--全查询
select * from products;product列对象的属性显示在product_typ的构造函数中.
--查询单个列对象:注意product对象的id属性的表被赋予别名p
select p.product from products p where  p.product.id=1;
--查询列对象中声明的方法(函数和过程)
在prodcut_typ对象类型中包含get_selll_by_date()函数,用于计算并返回某件产品的最晚售出时间.
select p.product.get_sell_by_date() from products p;
3.修改
注意访问product列对象时使用了表别名
update products p set p.product.description='30 oz bag of pasta'
where p.product.id=1;
4.删除
delete from products p
where p.product.id=2;
-------对object_products(对象表)表进行DML操作
1.插入(两种形式同sql一样)
insert into object_products
values(product_typ(1,'pasta','20 oz bag of past',3.86,10));
insert into object_products (id,name,description,price,days_valid)
  values(2,'sardines','12 oz box of sardines',2.99,5);
2.选择记录
select * from object_products;
可以用Oracle数据库内置的value()函数从对象表中查询记录.这种方法将记录看作真正的对象,并在对象类型的构造函数中返回对象的属性.value()函数接受表别名作参数.
select value(op) from object_products op;
3.更新
update object_products set description='25 oz bag of pasta' where id=1;
4.删除记录
delete from object_products where id=2;
---------对object_customers(对象表)进行DML操作
1.插入
insert into object_customers values
(
  person_typ(1,'John','Brown','01-FEB-1955','800-555-1211',
           address_typ('2 stat street','Beantown','MA','123456'))
);
2.查询
object_customers表是person_typ的对象表;person_typ包含嵌入的address_typ列对象address.
---全查询
select * from object_customers;
---查询一条记录
select * from object_customers oc where oc.id=1;--id是person_typ中的id
---对嵌入的列对象的state属性的查询
select * from object_customers oc
   where oc.address.state='MA';
3.更新和删除同对object_products的操作一样(略)
--------对purchases(这种表是包含列对象的表,但是较特殊的一种.这包含的列对象是对象表(通过REF),而不是对象类型)表进行DML操作
1.插入
  对象表中的每一条记录都具有惟一的对象标识符,这个标识符可保存在REF列中.可通过REF()函数访问这个对象标识符,并将返回的对象标识符保存在REF列中.
insert into purchases (id,costome,product)
values(1,(select REF(oc) from object_customers oc where oc.id=1),
(select REF(op) from object_products op where op.id=1));
这个例子记录的是顾客#1购买了产品.
2.查询(选择记录)
--全查询
注意customer和product列中包含很长的数字字母串,这些是指向object_customers和object_products表中记录的对象标识符.
select * from purchases;
--访问customer和product列所指向的记录
可以使用DEREF()函数通过REF列的值访问它所指向的对象表中的记录;这个函数接受REF列作为参数.
select DEREF(customer),DEFER(product) from purchases;
3.更新
--修改purchases表中的一条记录.注意product列的值被改为指向object_products表中的产品#2
update purchases set product=(select REF(op) from object_products op
where op.id=2) where id=1;

===============================
------------在PL/SQL中使用对象
程序包product_package中
包含一个get_products()函数,返回object_products表中的对象
一个insert_product()过程,向ojbect_products表中增加一个对象.
----product_package
程序包规范
create or replace package product_package as
Type ref_cursor_typ IS REF CORSOR
function get_products return ref_cursor_typ;
procedure insert_product(
p_id in ojbect_products.id%type,
p_name in object_products.name%type,
p_descirption in object_products.description%type,
p_price in object_products.price%type,
p_days_valid in object_products.days_valid%type
);
end product_package;
程序包主体
create or replace package body product_package as
     function get_products return ref_cursor_typ
     is
     products_ref_cursor ref_cursor_typ;
     begin
       open products_ref_cursor FOR select value(op) from object_products op;
       return products_ref_cursor;
     end get_products;
    procedure insert_product(
p_id in ojbect_products.id%type,
p_name in object_products.name%type,
p_descirption in object_products.description%type,
p_price in object_products.price%type,
p_days_valid in object_products.days_valid%type
)
     as
     product product_typ:=product_typ(p_id,p_name,p_description,p_price,p_days_valid);
    begin
      insert into object_products values(product);
      commit; 
    exception
      when others then
        rollback;
    end insert_product;
end product_package;

说明:get_products()函数使用value将object_products表的内容作为product_typ对象返回.
下面是对过程和函数的调用
call product_package.insert_product(4,'sals','15 oz jar of salsa',1.50,20);
select product_package.get_products from dual;










分享到:
评论

相关推荐

    Oracle数据库设计文档——帮助数据库初学者了解数据库设计

    Oracle数据库设计是构建高效、稳定、可扩展的数据库系统的基础,尤其对于初学者来说,理解这一过程至关重要。本文档将深入探讨Oracle数据库的设计原理和实践技巧,帮助新手逐步掌握数据库设计的基本概念和方法。 ...

    Oracle数据库应用开发——表空间与数据库模式对象的设计实验报告x_数据库对象包括哪些

    通过这样的实验,学习者能够深入理解Oracle数据库的管理和应用,熟悉表空间、数据文件、用户权限以及模式对象的创建和管理。这将为进行更复杂的数据库设计和优化打下坚实基础。在实际工作中,理解这些概念并能灵活...

    oracle 数据库系统——管理与应用

    此外,数据库的安全性也是管理的一部分,包括用户权限的管理、角色的创建和分配,以及使用SQL*Plus或其他工具进行身份验证。 Oracle的数据存储结构包括表空间、数据文件、重做日志文件等。理解这些概念有助于优化...

    oracle基本语法-增删改查-新手入门

    ### Oracle基本语法——增删改查 #### 一、Oracle简介与环境搭建 在学习Oracle基本语法之前,首先需要了解Oracle数据库系统的一些基础知识,并确保具备一个可以进行实践操作的环境。 - **Oracle简介**:Oracle是...

    C#版Oracle数据库通用操作类

    - **带参数的构造函数**:接受一个字符串类型的连接字符串参数,用于创建新的 `OracleConnection` 对象。 #### 三、数据库连接管理 - **打开连接(OpenConn)**:如果当前连接状态为关闭,则打开连接。 - **关闭...

    资源专区-小白必看-oracle数据库基本使用

    此外,PL/SQL Developer还支持对数据进行增、删、改操作,以及编写复杂的业务逻辑。通过练习这些基本操作,你将逐步熟悉Oracle数据库的使用。 总的来说,"资源专区-小白必看-oracle数据库基本使用"这个主题覆盖了...

    Oracle数据库技术——动态SQL

    ### Oracle数据库技术——动态SQL详解 #### 一、动态SQL概述与应用场景 在Oracle数据库管理技术中,SQL语句按照其是否能在编译时确定,分为静态SQL与动态SQL两大类。静态SQL指的是那些在编写时就已经确定下来的SQL...

    Oracle经典教程4——表空间和数据库对象

    ### Oracle经典教程4——表空间和数据库对象 #### 一、概述 本章节主要介绍了Oracle数据库中的几个核心概念,包括表空间以及多种数据库对象,如同义词、序列、视图和索引等。这些概念对于理解Oracle数据库的架构与...

    Oracle数据库课程设计——学生考勤系统的Oracle实现1.docx

    《Oracle数据库课程设计——学生考勤系统的Oracle实现》是一份详细的报告,主要涵盖了设计和实现一个基于Oracle数据库的学生考勤管理系统的过程。这份报告的核心在于利用Oracle数据库技术来满足高校学生考勤管理的...

    焕发数据库的生命力——Oracle数据库系统的在线重组技术.pdf

    Oracle数据库系统的在线重组技术是数据库优化的关键策略之一,它允许在不影响业务连续性的情况下,显著提升数据库性能。这种技术在如今对高可用性和高性能有着严格要求的IT环境中显得尤为重要,特别是在金融、通信、...

    java操作Oracle数据库——ARRAY、TABLE类型批量入库

    - **兼容性**:确保使用的JDBC驱动版本与Oracle数据库版本兼容,因为高级数据类型的支持可能会随着版本变化而更新。 - **错误处理**:在执行SQL语句时,必须捕获并处理可能的SQLExceptions,确保程序的健壮性。 - **...

    Oracle应用项目——使用OracleEM创建表空间.pdf

    在Oracle数据库中,表空间(Tablespace)是存储数据的主要单位,它由一个或多个数据文件组成,用于容纳数据库对象如表、索引等。在Oracle企业管理器(Oracle Enterprise Manager,简称Oracle EM)中创建表空间是...

    Oracle数据库的创建和管理 Oracle数据库实验报告.pdf

    本实验报告主要涵盖了Oracle数据库的创建、管理和删除,以及使用两种不同的方法——Database Configuration Assistant (DBCA) 和命令行方式。以下是对这些操作的详细解释: **1. Oracle数据库的创建** Oracle...

    Oracle经典教程6——Oracle应用于.NET平台

    1. **建立数据库连接**:使用`OracleConnection`对象建立与Oracle数据库的连接。 2. **执行数据库操作**:使用`OracleCommand`对象执行SQL命令,如查询、插入、更新或删除等操作。 3. **数据的存取**:可以通过连接...

    Oracle数据库——数据库安全性管理.pdf

    Oracle数据库的数据库安全性管理是确保数据安全的关键环节。在Oracle中,主要通过验证系统权限、角色管理和概要文件管理来实现这一目标。 首先,验证系统权限管理涉及到对用户赋予特定的系统权限,如创建表(CREATE...

    Oracle数据库认证考试详细说明.doc

    2. Oracle 数据库:基础 I——这门差不多数据库治理考试是为了测试数据库创建、规划对象以及网络结构的专业知识 3. Oracle 数据库:基础 II——这门高级Oracle DBA考试是为了测试高级数据库结构、安全性以及Oracle...

    李兴华——Oracle数据库笔记(全)

    根据提供的信息,我们可以总结出李兴华老师的Oracle数据库课堂笔记中的关键知识点,这些知识点主要围绕Oracle数据库的基础概念、SQL语言的使用以及基本的数据操作等方面展开。 ### Oracle数据库概述 Oracle数据库...

Global site tag (gtag.js) - Google Analytics