--external table
--查询时从外部文件中读取到定义好的表中,但Oracle并不保存数据,是对sqlldr工具的一个补充
--下面的例子,测试用 external table读取oracle日志文件。
-- 创建Oracle目录,指向Oracle的日志文件位置
CREATE DIRECTORY ORCL_LOG as 'F:\oracle\product\10.2.0\db_1\admin\orcl\bdump';
--创建外部表
CREATE TABLE ALERT_LOG(
LOG_TEXT VARCHAR2(4000)
)
ORGANIZATION EXTERNAL
(
TYPE ORACLE_LOADER
DEFAULT DIRECTORY ORCL_LOG
ACCESS PARAMETERS
(
RECORDS DELIMITED BY NEWLINE--每一行是一条记录
NOBADFILE
NODISCARDFILE
NOLOGFILE
)
LOCATION('ALERT_ORCL.LOG')
)
REJECT LIMIT UNLIMITED;
--查询外部表
SELECT * FROM ALERT_LOG WHERE ROWNUM <= 10;
LOG_TEXT
-----------------------------------------------------------------------
Dump file f:\oracle\product\10.2.0\db_1/admin/orcl/bdump\alert_orcl.log
Sun Oct 21 09:39:32 2012
ORACLE V10.2.0.1.0 - Production vsnsta=0
vsnsql=14 vsnxtr=3
Windows NT Version V6.1 Service Pack 1
CPU : 4 - type 586
Process Affinity : 0x00000000
Memory (Avail/Total): Ph:285M/1991M
Sun Oct 21 09:39:32 2012
Starting ORACLE instance (normal)
------------------------------------------------------------------------------------------------------------------------------------
--MERGE的使用
--先来看下Merge的语法
/*
MERGE INTO TABLE
USING TABLE|SUBQUERY
ON CONDITION
WHEN MATCHED THEN UPDATE SET COL = EXPRESSION | DEFAULT
WHERE_CLAUSE
DELETE WHERE_CLAUSE
WHEN NOT MATCHED THEN INSERT(COL,COL2)
VALUES(EXPR1,EXPR2,|DEFAULT)
WHERE_CLAUSE
WHERE CONDITION;*/
DROP TABLE TAB1;
DROP TABLE TAB2;
CREATE TABLE TAB1(ID INT, NAME VARCHAR2(10),STATUS VARCHAR2(10));
CREATE TABLE TAB2(ID INT, NAME VARCHAR2(10));
INSERT INTO TAB1 VALUES(1,'ANKER','N');
INSERT INTO TAB1 VALUES(2,'MIN','U');
INSERT INTO TAB1 VALUES(3,'MING','D');
INSERT INTO TAB1 VALUES(4,'XIAO','U');
INSERT INTO TAB2 VALUES(2,'A');
INSERT INTO TAB2 VALUES(3,'MING');
INSERT INTO TAB2 VALUES(4,'B');
COMMIT;
SELECT * FROM TAB1;
ID NAME STATUS
--------- ---------- ----------
1 ANKER N
2 MIN U
3 MING D
4 XIAO U
SELECT * FROM TAB2;
ID NAME
---------- ----------
2 A
3 MING
4 B
MERGE INTO TAB2
USING TAB1 ON (TAB2.ID = TAB1.ID)
WHEN MATCHED THEN UPDATE SET NAME = TAB1.NAME
DELETE WHERE (TAB1.STATUS = 'D')
WHEN NOT MATCHED THEN INSERT(ID,NAME) VALUES(TAB1.ID,TAB1.NAME)
WHERE 1=1;
SELECT * FROM TAB2;--查看合并之后的结果
ID NAME
---------- ----------
2 A
3 MING
4 B
------------------------------------------------------------------------------------------------------------------------------------------
--connect by 层次嵌套查询
DROP TABLE TT;
CREATE TABLE TT
(
ID INT,
PARENT_ID INT,
NAME VARCHAR2(10)
);
INSERT INTO TT VALUES(1,NULL,'CEO');
INSERT INTO TT VALUES(2,1,'VP');
INSERT INTO TT VALUES(3,1,'SVP');
INSERT INTO TT VALUES(4,1,'CFO');
INSERT INTO TT VALUES(5,2,'DIRECTOR 1');
INSERT INTO TT VALUES(6,2,'DIRECTOR 2');
INSERT INTO TT VALUES(7,3,'DIRECTOR 3');
INSERT INTO TT VALUES(8,3,'DIRECTOR 4');
INSERT INTO TT VALUES(9,6,'MANAGER 1');
COMMIT;
SELECT * FROM TT;
ID PARENT_ID NAME
---------- ---------- ----------
1 CEO
2 1 VP
3 1 SVP
4 1 CFO
5 2 DIRECTOR 1
6 2 DIRECTOR 2
7 3 DIRECTOR 3
8 3 DIRECTOR 4
9 6 MANAGER 1
SELECT * FROM TT START WITH ID = 2 CONNECT BY PRIOR ID = PARENT_ID;
ID PARENT_ID NAME
---------- ---------- ----------
2 1 VP
5 2 DIRECTOR 1
6 2 DIRECTOR 2
9 6 MANAGER 1
--START WITH 标示开始的记录
-- CONNECT BY 表示与当前记录关联的字段关系
--PIROR ID = PARENT_ID,我是这样理解的,当前条(也是上一条)的ID等于下一条的PARENT ID。
SELECT * FROM TT START WITH ID = 2 CONNECT BY ID = PRIOR PARENT_ID;
--连接条件是当前条(也是上一条)的PARENT_ID等于下一条的ID
ID PARENT_ID NAME
---------- ---------- ----------
2 1 VP
1 CEO
--来学习学习层次查询的一些伪列使用
SELECT
LEVEL, --树状结构的层次
LPAD(' ', 2 * LEVEL) || NAME,
SYS_CONNECT_BY_PATH(NAME, '/'),--层次结构显示
CONNECT_BY_ISLEAF,--是否是叶子节点,即下面没有子节点
CONNECT_BY_ROOT(NAME)--显示树状结构的ROOT
FROM TT
START WITH ID = 2
CONNECT BY PRIOR ID = PARENT_ID
ORDER SIBLINGS BY ID DESC;--指定子节点相同时,排序的条件
------------------------------------------------------------------------------------------------------------------------------------
--NATRUAL JOIN
CREATE TABLE TT (ID INT,CODE VARCHAR2(10));
CREATE TABLE TT1 (CODE VARCHAR2(10),NAME VARCHAR2(10));
INSERT INTO TT VALUES(1,'A');
INSERT INTO TT VALUES(2,'B');
INSERT INTO TT VALUES(3,'C');
INSERT INTO TT1 VALUES('A','JSP');
INSERT INTO TT1 VALUES('B','JAVA');
SELECT * FROM TT;
ID CODE
--------- ----------
1 A
2 B
3 C
SELECT * FROM TT1;
CODE NAME
---------- ----------
A JSP
B JAVA
D ORACLE
SELECT TT.ID, CODE, TT1.NAME FROM TT NATURAL JOIN TT1;
ID CODE NAME
---------- ---------- ----------
1 A JSP
2 B JAVA
--NATRUAL JOIN 会自动根据两个表相同的字段进行连接。不需要指定ON条件
--需要注意一点对于连接的字段,不能使用表限定,如下:
admin@ORCL> SELECT TT.ID, TT.CODE, TT1.NAME FROM TT NATURAL JOIN TT1;
SELECT TT.ID, TT.CODE, TT1.NAME FROM TT NATURAL JOIN TT1
*
第 1 行出现错误:
ORA-25155: NATURAL 联接中使用的列不能有限定词
--------------------------------------------------------------------------------------------------------------------------------------
--USING的使用
--USING 使用在INNER JOIN 和 OUTER JOIN 中(包括FULL OUTER JOIN)。
--需要注意一点,连接的表列不能有限定词
SELECT TT.ID, CODE, TT1.NAME FROM TT INNER JOIN TT1 USING (CODE);
ID CODE NAME
---------- ---------- ----------
1 A JSP
2 B JAVA
SELECT TT.ID, CODE, TT1.NAME FROM TT LEFT JOIN TT1 USING (CODE);
ID CODE NAME
---------- ---------- ----------
1 A JSP
2 B JAVA
3 C
-----------------------------------------------------------------------------------------------------------------------------------
--ANY SOME ALL
SELECT CODE FROM TT;
ID CODE
---------- ----------
1 A
2 B
3 C
SELECT CODE FROM TT1;
CODE NAME
---------- ----------
A JSP
B JAVA
D ORACLE
--ANY的用法
SELECT * FROM TT WHERE CODE > ANY(SELECT CODE FROM TT1);
ID CODE
--------- ----------
3 C
2 B
--从结果可以看出,ANY的意思是任何一个。上面的语句意思是显示TT表中大于TT1表中最小的CODE值。
--也就等于以下SQL
SELECT * FROM TT WHERE CODE > (SELECT MIN(CODE) FROM TT1);
--来看SOME,实际上是与ANY是一样的。
SELECT * FROM TT WHERE CODE > SOME(SELECT CODE FROM TT1);
ID CODE
---------- ----------
3 C
2 B
--来看看ALL
SELECT * FROM TT1 WHERE CODE > ALL (SELECT CODE FROM TT);
CODE NAME
---------- ----------
D ORACLE
--显示的是TT1表中,比TT表中所有的CODE都大的记录。上面的SQL也等价于
SELECT * FROM TT1 WHERE CODE > (SELECT MAX(CODE) FROM TT);
------------------------------------------------------------------------------------------------------------------------------------
--WITH AS的使用
--WITH AS相当于把一个SQL的中间结果保存到一个临时表中,供多次使用,用户提高SQL的可读性。
--此临时表生命周期只是查询的SQL内部
WITH TAB_TT AS
(SELECT * FROM TT)
SELECT * FROM TAB_TT;
ID CODE
---------- ----------
1 A
2 B
3 C
--listagg的使用
WITH TEMP AS(
SELECT 500 POPULATION, 'CHINA' NATION ,'GUANGZHOU' CITY FROM DUAL UNION ALL
SELECT 1500 POPULATION, 'CHINA' NATION ,'SHANGHAI' CITY FROM DUAL UNION ALL
SELECT 500 POPULATION, 'CHINA' NATION ,'BEIJING' CITY FROM DUAL UNION ALL
SELECT 1000 POPULATION, 'USA' NATION ,'NEW YORK' CITY FROM DUAL UNION ALL
SELECT 500 POPULATION, 'USA' NATION ,'BOSTOM' CITY FROM DUAL UNION ALL
SELECT 500 POPULATION, 'JAPAN' NATION ,'TOKYO' CITY FROM DUAL
)
SELECT POPULATION,
NATION,
CITY,
LISTAGG(CITY,',') WITHIN GROUP (ORDER BY CITY DESC) OVER (PARTITION BY NATION) RANK
FROM TEMP;
POPULATION NATIO CITY RANK
---------- ----- --------- ------------------------------
1500 CHINA SHANGHAI SHANGHAI,GUANGZHOU,BEIJING
500 CHINA GUANGZHOU SHANGHAI,GUANGZHOU,BEIJING
500 CHINA BEIJING SHANGHAI,GUANGZHOU,BEIJING
500 JAPAN TOKYO TOKYO
1000 USA NEW YORK NEW YORK,BOSTOM
500 USA BOSTOM NEW YORK,BOST
相关推荐
在《Oracle Database 11g OCP 认证全合一考试指南》这本书中,作者首先从数据库的基本概念入手,介绍了数据库的定义、SQL语言的基础以及Oracle 10g支持的数据库对象等内容。 ##### 1.1 数据库及其关系模型介绍 - *...
### OCP1Z0-052.188答案解析 #### 1. 查看展览并检查undo表空间的属性。 - **知识点**: 在Oracle数据库中,undo表空间是用于存储事务处理过程中未提交更改的数据。这部分内容讨论了如何查看undo表空间的属性,并...
根据提供的文档信息,我们可以推断出这份文档主要讨论了Oracle 10g OCP认证考试中的部分题目解析,特别是关于SQL语句的应用场景和技术选择。接下来,我们将详细解析文档中提及的重要知识点,并对其进行深入探讨。 #...
根据提供的信息,我们可以详细解析与Oracle 11g OCP-051考试相关的知识点,主要聚焦于SQL命令以及数据库表结构的操作。 ### SQL命令详解 #### 1. CREATE TABLE命令 CREATE TABLE 命令用于创建一个新的表,并定义表...
在这个例子中,`SALES`表中的`PROD_ID`、`CUST_ID`和`TIME_ID`字段都是外键,它们分别引用`PRODUCTS`、`CUSTOMERS`和`TIMES`表中的主键字段。 - **主键与外键的关系:** 主键是表中的唯一标识符,而外键则是指向另一...
- Oracle Database SQL Fundamentals IV是OCP认证的一部分,涵盖了数据库基础,特别是SQL第四级的深入知识,该部分考试的代号为1Z0-071。 - 该考试旨在评估考生对于SQL基础和数据库原理的理解,包括数据操作、数据...
### Oracle Certified Professional (OCP) 11g: SQL Fundamentals I (1Z0-051) V9.02知识点解析 #### 一、考试概述与版本介绍 本资料为最新的Oracle Certified Professional (OCP) 11g: SQL Fundamentals I (1Z0-...
在这个例子中,虽然第一个计划是在特定的OPTIMIZER_MODE下创建的,但是第二个计划被标记为可接受的,因此会被优先考虑。 ### 4. 表重新定义对触发器的影响 题目询问表重新定义后,附加到该表上的触发器会发生什么...
- 在这个例子中,虽然`CREATE TABLE`命令中的`order_date`列与`SELECT`子句中的`time_id`列名称不一致,但Oracle允许在`SELECT`子句中使用不同的列名来创建新表。因此,选项C错误。 - **选项D**:“`NEW_SALES`表会...
Oracle 11g OCP认证是Oracle公司提供的数据库管理专家认证之一,其中051考试是针对SQL基础知识的测试。OCP全称为Oracle Certified Professional,是继Oracle Certified Associate(OCA)之后的进阶认证。通过11g OCP...
例如,在给定的例子中,正确的顺序是1,4,3,2(Mount数据库、恢复数据文件、恢复数据、打开数据库)。 ### 3. Managing Database Performance & Tuning #### 3.1 性能管理与调优 - **性能监控**:了解数据库性能...
通过以上对题目的分析,可以看出OCP认证考试涵盖了Oracle数据库中的关键概念和技术细节,如表结构、视图权限、SQL查询语法等。这些知识点对于准备参加OCP认证考试的专业人士来说至关重要,掌握这些知识点将有助于...
7. **索引和性能优化**:书中可能包含使用索引来提升查询性能的例子,以及如何分析和优化SQL语句以提高系统整体性能。 通过仔细研究这些示例代码,读者可以加深对Oracle PL/SQL的理解,学习如何有效地编写和调试PL/...
- **PL/SQL 实例**:通过具体的例子来学习如何编写 PL/SQL 块。 #### 十三、PL/SQL 进阶 - **控制结构**:包括分支(`IF-THEN-ELSE`)、循环(`LOOP`, `FOR`)等控制结构。 - **复合类型**:PL/SQL 支持定义记录、数组...
2. **SQL中的单记录函数** - **单记录字符函数**:列举了Oracle中常用的字符处理函数,如UPPER、LOWER等。 - **单记录数字函数**:介绍了数字处理函数,如ROUND、TRUNC等。 - **单记录日期函数**:解释了日期处理...
2. 业务逻辑层(Business Logic Layer, BLL):此层负责执行应用程序的核心功能和业务规则。它不直接与数据库交互,而是通过数据访问层获取和更新数据。BLL是应用的核心,确保数据处理的正确性和一致性。在...
1. **开闭原则**(Open-Closed Principle, OCP) - 描述:开闭原则提倡代码应该是开放扩展但封闭修改的。这意味着我们可以添加新功能而不需改变现有代码。这一原则主要通过抽象和封装来实现。 2. **里氏替换原则**...
在这个例子中,由于 `USER1.EMP` 表中的 `DNO` 字段作为外键参照了 `USER1.DEPT` 表中的 `DNO` 字段,因此直接尝试删除 `USER1.DEPT` 表中的 `DNO` 列会导致违反引用完整性规则,从而导致操作失败。 ### 知识点二:...
这个例子是学习和实践设计模式的好机会,例如单一职责原则(SRP)、开闭原则(OCP)等,这些都可以提升代码质量。 总结,这个“asp.net三层架构例子”涵盖了ASP.NET开发中基础的三层架构设计,通过实际的注册功能...