一、Oracle的基本命令DDL:
数据库模式定义语言,关键字:create
DML:数据操纵语言,关键字:Insert、delete、update
DCL:数据库控制语言 ,关键字:grant、remove
DQL:数据库查询语言,关键字:select
//在cmd命令提示符下启动sqlplus登录Oracle
sqlplus 用户名/密码 //例如 sqlplus scott/tiger//解锁用户,需要管理员权限的用户才可以,进入system或sys
SQL>alter user scott account unlock;
//从一个用户跳到scott用户下
conn scott/tiger
//当前oracle用户下所有表
select * from user_tables;
//当前oracle用户下所有表名
select table_name from user_tables;
//或进入system用户下执行
select TABLE_NAME from dba_tables where owner='用户名大写'
//查看表结构
describe tablename;
//若在window窗口下sqlplus 中清屏命令:
host cls 或是clear screen 或只是4位clea scre
//查看当前登陆的用户名:
select user from dual;
//或
show user
--查询所有用户:
select * from all_users;
//sys或system下查询
select * from dba_users
--查看当前用户权限:
select * from session_privs;
select * from dept
对数据库的操作:增、删、改、查(select)
where 子句
select * from dept where deptno>20
select * from dept where deptno in(30,40);
select * from dept where deptno<>20;
实现思路:将主键设置为序列,自后每次按照固定规则增加相应的数字即可。
1、首先要有create sequence或者create any sequence权限,
create sequence emp_sequence
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXVALUE -- 不设置最大值
NOCYCLE -- 一直累加,不循环
CACHE 10;
2、插入到表中,
INSERT INTO emp VALUES
(emp_sequence .nextval, 'LEWIS', 'CLERK',7902, SYSDATE, 1200, NULL, 20);
SQL> create table sms_activity(
2 id number,
3 activity_name varchar2(50),
4 begin_time varchar2(30),
5 end_time varchar2(30),
6 content varchar2(600)
7 );
表已创建。
SQL> commit;
提交完成。
SQL> alter table sms_activity add primary key (id);
表已更改。
SQL> commit;
提交完成。
SQL> create sequence sms_activity_seq
2 minvalue 1
3 maxvalue 9999999999
4 increment by 1
5 cache 20
6 ;
序列已创建。
SQL> create or replace trigger bi_activity
2 before insert on sms_activity
3 for each row
4 begin
5 select sms_activity_seq.nextval into :NEW.ID from dual;
6 end;
7 /
触发器已创建
SQL> desc sms_activity
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
ID NOT NULL NUMBER
ACTIVITY_NAME VARCHAR2(50)
BEGIN_TIME VARCHAR2(30)
END_TIME VARCHAR2(30)
CONTENT VARCHAR2(600)
SQL> alter table sms_activity add (create_time varchar2(30),createby varchar2(20),modify_time varchar2(30),modifyby varchar2(20));
表已更改。
SQL> commit;
二、oracle创建视图
在PL/SQL Developer数据库管理工具中,使用SCOTT用户帐号进行登录,新建SQL查询窗口,输入一条创建视图的SQL语句,随后弹出一个错误的提示信息:ORA-01031:权限不足。所以要先授权给用户
//授权给用户
用数据库的system用户给Scott赋权限
登陆system用户,执行grant create view to scott;
此时授权成功就可以用Scott用户创建视图了
********************************************用户的管理****************************************
//创建用户
CREATE USER jason IDENTIFIED BY price;
//指定默认表空间和临时表空间
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp;
//给用户jason授予CREATE SESSION的权利
GRANT CREATE SESSION TO jason;
//修改用户密码:修改用户jason密码为marcus
ALTER USER jason IDENTIFIED BY marcus;
//可以通过PASSWORD命令修改当前登录用户的密码
CONN jason/marcus
PASSWORD
********************************************权限和角色*********************
拥有相关权限可以运行用户在数据库中完成相关操作,如执行DDL语句。
权限可以组合在一起形成相关不同的角色。两个比较有用的角色是CONNECT和RESOURCE角色
************************************************************
CREATE OR REPLACE VIEW dept_sum_vw
(name,minsal,maxsal,avgsal)
AS
SELECT d.dname,min(e.sal),max(e.sal),avg(e.sal)
FROM emp e,dept d
WHERE e.deptno=d.deptno
GROUP BY d.dname;
CREATE OR REPLACE VIEW dept_sum_vw
(name,minsal,maxsal,avgsal)
AS
SELECT d.dname,min(e.sal),max(e.sal),avg(e.sal)
FROM emp e,dept d
WHERE e.deptno=d.deptno
GROUP BY d.dname;
视图的优点:
1.对数据库的访问,因为视图可以有选择性的选取数据库里的一部分。
2.用户通过简单的查询可以从复杂查询中得到结果。
3.维护数据的独立性,试图可从多个表检索数据。
4.对于相同的数据可产生不同的视图。
视图的分类:
视图分为简单视图和复杂视图。
两者区别如下:
1.简单视图只从单表里获取数据,复杂视图从多表获取数据;
2.简单视图不包含函数和数据组,复杂视图包含;
3.简单视图可以实现DML操作,复杂视图不可以。
************************************************************
//存储过程
create or replace procedure helloworld
as
begin
dbms_output.put_line('helloworld');
end;
/
set serveroutput on;
execute helloworld;
Oracle存储过程基本语法 存储过程
1 CREATE OR REPLACE PROCEDURE 存储过程名
2 IS
3 BEGIN
4 NULL;
5 END;
行1:
CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个存储过程, 如果存在就覆盖它;
行2:
IS关键词表明后面将跟随一个PL/SQL体。 关键字IS和AS均可,
行3:
BEGIN关键词表明PL/SQL体的开始。
行4:
NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句; 们本身没有区别。IS后面是一个完整的
PL/SQL块,可以定义局部变量,但不能以DECLARE开始。局部变量在过程内部存放值。
行5:
END关键词表明PL/SQL体的结束
////////////////////////////////////////////////////////////////////
带参存储过程(输入参数)
create or replace procedure helloTom (pname in varchar2)
as
begin
dbms_output.put_line('hello '|| pname ||'!');
end;
/
set serveroutput on;
exec helloTom('jerry');
/////////////////////////////////////////////////////////////////////////////////////////////
带参存储过程(输出参数)
create or replace procedure writeTom(pname out varchar2)
as
begin
select loc into pname from dept where rownum=1;
end;
/
variable pname varchar2(40);
exec writeTom(:pname);
declare
cname varchar2(40);
begin
writeTom(cname);
dbms_output.put_line(cname);
end;
/
//java代码
Class.forName("oracle.jdbc.driver.OracleDriver");
conn=DriverManager.getConnection(url, "scott", "tiger");
//创建存储过程的对象
CallableStatement c=conn.prepareCall("{call writeTom(?)}");
//给存储过程的第一个参数设置值
c.registerOutParameter(1, Types.VARCHAR);
//执行存储过程
c.execute();
//得到存储过程的输出参数值
System.out.println (c.getString(1));
/////////////////////////////////////////////////////////////////////////////////////////////
带参存储过程(in out 两个参数)
//创建存储过程InoutTom向查询dno数据的dname
create or replace procedure inoutTom(dno in number,info out varchar2)
as
begin
select dname || '_' || loc into info from dept where deptno=dno;
end;
/
Java代码
Class.forName("oracle.jdbc.driver.OracleDriver");
conn=DriverManager.getConnection(url, "scott", "tiger");
c=conn.prepareCall("{call OUTINFO(?,?)}");
c.setInt(1, 20);
c.registerOutParameter(2, Types.VARCHAR);
c.execute();
System.out.println(c.getString(2));
形式参数可以有三种模式:IN、OUT、INOUT。如果没有为形式参数指定模式,那么默认的模式是IN。
IN表示输入参数
OUT表示输出参数
模式描述IN参数(默认模式)(输入参数)用来从调用环境中向存储过程传递值,不能给IN参数赋值,给此参数传递的值可以是常
量、有值的变量、表达式等。
OUT参数(输出参数)用来从过程中返回值给调用者,不能将此参数的值赋给另一个变量,不能是常量或表达式。在过程体内,
必须给OUT参数赋值。INOUT参数(输入输出参数)既可以从调用者向过程中传递值,执行过程后还可返回可能改变了的值给调用者
。
IN参数(默认模式)(输入参数):用来从调用环境中向存储过程传递值,不能给IN参数赋值,给此参数传递的值可以是常量、有值
的变量、表达式等。
OUT参数(输出参数):用来从过程中返回值给调用者,不能将此参数的值赋给另一个变量,不能是常量或表达式。在过程体内,必
须给OUT参数赋值。
INOUT参数(输入输出参数):既可以从调用者向过程中传递值,执行过程后还可返回可能改变了的值给调用者。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、另外的例子
CREATE OR REPLACE PROCEDURE stu_proc(v_name OUT VARCHAR2) AS
BEGIN
SELECT o.dname INTO v_name FROM dept o where o.deptno = 20;
END;