对象测试

1. PL / SQL创建对象
CREATE OR REPLACE TYPE typ_address AS OBJECT (
street VARCHAR2(30),
city VARCHAR2(20),
state CHAR(2),
postal_code VARCHAR2(6)
);

CREATE OR REPLACE TYPE typ_employee AS OBJECT(
employee_id NUMBER(6),
first_name VARCHAR2(20),
last_name VARCHAR2(25),
email VARCHAR2(25),
phone_number VARCHAR2(25),
hire_date DATE,
job_id VARCHAR2(25),
salary NUMBER(8,2),
commission_pct NUMBER(2,2),
manager_id NUMBER(6),
department_id NUMBER(4),
address typ_address
MAP MEMBER FUNCTION get_idno RETURN NUMBER,
MEMBER PROCEDURE display_address(SELF IN OUT NOCOPY typ_employee)
);

--创建对象体
CREATE TYPE BODY typ_employee AS
MAP MEMBER FUNCTION get_idno RETURN NUMBER IS
BEGIN
RETURN employee_id;
END;
MEMBER PROCEDURE display_address ( SELF IN OUT NOCOPY typ_employee ) IS
BEGIN
DBMS_OUTPUT.PUT_LINE(first_name || ‘ ‘ || last_name);
DBMS_OUTPUT.PUT_LINE(address.street);
DBMS_OUTPUT.PUT_LINE(address.city || ‘, ‘ || address.state || ‘ ‘ ||
address.postal_code);
END;
END;

--持久化对象
CREATE TABLE employee_tab OF typ_employee;
CREATE TYPE emp_typ as table of typ_employee;

3. 在PL/SQL块中声明对象:

DECLARE
emp typ_employee; -- emp is atomically null
BEGIN
-- call the constructor for typ_employee
emp := typ_employee(315, ‘Francis‘, ‘Logan‘, ‘FLOGAN‘,
‘555.777.2222‘, to_date(‘2012-12-24‘, ‘yyyy-mm-dd‘), ‘SA_MAN‘, 11000, .15, 101, 110,
typ_address(‘376 Mission‘, ‘San Francisco‘, ‘CA‘, ‘94222‘));
--DBMS_OUTPUT.PUT_LINE(emp.first_name || ‘ ‘ || emp.last_name); -- display details
emp.display_address(); -- call object method to display details
END;

4. PL/SQL如何处理未初始化的对象:
--对象初始化之后才能被赋值
DECLARE
emp typ_employee; -- emp is atomically null
BEGIN
IF emp IS NULL THEN DBMS_OUTPUT.PUT_LINE(‘emp is NULL #1‘); END IF;
IF emp.employee_id IS NULL THEN
DBMS_OUTPUT.PUT_LINE(‘emp.employee_id is NULL #1‘);
END IF;

emp := typ_employee(NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
typ_address(NULL, NULL, NULL, NULL));
-- emp := NULL; -- this would have made the following IF statement TRUE
IF emp IS NULL THEN DBMS_OUTPUT.PUT_LINE(‘emp is NULL #3‘); END IF;
IF emp.employee_id IS NULL THEN
DBMS_OUTPUT.PUT_LINE(‘emp.employee_id is NULL #3‘);
END IF;

emp.employee_id := 330;
IF emp IS NULL THEN DBMS_OUTPUT.PUT_LINE(‘emp is NULL #2‘); END IF;
IF emp.employee_id IS NULL THEN
DBMS_OUTPUT.PUT_LINE(‘emp.employee_id is NULL #2‘);
END IF;
EXCEPTION
WHEN ACCESS_INTO_NULL THEN
DBMS_OUTPUT.PUT_LINE(‘Cannot assign value to NULL object‘);
END;

5. 在PL/SQL中操纵对象:
5.1.调用对象构造器和方法(Calling Object Constructors and Methods)
--构造器传入参数
DECLARE
emp typ_employee;
BEGIN
INSERT INTO employee_tab VALUES (typ_employee(310, ‘Evers‘, ‘Boston‘, ‘EBOSTON‘,
‘555.111.2222‘, to_date(‘2012-12-24‘, ‘yyyy-mm-dd‘), ‘SA_REP‘, 9000, .15, 101, 110,
typ_address(‘123 Main‘, ‘San Francisco‘, ‘CA‘, ‘94111‘)) );
INSERT INTO employee_tab VALUES (typ_employee(320, ‘Martha‘, ‘Dunn‘, ‘MDUNN‘,
‘555.111.3333‘, to_date(‘2012-11-5‘, ‘yyyy-mm-dd‘), ‘AC_MGR‘, 12500, 0, 101, 110,
typ_address(‘123 Broadway‘, ‘Redwood City‘, ‘CA‘, ‘94065‘)) );
INSERT INTO employee_tab VALUES (typ_employee(370, ‘Robert‘, ‘Myers‘, ‘RMYERS‘,
‘555.111.2277‘, to_date(‘2012-3-7‘, ‘yyyy-mm-dd‘), ‘SA_REP‘, 8800, .12, 101, 110,
typ_address(‘540 Fillmore‘, ‘San Francisco‘, ‘CA‘, ‘94011‘)) );
END;

5.2 更新和删除对象:
--删除对应的对象表
DECLARE
emp typ_employee;
BEGIN
UPDATE employee_tab e SET e.address.street = ‘1040 California‘
WHERE e.employee_id = 370;
DELETE FROM employee_tab e WHERE e.employee_id = 310;
END;

SELECT REF(e) FROM employee_tab e WHERE e.employee_id = 370;

6. 通过REF修饰符操纵对象:

DECLARE
emp typ_employee;
emp_ref REF typ_employee;
emp_name VARCHAR2(50);
BEGIN
SELECT REF(e) INTO emp_ref FROM employee_tab e WHERE e.employee_id = 370;
-- the following assignment raises an error, not allowed in PL/SQL
-- emp_name := emp_ref.first_name || ‘ ‘ || emp_ref.last_name;
-- emp := DEREF(emp_ref); not allowed, cannot use DEREF in procedural statements
SELECT DEREF(emp_ref) INTO emp FROM DUAL; -- use dummy table DUAL
emp.display_address();
END;

7. 定义相当于PL/SQL集合类型的SQL类型(Defining SQL Types Equivalent to PL/SQL Collection Types)

7.1 定义嵌套表:

--建嵌套表类型
CREATE TYPE CourseList AS TABLE OF VARCHAR2(10) -- define type
--建对象类型
CREATE TYPE student AS OBJECT ( -- create object
id_num INTEGER(4),
name VARCHAR2(25),
address VARCHAR2(35),
status CHAR(2),
courses CourseList); -- declare nested table as attribute
--建立嵌套表类型表
CREATE TABLE sophomores of student
NESTED TABLE courses STORE AS courses_nt;
--插入数据
insert into sophomores
values(1,‘dylan‘,‘CARL STREET‘,‘ACTIVE‘,
CourseList(‘MATH1020‘)
);
--查询
SELECT a.*, b.*
from sophomores a, TABLE(a.courses) b;

select /*+ nested_table_get_refs */ *
from courses_nt t;

7.2 定义数组:
-- 声明数组类型(Each project has a 16-character code name)
-- We will store up to 50 projects at a time in a database column.
CREATE TYPE ProjectList AS VARRAY(50) OF VARCHAR2(16);
--创建表
CREATE TABLE dept_projects ( -- create database table
dept_id NUMBER(2),
name VARCHAR2(15),
budget NUMBER(11,2),
-- Each department can have up to 50 projects.
projects ProjectList);

--插入数据:
INSERT INTO dept_projects
VALUES(60, ‘Security‘, 750400,
ProjectList(‘New Badges‘, ‘Track Computers‘, ‘Check Exits‘));

8. 在动态SQL中使用对象:
8.1 定义对象类型person_typ和数组类型hobbies_var,并创建报TEAMS:

CREATE TYPE person_typ AS OBJECT (name VARCHAR2(25), age NUMBER);

CREATE TYPE hobbies_var AS VARRAY(10) OF VARCHAR2(25);

CREATE OR REPLACE PACKAGE teams
AUTHID CURRENT_USER AS
PROCEDURE create_table (tab_name VARCHAR2);
PROCEDURE insert_row (tab_name VARCHAR2, p person_typ, h hobbies_var);
PROCEDURE print_table (tab_name VARCHAR2);
END;

CREATE OR REPLACE PACKAGE BODY teams AS
PROCEDURE create_table (tab_name VARCHAR2) IS
BEGIN
EXECUTE IMMEDIATE ‘CREATE TABLE ‘ || tab_name ||
‘ (pers person_typ, hobbs hobbies_var)‘;
END;
PROCEDURE insert_row (
tab_name VARCHAR2,
p person_typ,
h hobbies_var) IS
BEGIN
EXECUTE IMMEDIATE ‘INSERT INTO ‘ || tab_name ||
‘ VALUES (:1, :2)‘ USING p, h;
END;
PROCEDURE print_table (tab_name VARCHAR2) IS
TYPE refcurtyp IS REF CURSOR;
v_cur refcurtyp;
p person_typ;
h hobbies_var;
BEGIN
OPEN v_cur FOR ‘SELECT pers, hobbs FROM ‘ || tab_name;
LOOP
FETCH v_cur INTO p, h;
EXIT WHEN v_cur%NOTFOUND;
-- print attributes of ‘p‘ and elements of ‘h‘
DBMS_OUTPUT.PUT_LINE(‘Name: ‘ || p.name || ‘ - Age: ‘ || p.age);
FOR i IN h.FIRST..h.LAST
LOOP
DBMS_OUTPUT.PUT_LINE(‘Hobby(‘ || i || ‘): ‘ || h(i));
END LOOP;
END LOOP;
CLOSE v_cur;
END;
END;

8.2 调用TEAMS包中的存储过程:

DECLARE
team_name VARCHAR2(15);
BEGIN
team_name := ‘Notables‘;
TEAMS.create_table(team_name);
TEAMS.insert_row(team_name, person_typ(‘John‘, 31),
hobbies_var(‘skiing‘, ‘coin collecting‘, ‘tennis‘));
TEAMS.insert_row(team_name, person_typ(‘Mary‘, 28),
hobbies_var(‘golf‘, ‘quilting‘, ‘rock climbing‘, ‘fencing‘));
TEAMS.print_table(team_name);
END;

=================================================
output:
Name: John - Age: 31
Hobby(1): skiing
Hobby(2): coin collecting
Hobby(3): tennis
Name: Mary - Age: 28
Hobby(1): golf
Hobby(2): quilting
Hobby(3): rock climbing
Hobby(4): fencing

PL/SQL 过程已成功完成。

时间: 2024-10-14 00:39:24

对象测试的相关文章

java class对象测试

java 类对象 jvm在 加载 .class的时候 会创建该类唯一的class对象 以后无论创建多少个实例,该class对 象是不变的. 每一个class对象 getClass() 都会获得同一个class对象 class java.lang.Class ,该对象是唯一不变的.  public void test() {   System.out.println("这是test...方法....");  }  private static void test2() {   try {

[python学习篇][书籍学习][python standrad library][内置类型]对象测试真值,布尔值操作, 比较操作

几乎所有对象都可以比较.测试真值.转换为字符串(其实就是用repr()函数,或略有差异的str()函数来转换) 1 对象是否为真 任何对象都可以测试真值,用于if或while的条件或下面布尔运算的操作数.下面的值被视为假: None False 任何数值类型的零,例如,0. 0L.0.0. 0j. 任何空的序列,例如, ''. (). []. 任何空的映射,例如,{}. 用户定义的类的实例,如果该类定义一个__nonzero__()或__len__()的方法,在该方法返回整数零或布尔值False

模拟对象测试——EasyMock

一.EasyMock 使用动态代理实现模拟对象创建,一般可以满足以下测试需求 1.要测试的模块依赖于其它自己控制不了的模块,如第三方服务,其它组员在开发的服务等,它们都没办法配合你来测试: 2.涉及到数据库操作,但当时条件连接不了数据库或你不想将自己的测试结果改动到数据库: 3.模块依赖于spring容器注入其它服务实例,但你又不想启动spring容器. 总之,EasyMock能帮我们模拟出任何我们想要的支持对象,并且我们可以使用这些对象进行逻辑操作 二.具体使用方法 1.模拟成员变量 Easy

CI框架中一个类中调用另一个类中已经加载对象测试

controller.php 1 <?php 2 class CI_Controller { 3 4 private static $instance; 5 6 public function __construct() 7 { 8 self::$instance =& $this; 9 10 foreach (is_loaded() as $var => $class) 11 { 12 $this->$var =& load_class($class); 13 $obj

单元测试——使用模拟对象做交互测试

最近在看.net单元测试艺术,我也喜欢单元测试,这里写一下如何在测试中使用模拟对象. 开发的过程中,我们都会遇到对象间的依赖,比如依赖数据库或文件,这时,我们需要使用模拟对象,来进行测试,我们可以手写模拟对象,当然也可以使用模拟框架. 假如有这样的一个需求,当用户登陆时,我需要对用户名和密码进行验证,然后再将用户名写入日志中. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class MyLogin     {         pu

.NET Core TDD 前传OA 信用盘平台搭建: 编写易于测试的代码构建对象

联系方式:QQ:2747044651 网址http://zhengtuwl.com常情况下, 我们是先去建造汽车, 组装好汽车后, 我们再去驾驶它. 软件开发也类似, 我们应该把对象构造完毕之后, 再去用它. 但是有时候, 开发者会在构造过程中添加一些程序逻辑. 这就相当于车还没造完, 我们就驾驶它去兜风了. 这样做是不太好的. 构造函数是类用来创建其实例对象的方法, 这里的代码是用来准备该对象的. 但有时开发者会在构造函数里做一些其它的工作, 例如构建依赖项, 执行初始化逻辑等等. 在构造函数

Ognl表达式 值栈对象ValueStack

ValueStack值栈主要包含另个部分: 1.map栈(非根元素) context:主要存储域对象. 2.list栈(根元素) root:主要存储 (1)通过值栈的push()方法存放的对象 (2)Map对象(通过值栈的set()方法存放的数据) (3)Action对象 (4)其他代理对象. 测试类OgnlDemo2 <span style="font-size:14px;"><span style="font-family:Courier New;&qu

Spring IOC 方式结合TESTGN测试用例,测试简单java的命令模式

java命令模式: 可以命令("请求")封装成一个对象,一个命令对象通过在特定的接收着上绑定一组动作来封装一个请求.命令对象直接把执行动作和接收者包进对象中,只对外暴露出执行方法的的接口,从而简单的达到动作的请求者和动作的执行者解耦的目的. 下面用一个简单的实例测试简单的命令模式,同时采用spring ioc的方式+testNG的测试方式,实现遥控器的遥控开灯的命令模式实现和测试. 1.建立命令接口,包含执行方法,命令对象必须要实现的,执行方法就是暴露的接口方法,提供于接收者调用. p

python源码剖析笔记1——Python对象初见

python源码剖析笔记1--Python对象初见 工作整两年了,用python最多,然而对于python内部机制不一定都清楚,每天沉醉于增删改查的简单逻辑编写,实在耗神.很多东西不用就忘记了,比如C语言,正好,python源码用C写的,分析python源码的同时又能温故C语言基础,实在是件很好的事情.另外,还有陈儒大神的<python源码剖析>做指引,分析也不至于没头没脑.期望在一个月的业余时间,能有所小成,以此为记. 1 python中的对象 python中,一切东西都是对象,在c语言实现