ORACLE SQL基础—DDL语言 礼记八目 2017-12-23 21:26:21
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORACLE SQL基础—DDL语言 礼记八目 2017-12-23 21:26:21相关的知识,希望对你有一定的参考价值。
原文地址:https://www.toutiao.com/i6502733303550837261/
SQL语言分为:DDL数据定义语言,DML数据操纵语言,DCL是数据库控制语言,TC事务控制语言
*DDL数据定义语言(Data Definition Language):是SQL语言集中负责数据结构定义与数据库对象定义的语言,由CREATE、ALTER与DROP,RENAME,TRUNCATE几个语法所组成。
*DML数据操纵语言(Data Manipulation Language),用户通过它可以实现对数据库的基本操作,用来查询、添加、修改和删除数据库中数据的语句,由SELECT,INSERT,UPDATE,DELETE四个语法组成。
*DCL数据库控制语言(Data Control Language):用来设置或更改数据库用户或角色权限的语句,包括(GRANT,REVOKE等)语句。
*TC事物控制语言(Transaction Control):用于对数据的修改永久性的存储在表中或是取消这些修改操作,包括(COMMIT,ROLLBACK,SAVEPOINT)语句。
***DDL语言***
用于数据库对象的建立,修改,删除;举凡数据库、数据表、数据库索引、预存程序、用户函数、触发程序或是用户自定型别等对象,都可以使用 CREATE,ALTER,DROP 指令来处理,而为了各式数据库对象的不同,指令也有很多的参数。
----重命名表名称
REANME OLD_NAME TO NEW_NAME;
----创建表及添加主键约束
方法1:
CREATE TABLE INFOR (SID VARCHAR2(20),
PID VARCHAR2(10),
MONEY NUMBER(12,2)) ;
ALTER TABLE INFOR
ADD CONSTRAINT PK_INFO PRIMARY KEY (SID);
方法2:
CREATE TABLE INFORS (SID VARCHAR2(20) NOT NULL CONSTRAINT PK_INFORS PRIMARY KEY,
PID VARCHAR2(10),
MONEY NUMBER(12,2)) ;
----根据现有表创建所需的新表
CREATETABLE INFORS AS (SELECT B.COMPCODE AS 单位编码,
B.COMPNAME AS 单位名称,
A.PERSID AS 人员编码,
A.PERID AS 身份证号,
A.PERNAME AS 人员姓名,
(CASE A.PERSEX
WHEN‘1‘THEN‘男‘
WHEN‘2‘THEN‘女‘
ELSE‘未说明‘
END) AS 人员性别
FROM PERINFOR A,COMPINFOR B
WHERE A.COMPCODE = B.COMPCODE
AND B.COMPZREA = ‘150XXX‘);
----修改表追加表字段
ALTER TABLE INFOR ADD CHANGE_MONEY NUMBER(12,2) ;
----修改表中某个表字段的名称
ALTER TABLE INFOR RENAME COLUMN MONEY TO MONEYS;
----修改表中某个表字段的数据类型或数据长度
ALTER TABLE INFOR MODIFY MONEYS VARCHAR2(12);
----删除表
DROP TABLE INFORS;
----删除表中的某个字段
ALTER TABLE INFOR DROP COLUMN CHANGE_MONEY ;
----创建用户和密码
create user test identified by password;
----创建用户并指定表空间
select username,default_tablespace from dba_users;
create userUSERNAMEidentified by PASSWORD
default tablespaceDATA
temporaray tablespaceTEMP;
create user nmsi_cf identified by nmsi_cf_57g default tablespace data_nmsi ;
create user drm_nm identified by drm_nm default tablespace data_nmsi_drm ;
create user nm_report identified by nm_report default tablespace data_nmsi_drm ;
DROPUSER CFDXPT CASCADE;
----修改用户的表空间
alter user nmsi_cf default tablespace data_nmsi;
alter user drm_nm default tablespace data_nmsi_drm;
alter user nm_report default tablespace data_nmsi_drm;
----删除用户
drop user test;
----修改用户密码
alter user test identified by password1;
----修改用户的锁定模式
alter user test account unlock;
----创建角色和密码
CREATE ROLE CHINA IDENTIFIED BY PASSWORD;
----删除角色
DROP ROLE CHINA;
----修改角色密码
ALTERROLE CHINA IDENTIFIEDBY PASSWD ;
----创建索引
///普通索引///
CREATE INDEX INDEX_NAME ON TABLE_NAME(COLUMN_NAME) ;
///唯一索引///
CREATE UNIQUE INDEX INDEX_NAME ON TABLE_NAME(COLUMN_NAME) ;
///指定索引的归属表空间///
CREATE INDEX INDEX_NAME ON TABLE_NAME(COLUMN_NAME) TABLESPACE TAB_SPACE ;
--外键和主键关联的
select a.owner AS 主键拥有者,
a.table_name AS 主键表,
b.column_name AS 主键列,
c.owner AS 外键拥有者,
c.table_name AS 外键表,
d.column_name AS 外键列
from user_constraints a
left join user_cons_columns b
on a.constraint_name = b.constraint_name
left join user_constraints C
on c.constraint_name = a.constraint_name
left join user_cons_columns d
on c.constraint_name = d.constraint_name
and a.constraint_type = ‘P‘
and a.table_name = ‘表名‘ --需要查看主外键关系的表
order by a.table_name ;
--删除外键级联
ALTER TABLE US_ROLE_CONNECTION DROP constraint FK_RO_U_ID ;
----修改索引
///重命名索引///
ALTER INDEX OLD_INDEX_NAME RENAME TO NEW_INDEX_NAME;
----删除索引
DROP INDEX INDEX_NAME;
----删除主键
1 确定该主键是否有外键,如果有的话执行下面,没有的话执行第2语句
alter table tablename drop constraint column cascade;
2 定义主键无效
alter table tablename disable primary_column;
3 删除索引
drop index index_name;
4或是直接执行删除主键
ALTERTABLE TABLENAME DROPPRIMARYKEY;
----创建视图
///创建普通视图///
CREATEVIEW ONE_VIEW AS
SELECTCOUNT(AAC001) AS 人数
FROM AC01_00 ;
///创建检测是否满足WHERE条件的视图,只有满足WHERE条件才能对视图使用DML语句///
CREATEORREPLACEVIEW ONE_VIEW AS
SELECTCOUNT(AAC001) AS 人数
FROM AC01_00
WHERE AAB001 IN (SELECT AAB001 FROM AB01_00 WHERE AAB301 = ‘150499‘)
WITHCHECKOPTIONCONSTRAINT ONE_VIEW_DML ;
///创建只读视图,不能对视图进行DML语言///
CREATEORREPLACEVIEW ONE_VIEW AS
SELECTCOUNT(AAC001) AS 人数
FROM AC01_00
WHERE AAB001 IN (SELECT AAB001 FROM AB01_00 WHERE AAB301 = ‘150499‘)
WITHREADONLYCONSTRAINT ONE_VIEW_DML ;
----修改视图
ALTERVIEW ONE_VIEW
DROPCONSTRAINT ONE_VIEW_DML ;
----删除视图
DROPVIEW ONE_VIEW ;
----函数的简单应用,判断字符类型的时间格式
CREATE OR REPLACE FUNCTION <函数名>
[<参数列表>]
[RETURN<函数数据类型>]IS|AS
[<局部变量声明>]
BEGIN
<过程体>
RETURN<函数值>
END[<函数名>];
CREATE [OR REPLACE] FUNCTION function_name
{(parameter_name [IN|OUT|IN OUT] type [, ...])}
RETURN type
[IS | AS]
BEGIN
function_body
END function_name;
///创建函数///
--创建函数,函数名(CHECK_DATE),指定传给函数的参数名(P_DATE)及数据类型;指定参数返回的数据类型。
CREATEORREPLACEFUNCTION CHECK_DATE(P_DATE VARCHAR2) RETURNNUMBERIS
--定义传递参数的变量和数据类型
V_DATE DATE;
--开始函数体
BEGIN
--变量赋值及指定校验的数据格式,校验的列为空时返回FAULT
V_DATE := TO_DATE(NVL(P_DATE, ‘FAULT‘), ‘YYYY-MM-DD HH24:MI:SS‘);
--比对匹配时返回1
RETURN1;
--异常
EXCEPTION
--如果为其他情况那么返回0
WHENOTHERSTHEN
RETURN0;
--结束函数
END CHECK_DATE;
///检测函数///
SELECT CHECK_DATE(JOIN_TIME)
FROM INFORS;
OR
SELECT *
FROM HSQINFOR
WHERE CHECK_DATE(AAC006) = ‘1‘ ;
///删除函数///
DROPFUNCTION CHECK_DATE ;
----创建序列
CREATE SEQUENCE <序列名>
MINVALUE <数值> --定义最小值
NOMAXVALUE --不设置最大值
START WITH <数值>--定义序列值从几开始
INCREMENT BY <数值>--定义序列间隔数值
NOCYCLE --不设置循环
CACHE <数值>;--定义告诉缓存大小
CREATESEQUENCE sequence_name
[MAXVALUE max_num | NOMAXVALUE ]
[MINVALUE min_num | NOMINVALUE ]
[STARTWITH start_num]
[INCREMENTBY increment_num]
[CYCLE | NOCYCLE]
[CACHE cache_num | NOCACHE]
[ORDER | NOORDER] ;
create sequence SEQ_01
increment by 1 --每次+1
start with 37 --从37开始+
nomaxvalue --不设置最大值
nocycle --一直累加不循环
cache 20;
----修改序列
Alter Sequence SEQ_01 increment by 1 ;
----删除序列
DROP SEQUENCE SEQ_01;
----利用序列和触发器,向表里导入数据或插值
***重置序列
1、select seq_name.nextval from dual; //假设得到结果5656
2、 altersequence seq_name incrementby -5655; //注意是-(n-1)
3、 select seq_name.nextval from dual;//再查一遍,走一下,重置为1了
4、 altersequence seq_name incrementby1;//还原
***可以写个存储过程,以下是完整的存储过程,然后调用传参即可:
createorreplaceprocedure seq_reset(v_seqname varchar2) as n number(10);
tsql varchar2(100);
begin
executeimmediate‘select ‘||v_seqname||‘.nextval from dual‘into n;
n:=-(n-1);
tsql:=‘alter sequence ‘||v_seqname||‘ increment by ‘|| n;
executeimmediate tsql;
executeimmediate‘select ‘||v_seqname||‘.nextval from dual‘into n;
tsql:=‘alter sequence ‘||v_seqname||‘ increment by 1‘;
executeimmediate tsql;
end seq_reset;
方法1:
///创建表///
CREATETABLE TABNAME (VID INTEGERNOTNULLCONSTRAINT PK_TABNAME PRIMARYKEY,
NAMES VARCHAR2(20),
PER_ID VARCHAR2(18)) ;
///创建序列///
CREATESEQUENCE SEQVID–-序列名
incrementby1–-每次+1
STARTWITH1--从1开始
nomaxvalue ; --不循环
///创建触发器///
CREATE [ORREPLACE] TRIGGER<触发器名>
[BEFORE|AFTER]<触发事件>ON<表名>
FOREACHROW
BEGIN
<PL/SQL程序体>
END<触发器名> ;
CREATE [ORREPLACE] TRIGGER trigger_name
[BEFORE|AFTER]trigger_event
ON table_name
[FOREACHROW]
BEGIN
trigger_body
END trigger_name;
CREATEORREPLACETRIGGER TRVID–-创建或替换触发器,触发器名称TRVID
BEFOREINSERTON TABNAME --在对TABNAME表进行插入操作时
FOREACHROW --声明为行级触发器
BEGIN --触发器开始
SELECT SEQVID.NEXTVAL INTO :NEW.VID FROM DUAL; --运行体
END TRVID; --触发器结束
///插值测试///
INSERTINTO TABNAME
(NAMES, PER_ID)
SELECTNAMES, PER_ID
FROMINFORS
WHEREPER_ID = ‘150XXXXXXXXXXXXXXX‘;
///校验///
SELECT * FROM TABNAME ;
///禁用和启用触发器///
ALTER TRIGGER TRVID DISABLE;
ALTER TRIGGER TRVID ENABLE;
ALTER TABLE TABNAME DISABLE ALL TRIGGER;
ALTER TABLE TABNAME ENABLE ALL TRIGGER;
///删除触发器、删除序列///
DROP TRIGGER TRVID ;
DROP SEQUENCE SEQVID ;
DROP TABLE TABNAME ;
方法2:
////序列///
CREATE SEQUENCE SEQname –-序列名
INCREMENT BY 1–-每次+1
START WITH 1–从1开始
MAXVALUE 99999999 –最大值;
////触发器///
create trigger TRname before insert
on RYXX_22
for each row
declare
integrity_error exception;
errno integer;
errmsg char(200);
dummy integer;
found boolean;
begin
-- Column lcId uses sequence Sequence_LotCateID
select SEQname.NEXTVAL INTO :new.xh from dual;
-- Errors handling
exception
when integrity_error then
raise_application_error(errno, errmsg);
end;
----创建过程
CREATETABLE INFORS (PER_ID VARCHAR2(10) NOTNULL,
PRO_ID VARCHAR2(4) NOTNULL,
PRO_NAME VARCHAR2(100) NOTNULL,
PRO_MONEY NUMBER(12,2) DEFAULT‘0‘);
INSERTINTO INFORS VALUES (‘1‘,‘1001‘,‘人参果‘,‘200‘);
INSERTINTO INFORS VALUES (‘2‘,‘2001‘,‘蟠桃‘,‘180‘);
INSERTINTO INFORS(PER_ID,PRO_ID,PRO_NAME) VALUES (‘3‘,‘3001‘,‘灵芝‘);
SELECT *
FROM INFORS ;
CREATE [ORREPLACE] PROCEDURE<过程名>
[<参数列表>]
[IS | AS]
[<局部变量声明>]
BEGIN
<过程体>
END[<过程名>];
CREATE [ORREPLACE] PROCEDURE procedure_name
[(parameter_name [IN | OUT | INOUT] type [,...])]
[IS | AS]
BEGIN
procedure_body
END procedure_anme ;
----创建或置换过程UPDATE_PRODUCT_INFORS,设置2个参数,一个为产品ID,一个为产品价格调整倍数
CREATEORREPLACEPROCEDURE UPDATE_PRODUCT_INFORS(P_PRO_ID IN INFORS.PRO_ID%TYPE,
P_PRO_MONEY INNUMBER) AS
----声明变量
V_INFORS_COUNT INTEGER;
----过程开始
BEGIN
----统计指定产品ID的数量
SELECTCOUNT(*)
INTO V_INFORS_COUNT
FROM INFORS
WHERE PRO_ID = P_PRO_ID;
-----如果产品存在,那么执行UPDATE语句修改产品的价格,然后提交
IF V_INFORS_COUNT = 1THEN
UPDATE INFORS
SET PRO_MONEY = PRO_MONEY * P_PRO_MONEY
WHERE PRO_ID = P_PRO_ID;
COMMIT;
ENDIF;
----如果出现异常,则执行回滚
EXCEPTION
WHENOTHERSTHEN
ROLLBACK;
----结束过程
END UPDATE_PRODUCT_INFORS;
--在command window里校验过程中的错误--
CREATEORREPLACEPROCEDURE UPDATE_PRODUCT_INFORS(P_PRO_ID IN INFORS.PRO_ID%TYPE,
P_PRO_MONEY INNUMBER) AS
V_INFORS_COUNT INTEGER;
BEGIN
SELECTCOUNT(*)
INTO V_INFORS_COUNT
FROM INFORS
WHERE PRO_ID = P_PRO_ID;
IF V_INFORS_COUNT = 1THEN
UPDATE INFORS
SET PRO_MONEY = PRO_MONEY * P_PRO_MONEY
WHERE PRO_ID = P_PRO_ID;
COMMIT;
ENDIF;
EXCEPTION
WHENOTHERSTHEN
ROLLBACK;
END UPDATE_PRODUCT_INFORS;
/
----显示过程错误
SHOWERRORS ;
--调用过程--
SELECT * FROM INFORS WHERE PRO_ID = ‘1001‘;
CALL UPDATE_PRODUCT_INFORS(1001,2) ;
SELECT * FROM INFORS WHERE PRO_ID = ‘1001‘;
---删除过程--
DROPPROCEDURE UPDATE_PRODUCT_INFORS ;
以上是关于ORACLE SQL基础—DDL语言 礼记八目 2017-12-23 21:26:21的主要内容,如果未能解决你的问题,请参考以下文章
Oracle基础结构认知—oracle物理结构 礼记八目 2017-12-13 20:31:06
Oracle基础结构认知—初识oracle 礼记八目 2017-12-12 21:19:30
Oracle基础结构认知——oracle内存结构 礼记八目 2017-12-15 20:31:27