SQL和PL/SQL
SQL语言
Oracle数据库使用的SQL语言是Procedural Language/SQL(简称PL/SQL)。
通常将SQL语言分为以下4类。
(1)数据定义语言(Data Definition Language, DDL)
用于定义数据库对象,对数据库、数据库中的表、视图等数据库对象进行建立和删除,DDL包括
CREATE、ALTER、DROP
等语句。
(2)数据操纵语言(Data Manipulation Language, DML)
用于对数据库中的数据进行插入、修改、删除等操作,DML包括
INSERT、UPDATE、DELETE
等语句。
(3)数据查询语言(Data Query Language, DQL)
用于对数据库中的数据进行查询操作,例如用
SELECT
语句进行查询操作。
(4)数据控制语言(Data Control Language, DCL)
用于控制用户对数据库的操作权限,DCL包括
GRANT、REVOKE
等语句。
核心功能:
PL/SQL预备知识
PL/SQL的语法约定:
在SQL Developer中执行PL/SQL语句
(1)打开SQL Developer
(2)
点“确定”
(3)在弹出的SQL工作表窗口中输入要运行的PL/SQL语句:
(4)点击运行:
在PL/SQL中的数据定义语言
数据库操作语句
1. 创建数据库
(1)设定实例标识符(SID)
在SQL*Plus中使用:
SET ORACLE_SID=stdb //举例设SID为stdb
注:oracle SID 和SID的区别
SID:用于唯一标识一个实例。在同一台计算机上不能重复。 oracle
SID:是环境变量,用来标识和命名后台进程。同时,告诉OS,当前正在使用的oracle的实例名是哪个。如 sql>!echo
$ORACLE_SID 得出:ora10g 关联
在同一个ORACLE_HOME下,oracle能根据ORACLE_SID将实例区分开来,此时的作用相当于SID;但在不同ORACLE_HOME下,oracle可以创建相同ORACLE_SID的实例。
(2)设定数据库管理员的验证方法
可用:密码文件或操作系统验证
下面是密码文件验证方法:
orapwd file=D:\app\tao\oradata\DATABASE\PWDstdb.ora
Password=123456 entries=5
(以上两点我全都没执行成功……以后有空再试试)
(3)创建初始化参数
创建新数据库之前必须新增或编辑的初始化参数如下:
●全局数据库名称。
●控制文件名称与路径。
●数据块大小。
●影响SGA容量的初始化参数。
●设定处理程序最大数目。
●设定空间撤销(Undo)管理方法。
默认的参数文件存在:E:\oracle11g\product\11.2.0\dbhome_1\dbs
名为:init.ora
在这个目录下,新建一个initstdb.ora的文件,内容如下:
# Copyright (c) 1991, 2001, 2002 by Oracle Corporation
job_queue_processes=10
# Job Queues
# Shared Server
dispatchers="(PROTOCOL=TCP) (SERVICE=stdbXDB)"
# Miscellaneous
compatible=10.2.0.1.0
# Security and Auditing
remote_login_passwordfile=EXCLUSIVE
# Sort, Hash Joins, Bitmap Indexes
pga_aggregate_target=25165824
sort_area_size=65536
# Database Identification
db_domain=""
db_name=stdb
# File Configuration
control_files=("E:\oracle11g\oradata\stdb\control01.ctl", "E:\oracle11g\oradata\stdb\control02.ctl",
"E:\oracle11g\oradata\stdb\control03.ctl")
db_recovery_file_dest=E:\oracle11g\flash_recovery_area
db_recovery_file_dest_size=2147483648
# Pools
java_pool_size=50331648
large_pool_size=8388608
shared_pool_size=83886080
# Cursors and Library Cache
open_cursors=300
# System Managed Undo and Rollback Segments
undo_management=AUTO
undo_tablespace=UNDOTBS1
# Diagnostics and Statistics
background_dump_dest=E:\oracle11g\admin\stdb\bdump
core_dump_dest=E:\oracle11g\admin\stdb\cdump
user_dump_dest=E:\oracle11g\admin\stdb\udump
# Processes and Sessions
processes=150
# Cache and I/O
db_block_size=8192
db_cache_size=25165824
db_file_multiblock_read_count=16
里面的文件夹自行修改,创建初始化参数的前提是要建好数据库,因为我前两步没有成功,所以这个文件我也没有验证
(4)启动SQL*Plus并以SYSDBA连接到Oracle实例
在运行栏输入:sqlplus /nolog
在打开的SQL*Plus窗口输入:connect system/123456 as sysdba
(/后面是自己设置的密码)
(5)启动实例
在没有装载数据库情况下启动实例,通常只有在数据库创建期间或在数据库上实施维护操作时才会这么做,使用带有NOMOUNT选项的STARTUP命令
STARTUP NOMOUNT pfile="E:\oracle11g\product\11.2.0\dbhome_1\dbs\initstdb.ora" //NOMOUNT表示不装载实例
未执行过第三步,所以这步也没有验证
(6)创建初始化参数
在Oracle中创建数据库,使用CREATE DATABASE语句。
语法格式:
CREATE DATABASE <数据库名>
{ USER SYS IDENTIFIED BY <密码>
| USER SYSTEM IDENTIFIED BY <密码>
| CONTROLFILE REUSE
| MAXDATAFILES <最大数据文件数>
| MAXINSTANCES <最大实例数>
| {ARCHIVELOG︱NO ARCHIVELOG}
| CHARACTER SET <字符集>
| NATIONAL CHARACTER SET <民族字符集
| SET DEFAULT
{ BIGFILE | SMALLFILE } TABLESPACE
| [ LOGFILE [ GROUP <数字值> ] <文件选项>
| MAXLOGFILES <数字值>
| MAXLOGMEMBERS <数字值>
| MAXLOGHISTORY <数字值>
| FORCE LOGGING
| DATAFILE <文件选项>
[ AUTOEXTEND [ OFF︱ON [ NEXT <数字值>[K∣M | G | T ]
MAXSIZE [ UNLIMITED︱<数字值> [K∣M | G | T ]]]]
| DEFAULT TABLESPACE <表空间名> [DATAFILE <文件选项> ]
| [ BIGFILE | SMALL] UNDO TABLESPACE <表空间名> [ DATAFILE <文件选项>]
| SET TIME_ZONE='<时区名>'
}... ;
其中:
<文件选项>::=
('<文件路径>\<文件名>') [ SIZE <数字值> [ K∣M | G | T] [ REUSE ]],…n]
2. 修改数据库
修改数据库使用ALTER DATABASE语句。
语法格式:
ALTER DATABASE <数据库名>
[ARCHIVELOG | NOARCHIVELOG]
[NO] FORCE LOGGING
RENAME FILE '<文件名>'[,…n] TO '<新文件名>' [,…n ]
CREATE DATAFILE '<数据文件名>'
[ AS {'<新数据文件名>' [ SIZE <数字值> [K∣M | G | T ]] [ REUSE ]][,…n]} | NEW ]
DATAFILE '<文件名>' {ONLINE∣OFFLINE [ FOR DROP]∣RESIZE <数字值> [ K∣M | G | T]
| END BACKUP∣AUTOEXTEND {OFF∣ON [NEXT <数字值> [K | M]]
[MAXSIZE UMLIMITED∣<数字值> [K∣M ]] ] }}
ADD LOGFILE '<文件名>' [ SIZE <数字值> [K∣M | G | T ]] [ REUSE ]][,…n]
DROP LOGFILE '<文件名>'
…;
【例1】数据库的归档模式和数据文件。
使上面创建的数据库stdb切换到归档模式。
ALTER DATABASE stdb
ARCHIVELOG;
创建新的数据文件以代替原来的数据文件。
ALTER DATABASE stdb
CREATE DATAFILE 'users' AS 'D:\app\tao\oradata\stdb\users01.dbf'
SIZE 50M REUSE AUTOEXTEND ON NEXT 20M MAXSIZE 500M;
【例2】使用ALTER DATABASE命令扩展users01数据文件。
ALTER DATABASE stdb
DATAFILE 'D:\app\tao\oradata\stdb\users01.dbf' RESIZE 200M;
3. 删除数据库
删除数据库使用DROP语句。
语法格式:
DROP DATABASE database_name
【例】使用PL/SQL语句删除stdb数据库。
DROP DATABASE stdb
表空间操作语句
1.创建表空间
语句:CREATE TABLESPACE
创建的用户必须拥有CREATE TABLESPACE系统权限,在创建之前必须创建包含表空间的数据库。
语法格式:
CREATE TABLESPACE <表空间名>
DATAFILE '<文件路径>/<文件名>' [SIZE <文件大小> [ K∣M ]] [ REUSE ]
[ AUTOEXTEND [ OFF∣ON [ NEXT <磁盘空间大小> [ K∣M ]]
[ MAXSIZE [ UMLIMITED∣<最大磁盘空间大小> [ K∣M ] ] ] ]
[ MINMUM EXTENT <数字值>[ K | M ] ]
[ DEFAULT <存储参数>]
[ ONLINE∣OFFLINE ]
[ LOGGING∣NOLOGGING ]
[ PERMANENT∣TEMPORARY ]
[ EXTENT MANAGEMENT [ DICTIONARY∣LOCAL [ AUTOALLOCATE∣UNIFORM [ SIZE <数字值>[ K∣M ] ] ] ] ]
【例】创建表空间testspace,大小为40MB,禁止自动扩展数据文件。
CREATE TABLESPACE testspace
LOGGING
DATAFILE 'D:\app\DELL\oradata\stsys\testspace01.DBF’ SIZE 40M
REUSE AUTOEXTEND OFF;
2. 管理表空间
命令:ALTER TABLESPACE
功能:修改表空间或它的一个或多个数据文件、或为数据库中每一个数据文件指定各自的存储扩展参数值
语法格式:
ALTER TABLESPACE <表空间名>
[ ADD DATAFILE∣TEMPFILE '<路径>/<文件名>' [ SIZE <文件大小> [ K∣M ] ]
[ REUSE ]
[ AUTOEXTEND [ OFF∣ON [ NEXT <磁盘空间大小> [ K∣M ] ] ] ]
[MAXSIZE [ UNLIMITED∣<最大磁盘空间大小> [ K∣M ] ] ]
[ RENAME DATAFILE '<路径>/<文件名>',…n TO '<路径>/<新文件名>'',…n ]
[ DEFAULT STORAGE <存储参数>]
[ ONLINE∣OFFLINE [ NORMAL∣TEMPORARY∣IMMEDIATE ] ]
[ LOGGING∣NOLOGGING ]
[ READ ONLY∣WRITE ]
[ PERMANENT ]
[ TEMPORARY ]
【例】通过ALTER TABLESPACE命令把一个新的数据文件添加到newspace表空间,并指定了AUTOEXTEND ON和 MAXSIZE 300M。
ALTER TABLESPACE newspace
ADD DATAFILE 'D:\app\DELL\oradata\stsys\DATA02.DBF' SIZE 40M
REUSE AUTOEXTEND ON NEXT 50M MAXSIZE 300M;
3. 删除表空间
语法格式:
DROP TABLESPACE <表空间名>
[ INCLUDING CONTENTS [ {AND | KEEP} DATAFILES ]
[ CASCADE CONSTRAINTS ]
] ;
表操作语句
1. 创建表
语法格式:
CREATE TABLE [<用户方案名>.] <表名>
(
<列名1> <数据类型> [DEFAULT <默认值>] [<列约束>]
<列名2> <数据类型> [DEFAULT <默认值>] [<列约束>]
[,…n]
<表约束>[,…n]
)
[PCTFREE <数字值>]
[PCTUSED <数字值> ]
[INITRANS <数字值>]
[MAXTRANS <最大并发事务数>]
[TABLESPACE <表空间名>]
[STORGE <参数>]
[AS <子查询>]
【例】使用PL/SQL语句,在stsys数据库中创建student表。
CREATE TABLE student
(
sno char(6) NOT NULL PRIMARY KEY,
sname char(8) NOT NULL,
ssex char(2) NOT NULL,
sbirthday date NOT NULL,
speciality char(12) NULL,
sclass char(6) NULL,
tc number NULL
);
注:命名前面加个s是避免如果直接用‘no’、‘number’这些词命名,会和一些关键字或标识符重复。一般命名都会在前面加表名的首字母
创建表格前画一张表作为逻辑模型
创建示例:
用前面创建数据库(4)点登陆sqlplus
(注意,最后一句没有逗号的)
2. 修改表
语法格式:
ALTER TABLE [<用户方案名>.] <表名>
[ ADD(<新列名> <数据类型> [DEFAULT <默认值>][列约束],…n) ]/*增加新列*/
[ MODIFY([ <列名> [<数据类型>] [DEFAULT <默认值>][列约束],…n) ] /*修改已有列的属性*/
[ STORAGE <存储参数> ] /*修改存储特征*/
[<DROP子句> ] /*删除列或约束条件*/
[RENAME COLUMN oldname TO newname /*修改某一字段的名称*/
其中,**<DROP子句>**用于从表中删除列或约束。
【例】
注:MODIFY可以修改某一列的类型,但是不能修改字段名称
语法格式:
<DROP子句>::=
DROP
{
COLUMN <列名>
∣PRIMARY [KEY]
∣UNIQUE (<列名>,…n)
∣CONSTRAINT <约束名>
∣[ CASCADE ]
}
【例】使用ALTER TABLE语句修改stsys数据库中的student表。
(1)在student表中增加一列remarks(备注)。
ALTER TABLE student
ADD remarks varchar(100);
(2)在student表中删除列remarks。
ALTER TABLE student
DROP COLUMN remarks;
3. 删除表
语法格式:
DROP TABLE table_name
其中,table_name是要删除的表的名称。
【例】删除stsys数据库中newstudent表(已创建)。
DROP TABLE newstudent;