安装步骤
1.安装依赖包
操作用户:root
yum -y install binutils compat-libcap1 compat-libstdc++-33 compat-libstdc++-33*i686 compat-libstdc++-33*.devel compat-libstdc++-33 compat-libstdc++-33*.devel gcc gcc-c++ glibc glibc*.i686 glibc-devel glibc-devel*.i686 ksh libaio libaio*.i686 libaio-devel libaio-devel*.devel libgcc libgcc*.i686 libstdc++ libstdc++*.i686 libstdc++-devel libstdc++-devel*.devel libXi libXi*.i686 libXtst libXtst*.i686 make sysstat unixODBC unixODBC*.i686 unixODBC-devel unixODBC-devel*.i686
注:中途若有碰到选择的(y/n),直接输入y就行
2.验证依赖包
操作用户:root
rpm -q binutils compat-libcap1 compat-libstdc++-33 gcc gcc-c++ glibc glibc-devel ksh libaio libaio-devel libgcc libstdc++ libstdc++-devel libXi libXtst make sysstat unixODBC unixODBC-devel
正常所有包都会显示已安装,自己注意是否有未安装的包
3.创建oracle用户
操作用户:root
groupadd -g 502 oinstall
groupadd -g 503 dba
groupadd -g 504 oper
groupadd -g 505 asmadmin
useradd -u 502 -g oinstall -G oinstall,dba,asmadmin,oper -s /bin/bash -m oracle
passwd oracle
到最后一步会提示设置密码
注:500之后为普通用户
4.解压Oracle安装包
操作用户:oracle
注:使用 su - 用户名,切换操作用户
存放目录自己随便选,我的在根目录下 /oradata
unzip linux.x64_11gR2_database_1of2.zip
unzip linux.x64_11gR2_database_2of2.zip
可能会提示没操作权限,使用
chown -R oracle:oinstall /oradata
就可以了
解压后会得到一个database的目录
5.修改系统配置
操作用户:root
vi /etc/security/limits.conf
在文件的末尾添加如下配置项
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft stack 10240
6.创建Oracle安装目录
操作用户:oracle
根据分区大小自己选,我在的 /oradata/soft/oracle11g
7.修改环境变量
操作用户:oracle
vi /etc/profile
在文件末尾添加如下配置项
export ORACLE_BASE=/oradata/soft/oracle11g
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0.3/dbhome_1
export ORACLE_SID=prod
export ORACLE_UNQNAME=prod
export NLS_LANG=.AL32UTF8
export PATH=${PATH}:${ORACLE_HOME}/bin/:$ORACLE_HOME/lib64
使得环境变量生效
source /etc/profile
8.修改oracle配置文件
操作用户:oracle
操作目录:/oradata
复制文件模板
cp /oradata/database/response/db_install.rsp .
最后还有一个 . 不能漏了。会把 db_install.rsp文件从拷贝到当前目录
对db_install.rsp文件进行编辑
vi db_install.rsp
需要修改的配置项如下所示
oracle.install.option=INSTALL_DB_AND_CONFIG
ORACLE_HOSTNAME=localhost #实际上可以修改成你自己的主机名或者域名(IP)
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/oradata/soft/oraInventory
SELECTED_LANGUAGES=en,zh_CN
ORACLE_HOME=/oradata/soft/oracle11g/product/11.2.0.3/dbhome_1
ORACLE_BASE=/oradata/soft/oracle11g
oracle.install.db.InstallEdition=EE
oracle.install.db.DBA_GROUP=dba
oracle.install.db.OPER_GROUP=oper
oracle.install.db.config.starterdb.type=GENERAL_PURPOSE
oracle.install.db.config.starterdb.globalDBName=prod
oracle.install.db.config.starterdb.SID=prod
oracle.install.db.config.starterdb.characterSet=AL32UTF8
oracle.install.db.config.starterdb.memoryOption=true
oracle.install.db.config.starterdb.memoryLimit=1024
oracle.install.db.config.starterdb.installExampleSchemas=false
oracle.install.db.config.starterdb.password.ALL=oracle #也可不设置
oracle.install.db.config.starterdb.control=DB_CONTROL
oracle.install.db.config.starterdb.dbcontrol.enableEmailNotification=false
oracle.install.db.config.starterdb.dbcontrol.emailAddress=test@qq.com #可以填写你自己的邮箱地址
oracle.install.db.config.starterdb.automatedBackup.enable=false
oracle.install.db.config.starterdb.storageType=FILE_SYSTEM_STORAGE
oracle.install.db.config.starterdb.fileSystemStorage.dataLocation=/oradata/soft/oracle11g/data
oracle.install.db.config.starterdb.fileSystemStorage.recoveryLocation=/oradata/soft/oracle11g/fast_recovery_area
oracle.install.db.config.starterdb.automatedBackup.enable=false
DECLINE_SECURITY_UPDATES=true
9.安装数据库
操作用户:oracle
操作目录:/oradata/database
./runInstaller -silent -ignoreSysPrereqs -responseFile /oradata/db_install.rsp -ignorePrereq
注:有些警告会终止安装,-ignoreSysPrereqs和-ignorePrereq可以跳过警告
现在就等待它自己安装好了,可以根据提示,使用tail -f 命令另开一个界面看安装进度。其实就是看看有没有卡死
待出现下面的情况,就说明已经安装好了
/oradata/soft/oraInventory/orainstRoot.sh
/oradata/soft/oracle11g/product/11.2.0.3/dbhome_1/root.sh
To execute the configuration scripts:
1. Open a terminal window
2. Log in as "root"
3. Run the scripts
4. Return to this window and hit "Enter" key to continue
Successfully Setup Software.
10.安装完成
操作用户:root
根据上一步完成信息提示,执行以下两行命令,具体位置需要根据你的安装位置决定
/oradata/soft/oraInventory/orainstRoot.sh
/oradata/soft/oracle11g/product/11.2.0.3/dbhome_1/root.sh
11.验证安装结果
操作用户:oracle
sqlplus / as sysdba
能成功进入SQL命令行
12.启动数据库
安装好后监听和数据库都是已经打开的,若服务器重启,则使用 lsnrctl start 启动监听,管理员登录后使用 startup 打开数据库
Oracle使用
SELECT table_name FROM user_tables;
SELECT * FROM dba_users;
ALTER USER scott account unlock;
---修改scott用户密码
ALTER USER scott IDENTIFIED BY tiger;
---删除表空间
DROP tablespace ts1;
---创建表空间
CREATE tablespace ts1 datafile '/opt/oracleTableSpace/ts1.dbf' SIZE 50M;
---修改默认表空间
ALTER DATABASE DEFAULT tablespace users;
---创建表
CREATE TABLE kgc(id NUMBER,name varchar2(32));
SELECT * FROM kgc;
---创建序列
CREATE SEQUENCE user_seq;
SELECT user_seq.nextval FROM dual;
CREATE SEQUENCE user_seq2 START WITH 100;
SELECT user_seq2.nextval FROM dual;
CREATE SEQUENCE user_seq3 MINVALUE 5 MAXVALUE 100;
SELECT user_seq3.nextval FROM dual;
CREATE SEQUENCE user_seq4 INCREMENT BY 3;
SELECT user_seq4.nextval FROM dual;
CREATE SEQUENCE kgc_seq MINVALUE 1 nomaxvalue INCREMENT BY 1 START WITH 1 nocache;
---创建触发器
CREATE OR REPLACE TRIGGER kgc_trigger_insertid BEFORE INSERT ON KGC FOR EACH ROW
BEGIN
SELECT kgc_seq.nextval INTO:NEW.id FROM dual;
END;
INSERT INTO KGC(name) VALUES('lisi');
------------创建俩张表和id自增触发器--------------------
CREATE SEQUENCE tbook_seq MINVALUE 1 nomaxvalue INCREMENT BY 1 START WITH 1 nocache;
CREATE OR REPLACE TRIGGER tbook_trigger_insertid BEFORE INSERT ON T_BOOK FOR EACH ROW
BEGIN
SELECT tbook_seq.nextval INTO:NEW.id FROM dual;
END;
CREATE SEQUENCE tbooktype_seq MINVALUE 1 nomaxvalue INCREMENT BY 1 START WITH 1 nocache;
CREATE OR REPLACE TRIGGER tbooktype_trigger_insertid BEFORE INSERT ON T_BOOKTYPE FOR EACH ROW
BEGIN
SELECT tbooktype_seq.nextval INTO:NEW.id FROM dual;
END;
CREATE TABLE T_BOOK(
id NUMBER,
bookName varchar(32),
typeId NUMBER,
PRIMARY KEY(id)
);
CREATE TABLE T_BOOKTYPE(
id NUMBER,
typeName varchar2(32),
PRIMARY KEY(id)
);
INSERT INTO T_BOOKTYPE(typeName) VALUES('计算机');
SELECT * FROM T_BOOKTYPE;
INSERT INTO T_BOOK(bookName,TYPEID) VALUES('朗博英语',1);
INSERT INTO T_BOOK(bookName,TYPEID) VALUES('30天精通Java',2);
SELECT * FROM T_BOOK;
SELECT * FROM v$session;
CREATE OR REPLACE TRIGGER tr_book BEFORE DELETE ON T_BOOK FOR EACH ROW
BEGIN
IF USER!='ZHANGPENG' THEN
raise_application_error(-20001,'权限不足');
END IF;
END;
CREATE TABLE T_BOOK_OPLOG(
actionuser varchar2(32),
actionname varchar2(32),
actiontime DATE
);
CREATE OR REPLACE TRIGGER tr_op_tbook AFTER INSERT OR UPDATE OR DELETE ON T_BOOK FOR EACH ROW
BEGIN
IF updating THEN
INSERT INTO T_BOOK_OPLOG VALUES(USER,'update',SYSDATE);
ELSE IF inserting THEN
INSERT INTO T_BOOK_OPLOG VALUES(USER,'insert',SYSDATE);
ELSE IF deleting THEN
INSERT INTO T_BOOK_OPLOG VALUES(USER,'delete',SYSDATE);
END IF;
END IF;
END IF;
END;
INSERT INTO T_BOOK(bookName,TYPEID) VALUES('7天精通scala',2);
UPDATE T_BOOK SET BOOKNAME='3天精通scala' WHERE ID=3;
DELETE FROM T_BOOK WHERE ID=3;
SELECT * FROM T_BOOK_OPLOG;
---创建函数
CREATE OR REPLACE FUNCTION GETOPCOUNT RETURN NUMBER AS
BEGIN
DECLARE OP_COUNT NUMBER;
BEGIN
SELECT COUNT(*) INTO OP_COUNT FROM T_BOOK_OPLOG WHERE actionname='insert';
RETURN OP_COUNT;
END;
END GETOPCOUNT;
CREATE OR REPLACE FUNCTION GETOPCOUNTBY(opName varchar2) RETURN NUMBER AS
BEGIN
DECLARE OP_COUNT NUMBER;
BEGIN
SELECT COUNT(*) INTO OP_COUNT FROM T_BOOK_OPLOG WHERE actionname= + opName;
RETURN OP_COUNT;
END;
END GETOPCOUNTBY;
CREATE OR REPLACE FUNCTION GETOPCOUNTBY2(opName varchar2) RETURN NUMBER AS
BEGIN
DECLARE OP_COUNT NUMBER;
query_sql varchar2(300);
BEGIN
query_sql:='SELECT COUNT(*) FROM T_BOOK_OPLOG WHERE actionname=' || ''''||opName ||'''';
EXECUTE IMMEDIATE query_sql INTO OP_COUNT;
RETURN OP_COUNT;
END;
END GETOPCOUNTBY2;
SELECT GETOPCOUNTBY2('insert') num FROM dual;
SELECT * FROM KGC;
------------------------------------------------------字符串函数--------------------------------------------------------------
---向左补齐
SELECT name,LPAD(NAME,6,'a') FROM KGC;
---向右补齐
SELECT name,RPAD(NAME,5,'0') FROM KGC;
---转大写
SELECT name,UPPER(NAME) FROM KGC;
---转小写
SELECT LOWER('ASD') FROM dual;
---首字母大写
SELECT name,INITCAP(NAME) FROM KGC;
---字符串长度
SELECT name,LENGTH(NAME) FROM KGC;
---字符串截取
SELECT name,SUBSTR(NAME,1,3) FROM KGC;
---字符串包含(返回包含字符串的位置)
SELECT name,INSTR(NAME,'s') FROM KGC;
---去空格(两端)
SELECT TRIM(' aabb ') FROM dual;
---左边去空格
SELECT LTRIM(' aabb') FROM dual;
---右边去空格
SELECT RTRIM('aabb ') FROM dual;
---字符串拼接
SELECT CONCAT('hello ',name) FROM KGC;
---字符反转
SELECT REVERSE(name) FROM KGC;
----------------------------------------------------数学函数----------------------------------------------------------
---四舍五入
SELECT ROUND(3.1415926,2) FROM dual;
---向上取整
SELECT CEIL(123.456) FROM dual;
---向下取整
SELECT FLOOR(123.556) FROM dual;
---取模
SELECT MOD(32,7) FROM dual;
---与零比较,大于零为1,小于零为-1,等于零为0
SELECT SIGN(-12) FROM dual;
SELECT SIGN(12) FROM dual;
SELECT SIGN(0) FROM dual;
---次幂函数
SELECT POWER(3,2) FROM dual;
--开放
SELECT SQRT(9) FROM dual;
---取小数点后几位
SELECT TRUNC(1234.5678,3) FROM dual;
SELECT TRUNC(1234.5678,0) FROM dual;
SELECT TRUNC(1234.5678,-1) FROM dual;
---将数字转为字符串
SELECT TO_CHAR(123.45) FROM dual;
SELECT TO_CHAR(123.45,'000.00') FROM dual;
SELECT TO_CHAR(123123123.45,'999,999,999.99') FROM dual;
--------------------日期------------------------
SELECT SYSDATE FROM dual;
SELECT SYSTIMESTAMP FROM dual;
SELECT ADD_MONTHS(SYSDATE,3) FROM dual;
SELECT LAST_DAY(SYSDATE) FROM dual;
-----视图创建调用
SELECT * FROM T_BOOK_OPLOG;
CREATE OR REPLACE VIEW v_tbook_log AS
SELECT * FROM T_BOOK_OPLOG WHERE ACTIONNAME='update' WITH READ ONLY;
SELECT * FROM v_tbook_log;
CREATE OR REPLACE FUNCTION myfunction RETURN varchar AS
BEGIN
DECLARE num NUMBER:=1000;
v varchar(32):='hello oracle';
BEGIN
dbms_output.put_line('hello '||num||v);
RETURN 'hello '||num||v;
END;
END;
SELECT myfunction() FROM dual;
SELECT * FROM SCOTT.EMP WHERE SAL>=3000;
CREATE OR REPLACE FUNCTION getEmpCountBy(salary NUMBER) RETURN varchar AS
BEGIN
DECLARE emp_count NUMBER;
query_sql varchar2(500);
BEGIN
SELECT COUNT(*) INTO emp_count FROM SCOTT.EMP WHERE SAL>=salary;
---query_sql:='SELECT COUNT(*) FROM SCOTT.EMP WHERE SAL>='||salary;
---EXECUTE IMMEDIATE query_sql INTO emp_count;
IF emp_count>0 THEN
RETURN '有'|| emp_count|| '名员工薪资大于等于'|| salary;
ELSE
RETURN '没有薪资大于等于'|| salary|| '的员工';
END IF;
END;
END;
SELECT getEmpCountBy(3000) FROM dual;
DECLARE emp_count NUMBER;
RESULT_str varchar2(200);
salValue NUMBER:=4000;
BEGIN
SELECT COUNT(*) INTO emp_count FROM SCOTT.EMP WHERE SAL>=4000;
IF (emp_count=1) THEN
dbms_output.put_line('有一名薪资大于'||salValue);
ELSIF (emp_count>1) THEN
dbms_output.put_line('有'||emp_count||'名薪资大于'||salValue);
ELSE
dbms_output.put_line('没有');
END IF;
END IF;
END;
DECLARE orinum NUMBER:=1;
sumvalue NUMBER:=0;
BEGIN
LOOP
IF (orinum>5) THEN
EXIT;
END IF;
sumvalue:=sumvalue+orinum;
orinum:=orinum+1;
dbms_output.put_line(sumvalue);
END LOOP;
END;
DECLARE emp_count NUMBER;
salvalue NUMBER:=3000;
BEGIN
SELECT COUNT(*) INTO emp_count FROM SCOTT.EMP WHERE SAL>= + salvalue;
CASE emp_count
WHEN 0 THEN
dbms_output.put_line('没有员工薪资大于'||salvalue);
WHEN 1 THEN
dbms_output.put_line('有一名员工薪资大于'||salvalue);
WHEN 2 THEN
dbms_output.put_line('有两名员工薪资大于'||salvalue);
WHEN 3 THEN
dbms_output.put_line('有三名员工薪资大于'||salvalue);
ELSE
dbms_output.put_line('有三名以上员工薪资大于'||salvalue);
END CASE;
END;
DECLARE orinum NUMBER:=1;
sumvalue NUMBER:=0;
BEGIN
WHILE orinum<6 LOOP
sumvalue:=sumvalue+orinum;
dbms_output.put_line(sumvalue);
orinum:=orinum+1;
END LOOP;
END;
DECLARE orinum NUMBER:=1;
sumvalue NUMBER:=0;
BEGIN
FOR orivalue IN 1..5 LOOP
sumvalue:=sumvalue+orivalue;
dbms_output.put_line(sumvalue);
END LOOP;
END;
-------------游标----------------
DECLARE
--定义游标
CURSOR c_job IS
SELECT empno,ename,job,sal FROM SCOTT.EMP WHERE JOB='MANAGER';
--定义游标变量,用来接受c_job中每行的数据
c_row c_job%rowtype;
BEGIN
FOR c_row IN c_job LOOP
dbms_output.put_line(c_row.empno||'--'||c_row.ename||'--'||c_row.job||'--'||c_row.sal);
END LOOP;
END;
-------------------------------------------------------------------------------
DECLARE
--定义游标
CURSOR c_job IS
SELECT empno,ename,job,sal FROM SCOTT.EMP WHERE JOB='MANAGER';
--定义游标变量,用来接受c_job中每行的数据
c_row c_job%rowtype;
BEGIN
OPEN c_job; ---打开游标
LOOP
--抓取游标中一行数据,赋值给c_row
FETCH c_job INTO c_row;
EXIT WHEN c_job%notfound;
dbms_output.put_line(c_row.empno||'--'||c_row.ename||'--'||c_row.job||'--'||c_row.sal);
END LOOP;
CLOSE c_job; ---关闭游标
END;
-------------------------------------------------------------------------------
BEGIN
IF SQL%isopen THEN
dbms_output.put_line('sql游标已打开');
ELSE
dbms_output.put_line('sql游标未打开');
END IF;
END;
CREATE TABLE SCOTT.EMP1 AS SELECT * FROM SCOTT.EMP;
DECLARE
CURSOR csr_update IS
SELECT * FROM SCOTT.EMP1 FOR UPDATE OF SAL;
empInfo csr_update%rowtype;
salInfo SCOTT.EMP1.sal%TYPE;
BEGIN
FOR empInfo IN csr_update LOOP
IF empInfo.sal<1500 THEN
salInfo:=empInfo.sal*1.2;
ELSE IF empInfo.sal<2000 THEN
salInfo:=empInfo.sal*1.5;
ELSE IF empInfo.sal<3000 THEN
salInfo:=empInfo.sal*2;
END IF;
END IF;
END IF;
--UPDATE SCOTT.EMP1 SET sal=salInfo WHERE empno=EMPINFO.empno;
UPDATE SCOTT.EMP1 SET sal=salInfo WHERE CURRENT OF CSR_UPDATE;
END LOOP;
END;
SELECT * FROM SCOTT.EMP;
SELECT * FROM SCOTT.EMP1;
-----------存储过程--------------
CREATE OR REPLACE PROCEDURE testloop(num IN NUMBER,sumvalue OUT NUMBER) AS
BEGIN
DECLARE orinum NUMBER:=0;
sumVal NUMBER:=0;
BEGIN
LOOP
IF orinum>num THEN
sumvalue:=sumVal;
EXIT;
END IF;
sumVal:=sumVal+orinum;
orinum:=orinum+1;
END LOOP;
END;
END;
DECLARE sumVal NUMBER;
BEGIN
testloop(5,sumVal);
dbms_output.put_line('结果:'||sumVal);
END;
CREATE OR REPLACE PROCEDURE addBook(bookName IN varchar2,typeID IN NUMBER) AS
BEGIN
DECLARE maxID NUMBER;
BEGIN
SELECT MAX(id) INTO maxID FROM T_BOOK;
INSERT INTO T_BOOK(id,bookname,typeid) VALUES(maxID+1,bookName,typeID);
END;
END;
BEGIN
addBook('30天精通scala',2);
END;
SELECT * FROM T_BOOK;
----------范围分区-----------
CREATE TABLE range_table(
id NUMBER,
done_date DATE,
DATA varchar2(32)
)
PARTITION BY RANGE(done_date)
(
PARTITION part_1 VALUES less than(TO_DATE('20200712','yyyymmdd')),
PARTITION part_2 VALUES less than(TO_DATE('20210712','yyyymmdd')),
PARTITION part_3 VALUES less than(MAXVALUE)
)
INSERT INTO RANGE_TABLE VALUES(1,TO_DATE('20200611','yyyymmdd'),'hehe');
INSERT INTO RANGE_TABLE VALUES(2,TO_DATE('20210612','yyyymmdd'),'hello');
INSERT INTO RANGE_TABLE VALUES(3,TO_DATE('20210713','yyyymmdd'),'world');
I
SELECT * FROM user_tab_partitions WHERE table_name='HASH_TABLE';
SELECT * FROM RANGE_TABLE;
------删除分区----------
ALTER TABLE RANGE_TABLE TRUNCATE PARTITION part_2;
--------散列分区---------
CREATE TABLE hash_table(
id NUMBER,
done_date DATE,
DATA varchar2(32)
)
PARTITION BY hash(done_date)
(
PARTITION part_1,
PARTITION part_2
)
---------列表分区----------
CREATE TABLE list_table(
id NUMBER,
name varchar2(32),
DATA varchar2(32)
)
PARTITION BY list(id)
(
PARTITION part_1 VALUES(1,3,5,7),
PARTITION part_2 VALUES(2,4,6,8),
PARTITION part_default VALUES(DEFAULT)
);
SELECT * FROM user_tab_partitions WHERE table_name='LIST_TABLE';
----------范围散列分区------------
CREATE TABLE range_hash_table(
id NUMBER,
done_date DATE,
DATA varchar2(32)
)
PARTITION BY RANGE(done_date) ---按日期进行一级范围分区
subpartition BY hash(id) ---再按id值进行二级分区
(
PARTITION part_1 VALUES less than (TO_DATE('20200710','yyyymmdd'))
(
SUBPARTITION part_1_sub_1,
SUBPARTITION part_1_sub_2
),
PARTITION part_2 VALUES less than (TO_DATE('20210710','yyyymmdd'))
(
SUBPARTITION part_2_sub_1,
SUBPARTITION part_2_sub_2
),
PARTITION part_3 VALUES less than (MAXVALUE)
(
SUBPARTITION part_3_sub_1,
SUBPARTITION part_3_sub_2
)
);
SELECT * FROM user_tab_partitions WHERE table_name='RANGE_HASH_TABLE';
---------范围列表分区---------
CREATE TABLE range_list_table(
id NUMBER,
done_date DATE,
DATA varchar2(32)
)
PARTITION BY RANGE(done_date)
subpartition BY list(id)
(
PARTITION part_1 VALUES less than (TO_DATE('20200710','yyyymmdd'))
(
SUBPARTITION part_1_sub_1 VALUES(1,3,5),
SUBPARTITION part_1_sub_2 VALUES(2,4,6)
),
PARTITION part_2 VALUES less than (TO_DATE('20210710','yyyymmdd'))
(
SUBPARTITION part_2_sub_1 VALUES(11,13,15),
SUBPARTITION part_2_sub_2 VALUES(12,14,16)
),
PARTITION part_3 VALUES less than (MAXVALUE)
(
SUBPARTITION part_3_sub_1 VALUES(21,23,25),
SUBPARTITION part_3_sub_2 VALUES(22,24,26)
)
)