数据库名
数据库实例名
数据库名与实例名之间的关系
操作系统环境变量
数据库域名
全局数据库名
数据库服务名
create database database_name
create table Student( sno char(20) primary key, sname varchar(20) not null ); -- Oracle中 -- 复制表 create table table_name as select * from table_name; -- 只复制表结构 create table table_name as select * from table_name where 1=2;
primary key 用来指示表的关键字(主码)
也可以这样用:
primary key(sno,cno)
not null 用以表现字段不能为空
create view view_name as (select * from table_name); -- 注意 as
add
alter table table_name add column_name 数据类型; -- 例如,给Student表添加字段 phone char(16) alter table Student add phone char(16);
alter
-- 修改表结构 -- alter table 表名 alter column 字段名 字段类型 alter table table_name alter column sdept varchar(1);
drop
-- 删除字段 alter table table_name drop column column_name;
drop table Student;
删除表顺序应当是:关联表 -- 基本表
select column_name from table_name where
select column_name from table_name table_name_temp where -- table_name_temp为table_name的代替,此时不使用as说明 -- where条件中table_name由table_name_temp代替
select * from (select * from table_name) where rownum<=number; -- 找出在结果select * from table_name中的前number列 -- 只能使用 "<" or "<="
insert into table_name() values (); -- 也可省略成 insert into table_name values();
update table_name set colmun=() where
delete from table_name where
-- 给用户赋予连接权 grant connect to user_name; -- 具有connect权限的用户 == 具有权限 -- alter table -- create table/index -- drop table/view/index -- grant -- revoke -- insert/select/update/delete -- audit/noaudit -- 给用户分配建表权 grant create table to user_name; -- 此时用户不能成功建表,因为没有表空间操作权 alter user user_name quota size on table_space_name; -- table_space_name一般为users -- 将select权限赋予一个角色 grant select on table_name to (角色名); -- 将select权限赋予所有人 grant select on table_name to public;
在给用户赋予连接权之前,创建用户:
create user user_name identified by password
如果使用某版本的 Oracle,用户名前需要带上
C##
即写为C##user_name
注意
create table
权限和create any table
权限的区别
-- 收回用户的建表权 revoke create table from user_name;
"%" 匹配任意字符串
"_" 匹配任意一个字符
如果需要查询的条件中包括通配符,例如:查找名字中带有 "__"的数据
-- escape 规定转义字符为'\' select sname from Student where sname like '%\_%' escape '\';
avg
sum
min
max
count
统计去重后的数量:
count (distinct column_name)
用在 group by
子句后面,针对聚合函数的结果值进行筛选
insert into Student() select column_name from table_name where -- select子句的column与Student()对应
-- Oracle -- Oracle中常量放在dual中 select sysdate from dual; -- SQL Server select getdate();
select * from table_name where column_name=&temp; -- &temp为用户输入
不能直接使用DDL
declare 变量 -- 变量赋值语句为 var_name:=constant begin 程序 -- "<>" "!=" 不等于 -- "||" 连接 -- "and" 并且 -- "or" 或者 exception when then end;
if then elsif then else end if;
-- 循环 loop exit when -- 结束循环 end loop; -- while while () loop end loop; -- for for var in [] loop end loop;
dbms_output.put_line('muhuai');
输出不带空行:
dbms_output.put()
dbms_output.put_line(rpad('muhuai',number,char_c)); -- number为输出行的字符长度,char_c为填充字符
游标和查询关联
cursor cursor_name is select
-- 打开游标 open cursor_name; close cursor_name; -- 遍历游标 -- 需要一个游标类型的变量 var_cursor cursor_name%rowtype; fetch cursor_name into var_cursor; -- 此时游标将第一条数据放入var_cursor
open cursor_name; fetch cursor into var_cursor; while cursor%found loop -- 循环在游标便利结束后结束 end loop; close cursor_name;
无法open/close/loop/fetch
游标在commit操作后重置
sql%found -- 说明语句修改到行 sql%notfound -- 说明语句没有修改到行 sql%rowcount -- 语句修改到的行数
游标的具体查询语句不在 declare 块中定义,在 declare 块中只定义游标名称,sql语句定义在 begin 块中
declare type ref_cursor_name is ref cursor; -- 定义变量 var_ref_cursor ref_cursor_name; -- 动态游标 begin open var_ref_cursor for select ; -- 打开动态游标 -- 此时游标为var_ref_cursor -- 遍历动态游标,方法同遍历游标 close var_ref_cursor; end;
需要通过主程序调用(测试程序调用)
主程序调用之前,过程程序段需要运行保存一下
create or replace procedure procedure_name [(var_in in var_type,var_out out var_type)] is -- 变量定义 begin -- 程序 exception end;
-- 测试程序调用 declare begin procedure_name[(var_in,var_out)]; -- 或者 procedure_name[(var_1=>var_in,var_2=>var_out)]; end;
需要通过主程序调用(测试程序调用)
主程序调用之前,过程程序段需要运行保存一下
create or replace function function_name [(var_in in var_type)] [return return_type] is begin -- 如果有 return,则一定要 return end;
需要通过主程序调用(测试程序调用)
主程序调用之前,过程程序段需要运行保存一下
创建 -- 程序块 -- 包
包头和包体不在同一程序块中,但是保证包头名和包体名相同
-- 包头 create or replace package package_name is -- 变量定义 var var_type; cursor cursor_name is select ; procedure procedure_name (var_in in_type,var_out out out_type); function function_name(var_in in_type) return return_type; end package_name;
-- 包体 create or replace package body package_name as -- 包体变量定义 begin -- 包头程序、函数的实现 end package_name;
-- 测试程序 declare begin var_1:=package_name.var; package_name.procedure_name(); var_2:=package_name.function_name(); open package_name.cursor_name; close package_name.cursor_name; end;
execute immediate
用以执行PL/SQL中的SQL语句
execute immediate 'create table table_name ···';
类似于过程或者函数
发生在DML操作上
触发器名字不可相同
-- 创建触发器 create or replace trigger trigger_name [before|after|instead of] [insert|delete|update] on table_name for each row begin if inserting then elsif updating then elsif deleting then end if; end; -- 删除触发器 drop trigger trigger_name; -- 禁止|打开触发器 alter trigger trigger_name disable|enable;
-- :new -- delete 语句不存在相应的 :new
-- :old -- insert 语句不存在相应的 :old
-- 自定义错误类型返回 -- 因为Oracle中错误码-20000以前都被占用了,所以自定义错误码从-20000开始 -- 错误码取值范围 [-20000,-20999] if then raise_application_error(-20000,'报错内容'); end if;