[DECLARE] ---declaration statements BEGIN ---executable statements [EXCEPTION] ---exception statements END |
FUNCTION name [{parameter[,parameter,...])] RETURN datatypes IS [local declarations] BEGIN execute statements [EXCEPTION exception handlers] END [name] |
PROCEDURE name [(parameter[,parameter,...])] IS [local declarations] BEGIN execute statements [EXCEPTION exception handlers ] END [name] |
Variable_name [CONSTANT] databyte [NOT NULL][:=|DEFAULT expression]
|
ZERO_VALUE CONSTANT NUMBER:=0;
|
Datatype
|
Range
|
Subtypes
|
description
|
BINARY_INTEGER
|
-214748-2147483647
|
NATURAL NATURAL NPOSITIVE POSITIVEN SIGNTYPE |
用于存储单字节整数。
要求存储长度低于 NUMBER 值。 用于限制范围的子类型 (SUBTYPE): NATURAL: 用于非负数 POSITIVE: 只用于正数 NATURALN: 只用于非负数和非 NULL 值 POSITIVEN: 只用于正数,不能用于 NULL 值 SIGNTYPE: 只有值 :-1 、 0 或 1. |
NUMBER
|
1.0E-130-9.99E125
|
DEC DECIMAL DOUBLE PRECISION FLOAT INTEGERIC INT NUMERIC REAL SMALLINT |
存储数字值,包括整数和浮点数。可以选择精度和刻度方式,语法:
number[ ( [,] ) ] 。 缺省的精度是 38,scale 是 0. |
PLS_INTEGER
|
-2147483647-2147483647
|
|
与
BINARY_INTEGER
基本相同,但采用机器运算时,
PLS_INTEGER
提供更好的性能
。
|
datatype
|
rang
|
subtype
|
description
|
CHAR
|
最大长度
32767
字节
|
CHARACTER
|
存储定长字符串,如果长度没有确定,缺省是
1
|
LONG
|
最大长度
2147483647
字节
|
|
存储可变长度字符串
|
RAW
|
最大长度
32767
字节
|
|
用于存储二进制数据和字节字符串,当在两个数据库之间进行传递时,
RAW
数据不在字符集之间进行转换。
|
LONGRAW
|
最大长度
2147483647
|
|
与
LONG
数据类型相似,同样他也不能在字符集之间进行转换。
|
ROWID
|
18
个字节
|
|
与数据库
ROWID
伪列类型相同,能够存储一个行标示符,可以将行标示符看作数据库中每一行的唯一键值。
|
VARCHAR2
|
最大长度
32767
字节
|
STRINGVARCHAR
|
与
VARCHAR
数据类型相似,存储可变长度的字符串。声明方法与
VARCHAR
相同
|
datatype
|
range
|
description
|
BOOLEAN
|
TRUE/FALSE
|
存储逻辑值
TRUE
或
FALSE,
无参数
|
DATE
|
01/01/4712 BC
|
存储固定长的日期和时间值,日期值中包含时间
|
operator
|
operation
|
+
|
加
|
-
|
减
|
/
|
除
|
*
|
乘
|
**
|
乘方
|
operator
|
operation
|
<
|
小于操作符
|
<=
|
小于或等于操作符
|
>
|
大于操作符
|
>=
|
大于或等于操作符
|
=
|
等于操作符
|
!=
|
不等于操作符
|
<>
|
不等于操作符
|
:=
|
赋值操作符
|
operator
|
operation
|
IS NULL
|
如果操作数为
NULL
返回
TRUE
|
LIKE
|
比较字符串值
|
BETWEEN
|
验证值是否在范围之内
|
IN
|
验证操作数在设定的一系列值中
|
operator
|
operation
|
AND
|
两个条件都必须满足
|
OR
|
只要满足两个条件中的一个
|
NOT
|
取反
|
declare v_comm_percent constant number:=10; begin update emp set comm=sal*v_comm_percent where deptno=10; end SQL> / PL/SQL procedure successfully completed. SQL> |
create or replace procedure update_commission (v_dept in number,v_pervent in number default 10) is begin update emp set comm=sal*v_percent where deptno=v_dept; end SQL>/ Procedure created SQL>execute update_commission(10,15); PL/SQL procedure successfully completed. SQL> |
declare v_dept number; begin select a.deptno into v_dept from emp a where job='PRESIDENT' update_commission(v_dept); end SQL>/ PL/SQL procedure successfully completed SQL> |
IF condition THEN Statements 1; Statements 2; .... END IF |
IF condition THEN Statements 1; Statements 2; .... ELSE Statements 1; Statements 2; .... END IF |
if (a>b) and (a>c) then g:=a; else g:=b; if c>g then g:=c; end if end if |
IF condition1 THEN statement1; ELSIF condition2 THEN statement2; ELSIF condition3 THEN statement3; ELSE statement4; END IF; statement5; |
X:=100; LOOP X:=X+10; IF X>1000 THEN EXIT; END IF END LOOP; Y:=X; |
X:=100; LOOP X:=X+10; EXIT WHEN X>1000; X:=X+10; END LOOP; Y:=X; |
X:=100; WHILE X<=1000 LOOP X:=X+10; END LOOP; Y=X; |
FOR counter IN [REVERSE] start_range....end_range LOOP statements; END LOOP; |
X:=100; FOR v_counter in 1..10 loop x:=x+10; end loop y:=x; |
<> [DECLARE] ... ... ... BEGIN ........ [EXCEPTION] ....... END label_name |
<> LOOP ......... <> loop .......... <> loop .... EXIT outer_loop WHEN v_condition=0; end loop innermost_loop; .......... END LOOP inner_loop; END LOOP outer_loop; |
X
:
=100; FOR V_COUNTER IN 1..10 LOOP IF V_COUNTER =4 THEN GOTO end_of_loop END IF X:=X+10; <> NULL END LOOP Y:=X; |
《
OUTER BLOCK
》
DECLARE A_NUMBER INTEGER ; B_NUMBER INTEGER ; BEGIN --A_NUMBER and B_NUMBER are available here <> DECLARE C_NUMBER INTEGER B_NUMBER NUMBER(20) BEGIN C_NUMBER:=A_NUMBER; C_NUMBER=OUTER_BLOCK.B_NUMBER; END SUB_BLOCK; END OUT_BLOCK; |
TYPE record_type IS RECORD (field_definition_list);
|
field_name data_type_and_size [NOT NULL][{:=|DEFAULT} default_value]
|
DELCARE TYPE stock_quote_rec IS RECORD (symbol stock.symbol%TYPE ,bid NUMBER(10,4) ,ask NUMBER(10,4) ,volume NUMBER NOT NULL:=0 ,exchange VARCHAR2(6) DEFAULT 'NASDAQ' ); real_time_quote stock_quote_rec; variable |
DECLARE accounter_info accounts%ROWTYPR; CURSOR xactions_cur(acct_no IN VARCHAR2) IS SELECT action,timestamp,holding FROM portfolios WHERE account_nbr='acct_no' ; xaction_info xactions_cur%ROWTYPE; variable |
DELCARE CURSOR xaction_cur IS SELECT action,timeamp,holding FROM portfolios WHERE account_nbr='37' ; BEGIN FOR xaction_rec in xactions_cur LOOP IF xactions_rec.holding='ORCL' THEN notify_shareholder; END IF; END LOOP; |
DELCARE TYPE stock_quote_rec IS RECORD (symbol stock.symbol%TYPE ,bid NUMBER(10,4) ,ask NUMBER(10,4) ,volume NUMBER NOT NULL:=0 ,exchange VARCHAR2(6) DEFAULT 'NASDAQ' ); TYPE detailed_quote_rec IS RECORD (quote stock_quote_rec ,timestamp date ,bid_size NUMBER ,ask.size NUMBER ,last_tick VARCHAR2(4) ); real_time_detail detail_quote_rec; BEGIN real_time_detail.bid_size:=1000; real_time_detail.quote.volume:=156700; log_quote(real_time_detail.quote); |
DECLARE stock_info1 stocks%ROWTYPE; stock_info2 stocks%ROWTYPE; BEGIN SELECT symbol,exchange INTO stock_info1.symbol,stock_info1.exchange FROM stocks WHERE symbol='ORCL'; SELECT * INTO stock_info2 FROM stocks WHERE symbol='ORCL'; |
FETCH cursor_name INTO variable;
|
DECLARE CURSOR stock_cur(symbol_in VARCHAR2) IS SELECT symbol,exchange,begin_date FROM stock WHERE symbol=UPPER(symbol_in); stock_info stock_cur%ROWTYPE BEGIN OPEN stock_cur('ORCL'); FETCH stock_cur INTO stock_info; |
DECLARE TYPE stock_quote_rec IS RECORD (symbol stocks.symbol%TYPE ,bid NUMBER(10,4) ,ask number(10,4) ,volume NUMBER ); TYPE stock_quote_too IS RECORD (symbol stocks.symbol%TYPE ,bid NUMBER(10,4) ,ask number(10,4) ,volume NUMBER ); -- 这两个记录看上去是一样的,但实际上是不一样的 stock_one stocks_quote_rec; stock_two stocks_quote_rec; -- 这两个域有相同的数据类型和大小 stock_also stock_rec_too ; -- 与 stock_quote_rec 是不同的数据类型 BEGIN stock_one.symbol:='orcl'; stock_one.volume:=1234500; stock_two : =stock_one;-- 正确 syock_also : =stock_one;-- 错误,数据类型错误 stock_also.symbol:=stock_one.symbol; stock_also.volume:=stock_one.volume; |
IF sort_rec(stock_one)>sort_rec(stock_two) THEN
|
TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY BINARY_INTERGET; |
DECLARE TYPE symbol_tab_typ IS TABLE OF VARCHAR2(5) INDEX BY BINARY_INTEGER; symbol_tab symbol_tab_typ; BEGIN |
TYPE type_name IS [VARRAY|VARYING ARRAY] (max_size) OF element_type [NOT NULL] |
TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY BINARY_INTERGET; |
DECLARE TYPE symbol_tab_typ IS TABLE OF VARCHAR2(5) INDEX BY BINARY_INTEGER; symbol_tab symbol_tab_typ; BEGIN |
TYPE type_name IS [VARRAY|VARYING ARRAY] (max_size) OF element_type [NOT NULL] |
方法
|
描述
|
使用限制
|
COUNT
|
返回集合中元素的个数
|
|
DELETE
|
删除集合中所有元素
|
|
DELETE()
|
删除元素下标为
x
的元素,如果
x
为
null,
则集合保持不变
|
对
VARRAY
非法
|
DELETE(,)
|
删除元素下标从
X
到
Y
的元素,如果
X>Y
集合保持不变
|
对
VARRAY
非法
|
EXIST()
|
如果集合元素
x
已经初始化,则返回
TRUE,
否则返回
FALSE
|
|
EXTEND
|
在集合末尾添加一个元素
|
对
Index_by
非法
|
EXTEND()
|
在集合末尾添加
x
个元素
|
对
Index_by
非法
|
EXTEND(,)
|
在集合末尾添加元素
n
的
x
个副本
|
对
Index_by
非法
|
FIRST
|
返回集合中的第一个元素的下标号,对于
VARRAY
集合始终返回
1
。
|
|
LAST
|
返回集合中最后一个元素的下标号
,
对于
VARRAY
返回值始终等于
COUNT.
|
|
LIMIT
|
返回
VARRY
集合的最大的元素个数,对于嵌套表和对于嵌套表和
Index_by
为
null
|
Index_by
集合无用
|
NEXT()
|
返回在元素
x
之后及紧挨着它的元素的值,如果该元素是最后一个元素,则返回
null.
|
|
PRIOR()
|
返回集合中在元素
x
之前紧挨着它的元素的值,如果该元素是第一个元素,则返回
null
。
|
|
TRI M
|
从集合末端开始删除一个元素
|
对于
index_by
不合法
|
TRIM()
|
从集合末端开始删除
x
个元素
|
对
index_by
不合法
|
IF stock_list1>stock_list2 ----
非法
IF sort_collection(stock_list1)>sort_collection(stock_list2) THEN -- 合法 |
SELECT ename,TO_CHAR(hiredate,'day,DD-Mon-YYYY') FROM emp Where UPPER(ename) Like 'AL%' ORDER BY SOUNDEX(ename) |
column name emp_id salary bonus key type pk nulls/unique nn,u nn fk table datatype number number number length 11.2 11.2 |
update emp set salary=(salary+bonus)*1.1 |
update emp set salary=(salary+nvl(bonus,0)*1.1 |
SELECT ASCII('A') BIG_A,ASCII('z') BIG_z FROM emp BIG_A BIG_z 65 122 |
select CHR(65),CHR(122),CHR(223) FROM emp CHR65 CHR122 CHR223 A z B |
select concat('slobo ','Svoboda') username from dual username slobo Syoboda |
select INITCAP('veni,vedi,vici') Ceasar from dual Ceasar Veni,Vedi,Vici |
select INSTR('Mississippi','i',3,3) from dual INSTR('MISSISSIPPI','I',3,3) 11 select INSTR('Mississippi','i',-2,3) from dual INSTR('MISSISSIPPI','I',3,3) 2 |
select LENGTH('Ipso Facto') ergo from dual ergo 10 |
select LOWER(colorname) from itemdetail WHERE LOWER(colorname) LIKE '%white%' COLORNAME Winterwhite |
select LPAD(answer,7,'') padded,answer unpadded from question; PADDED UNPADDED Yes Yes NO NO Maybe maybe |
select LTRIM('Mississippi','Mis') from dual LTR ppi |
select REPLACE('uptown','up','down') from dual REPLACE downtown |
select SUBSTR('Message',1,4) from dual SUBS Mess |
select SOUNDEX('dawes') Dawes SOUNDEX('daws') Daws, SOUNDEX('dawson') from dual Dawes Daws Dawson D200 D200 D250 |
select TRANSLATE('fumble','uf','ar') test from dual TEXT ramble |
select TRIM(' space padded ') trim from dual TRIM space padded |
select name from dual where UPPER(name) LIKE 'KI%' NAME KING |
select ACOS(-1) pi,ACOS(1) ZERO FROM dual PI ZERO 3.14159265 0 |
select COSH(<1.4>) FROM dual COSH(1.4) 2.15089847 |
select ROUND(12345,-2),ROUND(12345.54321,2) FROM dual ROUND(12345,-2) ROUND(12345.54321,2) 12300 12345.54 |
select NEXT_DAY('01-Jan-2000','Monday') "1st Monday",NEXT_DAY('01-Nov-2004','Tuesday')+7 "2nd Tuesday") from dual; 1st Monday 2nd Tuesday 03-Jan-2000 09-Nov-2004 |
SELECT test_id from test_case where rowid=CHARTORWID('AAAA0SAACAAAALiAAA')
|
NLS_NUMERIC_CHARACTERS ="dg", NLS_CURRENCY="string"
|
SELECT AVG(sal),AVG(ALL sal),AVG(DISTINCT sal) FROM scott.emp AVG(SAL) AVG(ALL SAL) AVG(DISTINCT SAL) 1877.94118 1877.94118 1916.071413 |
select stat,counter(*) zip_count from zip_codes GROUP BY state; ST ZIP_COUNT -- --------- AK 360 AL 1212 AR 1309 AZ 768 CA 3982 |
select stat,counter(*) zip_count from zip_codes GROUP BY state ORDER BY COUNT(*) DESC; ST COUNT(*) -- -------- NY 4312 PA 4297 TX 4123 CA 3982 |
错误
SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' AND SUM(sale_amount)>10000 GROUP BY sales_clerk |
SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' GROUP BY sales_clerk HAVING SUM(sale_amount)>10000; |
SELECT deptno, GREATEST(COUNT(DISTINCT job),COUNT(DISTINCT mgr) cnt, COUNT(DISTINCT job) jobs, COUNT(DISTINCT mgr) mgrs FROM emp GROUP BY deptno; DEPTNO CNT JOBS MGRS ------ --- ---- ---- 10 4 4 2 20 4 3 4 30 3 3 2 |
CREATE TABLE products ( PROD_ID NUMBER(4), PROD_NAME VAECHAR2(20), STOCK_QTY NUMBER(5,3) ); |
SQL>CREATE TABLE emp AS SELECT * FROM employee TABLE CREATED SQL> CREATE TABLE Y AS SELECT * FROM X WHERE no=2 |
ALTER TABLE [schema.] table_name ADD column_definition
|
ALTER TABLE orders ADD order_date DATE; TABLE ALTER |
ALTER TABLE [schema.] table_name MODIFY column_name new_attributes;
|
ALTER TABLE orders MODITY (quantity number(10,3),status varchar2(15));
|
ALTER TABLE [schema.] table_name DROP {COLUM column_names | (column_names)}[CASCADE CONSTRAINS]
|
ALTER TABLE [schema.] table_name SET UNUSED {COLUM column_names | (column_names)}[CASCADE CONSTRAINS]
|
ALTER TABLE [schema.] table_name DROP {UNUSED COLUM | COLUMN CONTINUE}
|
DROP TABLE [schema.] table_name [CASCADE CONSTRAINTS]
|
RENAME old_name TO new_name;
|
SQL> RENAME orders TO purchase_orders; TABLE RENAMED |
TRUNCATE {TABLE|CLUSTER} [schema.] name {DROP|REUSE STORAGE}
|
SQL> TRUNCATE TABLE t1; TABLE truncate. |
SQL> CREATE VIEW TOP_EMP AS SELECT empno EMPLOYEE_ID,ename EMPLOYEE_NAME,salary FROM emp WHERE salary >2000 |
SQL> CREATE VIEW TOP_EMP ( EMPLOYEE_ID , EMPLOYEE_NAME , SALARY) AS SELECT empno ,ename ,salary FROM emp WHERE salary >2000 |
CREATE FORCE VIEW ORDER_STATUS AS SELECT * FROM PURCHASE_ORDERS WHERE STATUS='APPPOVE'; SQL>/ warning :View create with compilation errors |
DROP VIEW TOP_EMP;
|
ALTER TABLE table_name DISABLE CONSTRAINT constraint_name;
|
ALTER TABLE policies DISABLE CONSTRAINT chk_gender
|
ALTER TABLE policies ENABLE CONSTRAINT chk_gender
|
ALTER TABLE table_name DROP CONSTRAINT constraint_name
|
ALTER TABLE policies DROP CONSTRAINT chk_gender;
|
CONSTRAINT [constraint_name] CHECK (condition);
|
CREATE TABLE policies (policy_id NUMBER, holder_name VARCHAR2(40), gender VARCHAR2(1) constraint chk_gender CHECK (gender in ('M','F'), marital_status VARCHAR2(1), date_of_birth DATE, constraint chk_marital CHECK (marital_status in('S','M','D','W')) ); |
CREATE TABLE policies (policy_id NUMBER, holder_name VARCHAR2(40) NOT NULL, gender VARCHAR2(1), marital_status VARCHAR2(1), date_of_birth DATE NOT NULL ); |
ALTER TABLE policies MODIFY holder_name NOT NULL
|
column_name data_type CONSTRAINT constraint_name UNIQUE
|
CONSTRAINT constraint_name (column) UNIQUE USING INDEX TABLESPACE (tablespace_name) STORAGE (stored clause)
|
CREATE TABLE insured_autos (policy_id NUMBER CONSTRAINT pk_policies PRIMARY KEY, vin VARCHAR2(10), coverage_begin DATE, coverage_term NUMBER, CONSTRAIN unique_auto UNIQUE (policy_id,vin) USING INDEX TABLESPACE index STORAGE (INITIAL 1M NEXT 10M PCTINCREASE 0) ); |
ALTER TABLE insured_autos DISABLE CONSTRAIN unique_name;
|
ALTER TABLE insured_autos DROP CONSTRAIN unique_name;
|
CREATE TABLE policies (policy_id NUMBER CONSTRAINT pk_policies PRIMARY KEY, holder_name VARCHAR2(40), gender VARCHAR2(1), marital_status VARCHAR2(1), date_of_birth DATE ); |
CREATE TABLE insured_autos (policy_id NUMBER, vin VARCHAR2(40), coverage_begin DATE, coverage_term NUMBER, CONSTRAINT pk_insured_autos PRIMARY KEY (policy_id,vin) USING INDEX TABLESPACE index STORAGE (INITIAL 1M NEXT 10M PCTINCREASE 0) ); |
ALTER TABLE policies DROP PRIMARY KEY;
|
ALTER TABLE policies DISABLE PRIMARY KEY;
|
CREATE TABLE insured_autos (policy_id NUMBER CONSTRAINT policy_fk REFERENCE policies(policy_id ON DELETE CASCADE, vin VARCHAR2(40), coverage_begin DATE, coverage_term NUMBER, make VARCHAR2(30), model VARCHAR(30), year NUMBER, CONSTRAIN auto_fk FROEIGN KEY (make,model,year) REFERENCES automobiles (make,model,year) ON DELETE SET NULL ); |
MAKE
|
MODEL
|
YEAR
|
Ford
|
Taurus
|
2000
|
Toyota
|
Camry
|
1999
|
POLICY_ID
|
MAKE
|
MODEL
|
YEAR
|
576
|
Ford
|
Taurus
|
2000
|
577
|
Toyota
|
Camry
|
1999
|
578
|
Tucker
|
NULL
|
1949
|
SET CONSTRAINT constraint_name|ALL DEFEERRED|IMMEDIATE --;
|
CREATE SEQUENCE [schema] sequence KEYWORD
|
KEYWORD
|
描述
|
START WITH
|
定义序列生成的第一个数字,缺省为
1
|
INCREMENT BY
|
定义序列号是上升还是下降,对于一个降序的序列
INCREMENT BY
为负值
|
MINVALUE
|
定义序列可以生成的最小值,这是降序序列中的限制值。缺省情况下该值为
NOMINVALUE,NOMINVALUE
,对于升序为
1
,对于降序为
-10E26.
|
MAXVALUE
|
序列能生成的最大数字。这是升序序列中的限制值,缺省的
MAXVALUE
为
NOMAXVALUE,NOMAXVALUE
,对于升序为
10E26
,对于降序为
-1
。
|
CYCLE
|
设置序列值在达到限制值以后可以重复
|
NOCYCLE
|
设置序列值在达到限制值以后不能重复,这是缺省设置。当试图产生
MAXVALUE+1
的值时,将会产生一个异常
|
CACHE
|
定义序列值占据的内存块的大小,缺省值为
20
|
NOCACHE
|
在每次序列号产生时强制数据字典更新,保证在序列值之间没有间隔当创建序列时,
START WITH
值必须等于或大于
MINVALUE
。
|
DROP SEQUENCE sequence_name
|
CREATE [PUBLIC] SYNONYM synonym_name FOR [schema.] object[@db_link];
|
CREATE PUBLIC SYNONYM policies FOR poladm.policies@prod; CREATE SYNONYM plan_table FOR system.plan_table; |
CREATE [ OR REPLACE] PROCEDURE [schema.]procedure_name [parameter_lister] {AS|IS} declaration_section BEGIN executable_section [EXCEPTION exception_section] END [procedure_name] |
CREATE [ OR REPLACE] FINCTION [schema.]function_name [parameter_list] RETURN returning_datatype {AS|IS} declaration_section BEGIN executable_section [EXCEPTION] exception_section END [procedure_name] |
CREATE OR REPLACE FUNCTION my_sin(DegreesIn IN NUMBER) RETURN NUMBER IS pi NUMBER=ACOS(-1); RadiansPerDegree NUMBER; BEGIN RadiansPerDegree=pi/180; RETURN(SIN(DegreesIn*RadiansPerDegree)); END |
CREATE [OR REPLACE] PACKAGE package_name {AS|IS} public_variable_declarations | public_type_declarations | public_exception_declarations | public_cursor_declarations | function_declarations | procedure_specifications END [package_name] |
CREATE [OR REPLACE] PACKAGE BODY package_name {AS|IS} private_variable_declarations | private_type_declarations | private_exception_declarations | private_cursor_declarations | function_declarations | procedure_specifications END [package_name] |
事件
|
触发器描述
|
INSERT
|
当向表或视图插入一行时触发触发器
|
UPDATE
|
更新表或视图中的某一行时触发触发器
|
DELETE
|
从表或视图中删除某一行时触发触发器
|
CREATE
|
当使用
CREATE
语句为数据库或项目增加一个对象时触发触发器
|
ALTER
|
当使用
ALTER
语句为更改一个数据库或项目的对象时触发触发器
|
DROP
|
当使用
DROP
语句删除一个数据库或项目的对象时触发触发器
|
START
|
打开数据库时触发触发器,在事件后触发
|
SHUTDOWN
|
关闭数据库时触发,事件前触发
|
LOGON
|
当一个会话建立时触发,事件前触发
|
LOGOFF
|
当关闭会话时触发,事件前触发
|
SERVER
|
服务器错误发生时触发触发器,事件后触发
|
CREATE [OR REPLACE] TRIGGER trigger_name {before|after|instead of} event ON {table_or_view_name|DATABASE} [FOR EACH ROW[WHEN condition]] trigger_body |
ALTER TRIGGER trigger_name ENABLE; ALTER TRIGGER trigger_name DISABLE; |
ALTER TRIGGER table_name DISABLE ALL TRIGGER; ALTER TRIGGER table_name ENABLE ALL TRIGGER; |
DROP TRIGGER trigger_name;
|
视图家族
(View Family)
|
描述
|
COL_PRIVS
|
包含了表的列权限,包括授予者、被授予者和权限
|
EXTENTS
|
数据范围信息,比如数据文件,数据段名
(segment_name)
和大小
|
INDEXES
|
索引信息,比如类型、唯一性和被涉及的表
|
IND_COLUMNS
|
索引列信息,比如索引上的列的排序方式
|
OBJECTS
|
对象信息,比如状态和
DDL time
|
ROLE_PRIVS
|
角色权限,比如
GRANT
和
ADMIN
选项
|
SEGMENTS
|
表和索引的数据段信息,比如
tablespace
和
storage
|
SEQUECNCES
|
序列信息,比如序列的
cache
、
cycle
和
ast_number
|
SOURCE
|
除触发器之外的所有内置过程、函数、包的源代码
|
SYNONYMS
|
别名信息,比如引用的对象和数据库链接
db_link
|
SYS_PRIVS
|
系统权限,比如
grantee
、
privilege
、
admin
选项
|
TAB_COLUMNS
|
表和视图的列信息,包括列的数据类型
|
TAB_PRIVS
|
表权限,比如授予者、被授予者和权限
|
TABLES
|
表信息,比如表空间
(tablespace),
存储参数
(storage parms)
和数据行的数量
|
TRIGGERS
|
触发器信息,比如类型、事件、触发体
(trigger body)
|
USERS
|
用户信息,比如临时的和缺省的表空间
|
VIEWS
|
视图信息,包括视图定义
|
VIEW NAME
|
描述
|
USER_COL_PRIVS_MADE
|
用户授予他人的列权限
|
USER_COL_PRIVS_RECD
|
用户获得的列权限
|
USER_TAB_PRIVS_MADE
|
用户授予他人的表权限
|
USER_TAB_PRIVS_RECD
|
用户获得的表权限
|
SELECT 'ALTER USER'||username|| 'TEMPORARY TABLESPACE temp;' FROM DBA_USERS WHERE username<>'SYS' AND temporary_tablespace<>'TEMP'; |
ALTER USER SYSTEM TEMPORARY TABLESPACE temp; ALTER USER OUTLN TEMPORARY TABLESPACE temp; ALTER USER DBSNMP TEMPORARY TABLESPACE temp; ALTER USER SCOTT TEMPORARY TABLESPACE temp; ALTER USER DEMO TEMPORARY TABLESPACE temp; |
语句
|
用途
|
INSERT
|
向表中添加行
|
UPDATE
|
更新存储在表中的数据
|
DELETE
|
删除行
|
SELECT FOR UPDATE
|
禁止其他用户访问
DML
语句正在处理的行。
|
LOCK TABLE
|
禁止其他用户在表中使用
DML
语句
|
INSERT INTO customers(cust_id,state,post_code) VALUE('Ariel',NULL,'94501'); |
INSERT INTO customers(cust_id,state,post_code) VALUE('Ariel',,'94501'); |
UPDATE order_rollup SET(qty,price)=(SELECT SUM(qty),SUM(price) FROM order_lines WHERE customer_id='KOHL' WHERE cust_id='KOHL' AND order_period=TO_DATE('01-Oct-2000') |
DELETE FROM po_lines WHERE ship_to_state IN ('TX','NY','IL') AND order_date<TRUNC(SYSTEM)-90< td> |
TRUNCATE TABLE (schema)table DROP(REUSE) STORAGE
|
LOCK schema table IN lock_mode
|
LOCK TABLE intentory IN EXCLUSIVE MODE
|
语句
|
用途
|
Commit
|
完成事务,数据修改成功并对其他用户开放
|
Rollback
|
撤销事务,撤销所有操作
|
rollback to savepoint
|
撤销在设置的回滚点以后的操作
|
set transaction
|
响应事务或语句的一致性;特别对于事务使用回滚段
|
BEGIN UPDATE checking SET balance=balance-5000 WHERE account='Kieesha'; INSERT INTO checking_log(action_date,action,amount) VALUES (SYSDATE,'Transfer to brokerage',-5000); UPDATE brokerage SET cash_balance=cash_balance+5000 WHERE account='Kiesha'; INSERT INTO brokerage_log(action_date,action,amount) VALUES (SYSDATE,'Tracfer from checking',5000) COMMIT EXCEPTION WHEN OTHERS ROLLBACK END |
BEGIN INSERT INTO ATM_LOG(who,when,what,where) VALUES ('Kiesha',SYSDATE,'Withdrawal of $100','ATM54') SAVEPOINT ATM_LOGGED; UPDATE checking SET balance=balance-100 RETURN balance INTO new_balance; IF new_balance<0 THEN ROLLBACK TO ATM_LOGGED; COMMIT RAISE insufficient_funda; END IF END |
ROLLBACK TO ATM_LOGGED; ROLLBACK TO SAVEPOINT ATM_LOGGED; |
SET TRANSACTION ISOLATION LEVEL READ COMMIT; SET TRANSACTION ISOLATION LEVEL READ COMMIT |
SET TRANSCATION READ ONLY
|
SELECT(
没有
FOR UPDATE
子句)
LOCK TABLE SET ROLE ALTER SYSTEM ALTER ALARM |
SET TRANSACTION USE ROLLBACK SEGMENT rb_large;
|
rb_large(initial 100M minextenta 2) rb1 (initial 1M next minextents 5) rb2 (initial 1M next minextents 5) rb3 (initial 1M next minextents 5) rb4 (initial 1M next minextents 5) rb5 (initial 1M next minextents 5) rb6 (initial 1M next minextents 5) rb7 (initial 1M next minextents 5) rb8 (initial 1M next minextents 5) rb9 (initial 1M next minextents 5) rb10 (initial 1M next minextents 5) |
SET TRANSACTION USE ROLLBACK SEGMENT rb_large
|
CREATE USE piyush IDENTIFIED BY welcome
|
ALTER USER piyush IDENTIFIED BY saraswati;
|
CREATE USER ops$appl IDENTIFIED EATERNALLY
|
CREATE USER appl IDENTIFIED EATERNALLY
|
CREATE USER scott IDENTIFIED GLOBALLY AS "CN=scott,OU=divisional,O=sybex,C=US"
|
CREATE USER piyush IDENTIFIED BY saraswati DEFAULTE TABLESPACE user_data; ALTER USER manoj DEFAULTE TABLESPACE dev1_data; |
CREATE USER piyush IDENTIFIED BY saraswati Temporary TABLESPACE user_data; ALTER USER manoj Temporary TABLESPACE dev1_data; |
CREATE USER piyush IDENTIFIED BY saraswati DEFAULT TABLESPACE user_data QUOTA UNLIMITED ON user_data QUOTA 20M ON tools; ALTER USER manoj QUOTA 2500K ON tools; |
CREATE USER piyush IDENTIFIED BY saraswati PROFILE TABLESPACE user_data; ALTER USER manoj Temporary TABLESPACE dev1_data; |
ALTER USER manoj DEFAULT ROLE ALL EXCEPT salary_adm;
|
ALTER USER manoj IDENTIFIED BY welcome; ALTER USER manoj PASSWORD EXPIRE; |
ALTER USER ql AC COUNT LOCK |
ALTER USER ql ACCOUNT UNLOCK
|
CREATE ROLE role_name IDENTIFIED BY password CREATE ROLE role_name IDENTIFIED EXTERNALLY CREATE ROLE role_name IDENTIFIED GLOBALLY |
SET ROLE role_name IDENTIFIED BY password
|
权限
|
ALTER
|
DELETE
|
EXECUTE
|
INDEX
|
INSERT
|
READ
|
REFERENCE
|
SELECT
|
UPDATE
|
Directory
|
no
|
no
|
no
|
no
|
no
|
yes
|
no
|
no
|
no
|
function
|
no
|
no
|
yes
|
no
|
no
|
no
|
no
|
no
|
no
|
procedure
|
no
|
no
|
yes
|
no
|
no
|
no
|
no
|
no
|
no
|
package
|
no
|
no
|
yes
|
no
|
no
|
no
|
no
|
no
|
no
|
DB Object
|
no
|
no
|
yes
|
no
|
no
|
no
|
no
|
no
|
no
|
Libary
|
no
|
no
|
yes
|
no
|
no
|
no
|
no
|
no
|
no
|
Operation
|
no
|
no
|
yes
|
no
|
no
|
no
|
no
|
no
|
no
|
Sequence
|
yes
|
no
|
no
|
no
|
no
|
no
|
no
|
no
|
no
|
Table
|
yes
|
yes
|
no
|
yes
|
yes
|
no
|
yes
|
yes
|
yes
|
Type
|
no
|
no
|
yes
|
no
|
no
|
no
|
no
|
no
|
no
|
View
|
no
|
yes
|
no
|
no
|
yes
|
no
|
no
|
yes
|
yes
|
GRANT ROLE
(或
system privilege
)
TO user(role,Public) WITH ADMIN OPTION
(可选)
|
视图
|
作用
|
ALL_COL_PRIVS
|
表示列上的授权,用户和
PUBLIC
是被授予者
|
ALL_COL_PRIVS_MADE
|
表示列上的授权,用户是属主和被授予者
|
ALL_COL_RECD
|
表示列上的授权,用户和
PUBLIC
是被授予者
|
ALL_TAB_PRIVS
|
表示对象上的授权,用户是
PUBLIC
或被授予者或用户是属主
|
ALL_TAB_PRIVS_MADE
|
表示对象上的权限,用户是属主或授予者
|
ALL_TAB_PRIVS_RECD
|
表示对象上的权限
,
用户是
PUBLIC
或被授予者
|
DBA_COL_PRIVS
|
数据库列上的所有授权
|
DBA_ROLE_PRIVS
|
显示已授予用户或其他角色的角色
|
DBA_SYS_PRIVS
|
已授予用户或角色的系统权限
|
DBA_TAB_PRIVS
|
数据库对象上的所有权限
|
ROLE_ROLE_PRIVS
|
显示已授予用户的角色
|
ROLE_SYS_PRIVS
|
显示通过角色授予用户的系统权限
|
ROLE_TAB_PRIVS
|
显示通过角色授予用户的对象权限
|
SESSION_PRIVS
|
显示用户现在可利用的所有系统权限
|
USER_COL_PRIVS
|
显示列上的权限,用户是属主、授予者或被授予者
|
USER_COL_PRIVS_MADE
|
显示列上已授予的权限,用户是属主或授予者
|
USER_COL_PRIVS_RECD
|
显示列上已授予的权限,用户是属主或被授予者
|
USER_ROLE_PRIVS
|
显示已授予给用户的所有角色
|
USER_SYS_PRIVS
|
显示已授予给用户的所有系统权限
|
USER_TAB_PRIVS
|
显示已授予给用户的所有对象权限
|
USER_TAB_PRIVS_MADE
|
显示已授予给其他用户的对象权限,用户是属主
|
USER_TAB_PRIVS_RECD
|
显示已授予给其他用户的对象权限,用户是被授予者
|
SELECT [DISTICT|ALL]{*|column[,column,...]} INTO (variable[,variable,...] |record) FROM {table|(sub-query)}[alias] WHERE............ |
v_empno SCOTT.EMP.EMPNO%TYPE; v_salary EMP.SALARY%TYPE; |
DELCARE V_A NUMBER(5):=10; V_B V_A%TYPE:=15; V_C V_A%TYPE; BEGIN DBMS_OUTPUT.PUT_LINE ('V_A='||V_A||'V_B='||V_B||'V_C='||V_C); END SQL>/ V_A=10 V_B=15 V_C= PL/SQL procedure successfully completed. SQL> |
CREATE OR REPLACE PROCEDURE FIRE_EMPLOYEE (pempno in number) AS v_ename EMP.ENAME%TYPE; BEGIN SELECT ename INTO v_ename FROM emp WHERE empno=p_empno; INSERT INTO FORMER_EMP(EMPNO,ENAME) VALUES (p_empno,v_ename); DELETE FROM emp WHERE empno=p_empno; UPDATE former_emp SET date_deleted=SYSDATE WHERE empno=p_empno; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('Employee Number Not Found!'); END |
隐式游标
|
显式游标
|
PL/SQL
维护,当执行查询时自动打开和关闭
|
在程序中显式定义、打开、关闭,游标有一个名字。
|
游标属性前缀是
SQL
|
游标属性的前缀是游标名
|
属性
%ISOPEN
总是为
FALSE
|
%ISOPEN
根据游标的状态确定值
|
SELECT
语句带有
INTO
子串,只有一行数据被处理
|
可以处理多行数据,在程序中设置循环,取出每一行数据。
|
CURSOR cursor_name IS select_statement;
|
DELCARE CURSOR C_EMP IS SELECT empno,ename,salary FROM emp WHERE salary>2000 ORDER BY ename; ........ BEGIN |
OPEN cursor_name
|
OPEN C_EMP;
|
CLOSE cursor_name
|
CLOSE C_EMP;
|
FETCH cursor_name INTO variable[,variable,...]
|
SET SERVERIUTPUT ON DECLARE v_ename EMP.ENAME%TYPE; v_salary EMP.SALARY%TYPE; CURSOR c_emp IS SELECT ename,salary FROM emp; BEGIN OPEN c_emp; FETCH c_emp INTO v_ename,v_salary; DBMS_OUTPUT.PUT_LINE('Salary of Employee'|| v_ename ||'is'|| v_salary); FETCH c_emp INTO v_ename,v_salary; DBMS_OUTPUT.PUT_LINE('Salary of Employee'|| v_ename ||'is'|| v_salary); FETCH c_emp INTO v_ename,v_salary; DBMS_OUTPUT.PUT_LINE('Salary of Employee'|| v_ename ||'is'|| v_salary); CLOSE c_emp; END |
SET SERVERIUTPUT ON DECLARE v_ename EMP.ENAME%TYPE; v_salary EMP.SALARY%TYPE; CURSOR c_emp IS SELECT ename,salary FROM emp; BEGIN OPEN c_emp; LOOP FETCH c_emp INTO v_ename,v_salary; EXIT WHEN c_emp%NOTFOUND; DBMS_OUTPUT.PUT_LINE('Salary of Employee'|| v_ename ||'is'|| v_salary); END |
SET SERVERIUTPUT ON DECLARE R_emp EMP%ROWTYPE; CURSOR c_emp IS SELECT * FROM emp; BEGIN OPEN c_emp; LOOP FETCH c_emp INTO r_emp; EXIT WHEN c_emp%NOTFOUND; DBMS_OUT.PUT.PUT_LINE('Salary of Employee'||r_emp.ename||'is'|| r_emp.salary); END LOOP; CLOSE c_emp; END; |
SET SERVERIUTPUT ON DECLARE CURSOR c_emp IS SELECT ename,salary FROM emp; R_emp c_emp%ROWTYPE; BEGIN OPEN c_emp; LOOP FETCH c_emp INTO r_emp; EXIT WHEN c_emp%NOTFOUND; DBMS_OUT.PUT.PUT_LINE('Salary of Employee'||r_emp.ename||'is'|| r_emp.salary); END LOOP; CLOSE c_emp; END; |
CURSOR cursor_name[(parameter[,parameter],...)] IS select_statement;
|
Parameter_name [IN] data_type[{:=|DEFAULT} value]
|
OPEN cursor_name[value[,value]....];
|
DECALRE CURSOR c_dept IS SELECT * FROM dept ORDER BY deptno; CURSOR c_emp (p_dept VARACHAR2) IS SELECT ename,salary FROM emp WHERE deptno=p_dept ORDER BY ename r_dept DEPT%ROWTYPE; v_ename EMP.ENAME%TYPE; v_salary EMP.SALARY%TYPE; v_tot_salary EMP.SALARY%TYPE; BEGIN OPEN c_dept; LOOP FETCH c_dept INTO r_dept; EXIT WHEN c_dept%NOTFOUND; DBMS_OUTPUT.PUT_LINE('Department:'|| r_dept.deptno||'-'||r_dept.dname); v_tot_salary:=0; OPEN c_emp(r_dept.deptno); LOOP FETCH c_emp INTO v_ename,v_salary; EXIT WHEN c_emp%NOTFOUND; DBMS_OUTPUT.PUT_LINE('Name:'|| v_ename||' salary:'||v_salary); v_tot_salary:=v_tot_salary+v_salary; END LOOP; CLOSE c_emp; DBMS_OUTPUT.PUT_LINE('Toltal Salary for dept:'|| v_tot_salary); END LOOP; CLOSE c_dept; END; |
FOR record_name IN (corsor_name[(parameter[,parameter]...)] | (query_difinition) LOOP statements END LOOP; |
DECALRE CURSOR c_dept IS SELECT deptno,dname FROM dept ORDER BY deptno; CURSOR c_emp (p_dept VARACHAR2) IS SELECT ename,salary FROM emp WHERE deptno=p_dept ORDER BY ename v_tot_salary EMP.SALARY%TYPE; BEGIN FOR r_dept IN c_dept LOOP DBMS_OUTPUT.PUT_LINE('Department:'|| r_dept.deptno||'-'||r_dept.dname); v_tot_salary:=0; FOR r_emp IN c_emp(r_dept.deptno) LOOP DBMS_OUTPUT.PUT_LINE('Name:'|| v_ename||' salary:'||v_salary); v_tot_salary:=v_tot_salary+v_salary; END LOOP; DBMS_OUTPUT.PUT_LINE('Toltal Salary for dept:'|| v_tot_salary); END LOOP; END; |
DECALRE v_tot_salary EMP.SALARY%TYPE; BEGIN FOR r_dept IN (SELECT deptno,dname FROM dept ORDER BY deptno) LOOP DBMS_OUTPUT.PUT_LINE('Department:'|| r_dept.deptno||'-'||r_dept.dname); v_tot_salary:=0; FOR r_emp IN (SELECT ename,salary FROM emp WHERE deptno=p_dept ORDER BY ename) LOOP DBMS_OUTPUT.PUT_LINE('Name:'|| v_ename||' salary:'||v_salary); v_tot_salary:=v_tot_salary+v_salary; END LOOP; DBMS_OUTPUT.PUT_LINE('Toltal Salary for dept:'|| v_tot_salary); END LOOP; END; |
CURSOR C1 IS SELECT * FROM emp WHERE deptno NOT IN (SELECT deptno FROM dept WHERE dname!='ACCOUNTING'); |
FOR UPDATE [OF [schema.]table.column[,[schema.]table.column].. [nowait] |
WHERE{CURRENT OF cursor_name|search_condition}
|
DELCARE CURSOR c1 IS SELECT empno,salary FROM emp WHERE comm IS NULL FOR UPDATE OF comm; v_comm NUMBER(10,2); BEGIN FOR r1 IN c1 LOOP IF r1.salary<500 THEN v_comm:=r1.salary*0.25; ELSEIF r1.salary<1000 THEN v_comm:=r1.salary*0.20; ELSEIF r1.salary<3000 THEN v_comm:=r1.salary*0.15; ELSE v_comm:=r1.salary*0.12; END IF; UPDATE emp; SET comm=v_comm WHERE CURRENT OF c1l; END LOOP; END |
DECLARE inventory_too_low EXCEPTION; --- 其他声明语句 BEGIN . . IF order_rec.qty>inventory_rec.qty THEN RAISE inventory_too_low; END IF . . EXCEPTION WHEN inventory_too_low THEN order_rec.staus:='backordered'; replenish_inventory(inventory_nbr=> inventory_rec.sku,min_amount=>order_rec.qty-inventory_rec.qty); END; |
EXCEPTION WHEN exception_name THEN Code for handing exception_name [WHEN another_exception THEN Code for handing another_exception] [WHEN others THEN code for handing any other exception.] |
EXCEPTION WHEN inventory_too_low THEN order_rec.staus:='backordered'; replenish_inventory(inventory_nbr=> inventory_rec.sku,min_amount=>order_rec.qty-inventory_rec.qty); WHEN discontinued_item THEN --code for discontinued_item processing WHEN zero_divide THEN --code for zero_divide WHEN OTHERS THEN --code for any other exception END; |
BEGIN DECLARE bad_credit; BEGIN RAISE bad_credit; -- 发生异常,控制转向; EXCEPTION WHEN bad_credit THEN dbms_output.put_line('bad_credit'); END; --bad_credit 异常处理后,控制转到这里 EXCEPTION WHEN OTHERS THEN -- 控制不会从 bad_credit 异常转到这里 -- 因为 bad_credit 已被处理 END; |
BEGIN DECLARE --- 内部块开始 bad_credit; BEGIN RAISE bad_credit; -- 发生异常,控制转向; EXCEPTION WHEN ZERO_DIVIDE THEN -- 不能处理 bad_credite 异常 dbms_output.put_line('divide by zero error'); END -- 结束内部块 -- 控制不能到达这里,因为异常没有解决; -- 异常部分 EXCEPTION WHEN OTHERS THEN -- 由于 bad_credit 没有解决,控制将转到这里 END; |
BEGIN executable statements BEGIN today DATE:='SYADATE'; --ERRROR BEGIN -- 内部块开始 dbms_output.put_line('this line will not execute'); EXCEPTION WHEN OTHERS THEN -- 异常不会在这里处理 END;-- 内部块结束 EXCEPTION WHEN OTHERS THEN 处理异常 END |
DECLARE order_too_old EXCEPTION; BEGIN RAISE order_too_old; EXCEPTION WHEN order_too_old THEN DECLARE file_handle UTL_FILE.FILE_TYPE; BEGIN --open file file_handle:=UTL_FILE.FOPEN (location=>'/ora01/app/oracle/admin/test/utlsir' ,filename=>'error.log' .open_mode=>'W'); --write error stack UTL_FILE.PUT_LINE(filehandle, DBMS_UTILITY.FORMAT_ERROR_STACK); --write the call stack UTL_FILE.PUT_LINE(filehandle, DBMS_UTILITY.FORMAT_CALL_STACK); --close error log UTL_FILE.FCLOSE(file_handle); RAISE; --re-raise the exception END END |
BEGIN DECLARE Insufficient_credite EXCEPTION; BEGIN RASISE Insufficient_credite; EXCEPTION WHEN Insufficient_credite THEN -- 可以在此处理异常 extend_credite(cust_id); END - 嵌套块结束 EXCEPTION WHEN Insufficient_credite THEN -- 超出范围,不能在这里处理异常 END; |
DECLARE invald_table_name EXCEPTION; PRAGMA EXCEPTION_INIT(invald_table_name,-942); BEGIN EXCEPTION WHEN invald_table_name THEN UTL_FILE.PUT_LINE(file_handle,'user' || UID || 'hit a bad table'); END; |
RAISE_APPLICATION_ERROR(error_name,error_message[,{TRUE|| FALSE}]);
|
IF product_not_found THEN RAISE_APPLICATION_ERROR(-20123,'Invald product code' TRUE); END IF; |