OraclePL/SQL(一)

2014-11-24 12:48:45 · 作者: · 浏览: 0

SQL

Distinct

NULL

||连接符

Oracle数据库中大小写敏感

要求找出含有%的记录

这需要使用ESCAPE标识转义字符

select * from t_charwhere a like ‘%\%%' escape '\';

select * fromt_char where a like ‘%K%%' escape ‘K';

PLSQL中日期比较

1.格式需要一致,可以通过字符串比较。

2.TO_CHAR(CREATE_DATE,'yyyy-mm-dd')>=NVL(P_CREATE_FROMDATE,TO_CHAR(CREATE_DATE,'yyyy-mm-dd'))

2. START_DATE <= TO_date(p_trans_date,'YYYY-MM-DD')

--不易发现的错误

select * from test1where column1 = '1234';--将所有行转换为字符串

select * from test1where column1 = 1234;--将所有行转换为数字,包含字符的行出错

--连接

-oracle全外外连接

select e.last_name,e.department_id,d.department_namefrom employees e,departments dwhere e.department_id=d.department_id(+)union

select e.last_name,e.department_id,d.department_namefrom employees e,departments dwhere e.department_id(+)=d.department_id;

--sql1999标准

SELECT e.last_name, e.department_id, d.department_name

FROM employees e

FULLOUTERJOIN departments d

ON (e.department_id =d.department_id) ;

分组计算函数和group by子句

备注:MIN, MAX 可用于任何数据类型,但AVG, SUM,STDDEV,VARIANCE仅适用于数值型字段。

使用GROUP BY 子句进行分组:

l 可以按照某一个字段分组,也可以按照多个字段的组合进行分组

l SELECT查询语句中同时选择分组计算函数表达式和其他独立字段时,其他字段必须出现在Group By子句中,否则不合法。

l 不能在Where条件中使用分组计算函数表达式,当出现这样的需求的时候,使用Having 子句。

l 分组计算函数也可嵌套使用。

事务控制

隐式的事务提交或回滚动作:

Commit,rollback 是显式的提交和回滚语句,还有一些隐式的提交和回滚是大家需要知道并引起注意的:

当如下事件发生是,会隐式的执行Commit动作:

1、数据定义语句被执行的时候,比如新建一张表:Create Table …

2、数据控制语句被执行的时候,比如赋权GRANT …( 或者DENY)

3、正常退出iSQL*Plus 或者PLSQLDEVELOPER, 而没有显式的执行COMMIT 或者ROLLBACK 语句。

当如下事件发生时,会隐式执行Rollback 动作:

1、非正常退出iSQL*Plus, PLSQL DEVELOPER, 或者发生系统错误。

在Commit 或者Rollback前后数据的状态:

1、在数据已经被更改,但没有Commit前,被更改记录处于被锁定状态,其他用户无法进行更改;

2、在数据已经被更改,但没有Commit前,只有当前Session的用户可以看到这种变更,其他Session的用户

看不到数据的变化。

3、在数据已经被更改,并且被Commit后,被更改记录自动解锁,其他用户可以进行更改;

4、在数据已经被更改,并且被Commit后,其他Session的用户再次访问这些数据时,看到的是变化后的数据。

那么同理可知Rollback前后数据的状态及锁的变化。

表的命名要求和表中列的命名要求:

1、必须以字母开头

2、长度不能超过30个字符

3、只能包含A–Z,a–z, 0–9,_, $, and #

4、不能与数据库中的已有对象重名

5、不能使用Oracle 数据库的保留字

注意TRUNCATE 与DELETE FROM table 的区别: 1)没有Rollback机会2)HWM标记复位(HWM高水位线)都不会删除表结构

约束

更改表的语法:

添加列:

ALTERTABLE table

ADD(column datatype [DEFAULT expr]

[, columndatatype]...);

更改列:

ALTERTABLE table

MODIFY(column datatype [DEFAULT expr]

[, columndatatype]...);

删除列:

ALTERTABLE table

DROP(column);

ALTER TABLE tablenameADD CONSTRAINT constraintname

constrainttype(column1,…);

CONSTRAINT emp_email_ukUNIQUE(email))

CONSTRAINT dept_id_pk PRIMARYKEY(department_id))

CONSTRAINT emp_dept_fk FOREIGN KEY (department_id)

REFERENCESdepartments(department_id)

CONSTRAINT emp_salary_min CHECK (salary > 0)

索引、序列、同义词

函数索引

CREATE INDEX upper_dept_name_idx

ON departments(UPPER(department_name));

控制用户权限

GRANT object_priv [(columns)]

ON object

TO {user|role|PUBLIC}

[WITHGRANT OPTION];

如果你想让其他用户也有权把你赋给他的权限进一步赋予给别人,那么需要带WITH GRANT OPTION;

GRANT select, insert

ON departments

TO scott

WITH GRANT OPTION;

撤销权限

REVOKE {privilege [, privilege...]|ALL}

ON object

FROM{user[, user...]|role|PUBLIC}

创建DB-LINK,通过DB-LINK访问另一数据库中的表

CREATE PUBLIC DATABASE LINK hq.acme.com

USING'sales';

SELECT*

FROMemp@HQ.ACME.COM;

递归查询

SELECTlast_name||' reports to '||

PRIORlast_name "Walk Top Down"

FROMemployees

STARTWITH last_name = 'King'

CONNECTBY PRIOR employee_id = manager_id ;

使用LEVEL关键字和LPAD函数,在OUTPUT中显示树形层次。

SELECT LPAD(last_name,LENGTH(last_name)+(LEVEL*2)-2,'_')

AS org_chart

FROM