Oracle学习大全

--在system表空间创建用户

--其中,jinanuser是用户名 jinanuser是密码

CREATE USER jinanuser IDENTIFIED BY jinanuser;

--将DBA角色赋给jinanuser这个用户

GRANT DBA TO jinanuser;

--撤销jinanuser用户的DBA角色

REVOKE DBA FROM jinanuser;

--在自己创建的用户下创建jinantest

CREATE USER jinantest IDENTIFIED BY jinantest;

--给jinantest权限CONNECT

GRANT CONNECT TO jinantest;

REVOKE CONNECT FROM jinantest;

1、关于主键:在建表时指定primary key字句即可:

create table test(

id  number(6) primary key,

name varchar2(30)

);

如果是对于已经建好的表,想增加主键约束,则类似语法:

alter table test add constraint pk_id primary key(id);

--给jinantest权限resource

GRANT RESOURCE TO jinantest;

REVOKE RESOURCE FROM jinantest;

--使用jinanuser创建创建tb_user表

CREATE TABLE tb_user(

user_id INT PRIMARY KEY,

user_name VARCHAR2(50) NOT NULL,

user_desc VARCHAR2(2000)

)

--删除表

DROP TABLE tb_user;

SELECT * FROM tb_user;

--添加列

ALTER TABLE tb_user ADD user_pwd VARCHAR2(50);

--修改列

ALTER TABLE tb_user MODIFY user_pwd LONG;

SELECT * FROM tb_user;

--删除列

ALTER TABLE tb_user DROP COLUMN user_desc;

--用于产生主键数值的方法,序列:sequence

CREATE SEQUENCE seq_test

START WITH 1

INCREMENT BY 1;

--选取序列的当前值 seq_xxx.currval

--DUAL 虚表

SELECT seq_test.CURRVAL FROM dual;

--sysdate表示Oracle数据库当前系统时间

SELECT SYSDATE FROM dual;

--选取序列的下一个值:seq_xxx.nextval

SELECT seq_test.NEXTVAL FROM dual;

INSERT INTO tb_user VALUES(seq_test.nextval,‘张三‘,‘123456‘);

--查询数据

SELECT * FROM tb_user;

SELECT seq_test.NEXTVAL FROM dual;

INSERT INTO tb_user VALUES(seq_test.nextval,‘李四‘,‘654321‘);

SELECT * FROM tb_user;

--插入指定的字段

INSERT INTO tb_user(user_id,user_name) VALUES (seq_test.nextval,‘王五‘);

INSERT INTO tb_user(user_name,user_id) VALUES (‘小明‘,seq_test.NEXTVAL);

--删除表的主键

ALTER TABLE tb_user DROP PRIMARY KEY;

--给表添加主键

ALTER TABLE tb_user ADD CONSTRAINT pk_tb_user PRIMARY KEY (user_name);

ALTER TABLE tb_user ADD PRIMARY KEY (user_name);

--

SELECT * FROM tb_user;

--添加唯一性约束

ALTER TABLE tb_user ADD CONSTRAINT uk_tb_user UNIQUE (user_id);

--非空约束

ALTER TABLE tb_user MODIFY user_id NOT NULL;

--添加列

ALTER TABLE tb_user ADD user_grade VARCHAR2(10);

--查询

SELECT * FROM tb_user;

--填充user_grade字段

UPDATE tb_user SET user_grade=‘sk‘;

--添加非空约束:user_grade

ALTER TABLE tb_user MODIFY user_grade NOT NULL;

--创建表

CREATE TABLE tb_user1 (

user_Id  INT PRIMARY KEY,

user_name VARCHAR2(20) DEFAULT(‘小王‘)

)

--创建序列

CREATE SEQUENCE seq_test1

START WITH 1

INCREMENT BY 1;

--添加数据

INSERT INTO tb_user1(user_id) VALUES(seq_test1.nextval);

--DUAL 虚表

SELECT seq_test1.CURRVAL FROM dual;

SELECT * FROM tb_user1;

--外键约束

--创建经理表

CREATE TABLE tb_manager(

mgr_id INT PRIMARY KEY,--经理表的主键

mgr_name varchar2(10) NOT NULL--经理姓名

)

CREATE TABLE tb_employee(

epe_id INT PRIMARY KEY,  --雇员的主键

epe_name varchar2(10) NOT NULL, --雇员的姓名

mgr_id INT NOT NULL  --所属经理的id

)

--外键

ALTER TABLE tb_employee ADD CONSTRAINT fk_epe FOREIGN KEY (mgr_id)

REFERENCES tb_manager (mgr_id);

SELECT * FROM tb_manager;

SELECT * FROM tb_employee;

--向经理表添加记录

INSERT INTO tb_manager values(1,‘老兵‘);

--向雇员表添加记录

INSERT INTO tb_employee VALUES(seq_test1.nextval,‘小兵‘,1);

CREATE TABLE tb_employee2(

epe_id INT PRIMARY KEY,  --雇员的主键

epe_name varchar2(10) NOT NULL, --雇员的姓名

mgr_id INT  --所属经理的id

)

--外键

ALTER TABLE tb_employee2 ADD CONSTRAINT fk_epe2 FOREIGN KEY (mgr_id)

REFERENCES tb_manager (mgr_id);

INSERT INTO tb_employee2(epe_id,epe_name) VALUES(seq_test1.nextval,‘小兵‘);

COMMIT;

SELECT * FROM tb_employee2;

--外键在添加记录的时候,可以为空

SELECT * FROM tb_user1;

DELETE FROM tb_user1;

--check约束

ALTER TABLE tb_user1

ADD CONSTRAINT ck_tb_user1

CHECK(user_id>10);

INSERT INTO tb_user1 VALUES(11,‘小王‘);

SELECT * FROM tb_user1;

COMMIT;

--数学函数

--abs取绝对值

SELECT abs(-10) FROM dual;

--ceil 向上取整

SELECT ceil(-3.1) FROM dual;

--floor 向下取整

SELECT floor(-3.1) FROM dual;

--power 幂次方

SELECT power(3,2) FROM dual;

--round四舍五入

SELECT round(2.4) FROM dual;

--sqrt开方

SELECT sqrt(2) FROM dual;

--trunc数据截断

SELECT trunc(15.79,1) FROM dual;

SELECT trunc(15.79,0) FROM dual;

SELECT trunc(15.79,-1) FROM dual;

SELECT trunc(15.79,-2) FROM dual;

--向第一个参数表示要截取的数字,第二个参数,表示从第几位截取

--当第二个参数为正数的时候,表示保留几位小数

--当第二个参数为负数的时候,表示去掉几位整数部分

--相当于一把小刀,向右数几位砍掉,负数表示向左移动几位砍掉,0的时候表示砍掉小数部分

--mod整数取余操作

SELECT mod(10,3) FROM dual;

SELECT mod(10,3) "MOD" FROM dual;

--转换函数

--TOCHAR

SELECT to_char(SYSDATE,‘YYYY-MM-DD HH24:MI:SS‘) FROM DUAL;

--TO_DATE函数 将字符转换为时间格式数据

SELECT to_DATE(‘2014-12-10 17:21:47‘,‘YYYY-MM-DD HH24:MI:SS‘) FROM DUAL;

--TO_NUMBER

SELECT ‘3‘ + ‘1‘ FROM dual;

SELECT to_number(‘123456‘) - 23456 FROM dual;

--TO_TIMESTAMP

SELECT TO_TIMESTAMP(‘2013-12-2 12:22:32‘,‘YYYY-MM-DD HH24:MI:SS‘) FROM DUAL;

SELECT TO_DATE(‘2013-12-2 12:22:32‘,‘YYYY-MM-DD HH24:MI:SS‘) FROM DUAL;

--TO_TIMESTAMP_TZ

SELECT TO_TIMESTAMP_TZ(‘2013-12-2 12:22:32 8:00‘,‘YYYY-MM-DD HH24:MI:SS TZH:TZM‘) FROM DUAL;

--SYSDATE获取Oracle系统当前时间

SELECT SYSDATE FROM dual;

--extract提取日期中指定单位的数值

SELECT extract (MONTH FROM SYSDATE) FROM dual;

SELECT extract (YEAR FROM SYSDATE) FROM dual;

SELECT extract (DAY FROM SYSDATE) FROM dual;

SELECT extract (HOUR FROM to_timestamp(‘2012-2-12 23:32:21‘,‘YYYY-MM-DD HH24:MI:SS‘)) FROM dual;

SELECT extract (minute  FROM to_timestamp(‘2012-2-12 23:32:21‘,‘YYYY-MM-DD HH24:MI:SS‘)) FROM dual;

--Months_between

SELECT Months_between(

to_date(‘2013-3-12 23:32:21‘,‘YYYY-MM-DD HH24:MI:SS‘),

to_date(‘2014-12-12 23:32:21‘,‘YYYY-MM-DD HH24:MI:SS‘)

)FROM dual;

--add_months 添加月份

SELECT add_months(

to_date(‘2013-3-12 23:32:21‘,‘YYYY-MM-DD HH24:MI:SS‘),

10

)FROM dual;

--next_day 下一个星期数

SELECT next_day(

‘2013-3-12‘,‘YYYY-MM-DD‘

)FROM dual;

--round 对日期四舍五入

SELECT round(SYSDATE),SYSDATE FROM dual;

SELECT round(to_date(‘2013-3-12 23:32:21‘,‘YYYY-MM-DD HH24:MI:SS‘)),

to_date(‘2013-3-12 23:32:21‘,‘YYYY-MM-DD HH24:MI:SS‘)

FROM dual;

--last_day 当月的最后一天

SELECT last_day(

SYSDATE

)FROM dual;

--teunc 获取待定时间

SELECT trunc(to_date(‘2013-3-12‘,‘YYYY-MM-DD‘),‘day‘) FROM dual;

SELECT trunc(to_date(‘2013-3-12‘,‘YYYY-MM-DD‘),‘month‘) FROM dual;

SELECT trunc(to_date(‘2013-3-12‘,‘YYYY-MM-DD‘),‘year‘) FROM dual;

--UPPER转化成大写

SELECT UPPER(‘sdsda‘) FROM dual;

--LOWER转换成小写

SELECT LOWER(‘SDSDA‘) FROM dual;

--INITCAP首字母大写

SELECT INITCAP(‘wqeqe‘) FROM dual;

--CONCAT 字符串连接

SELECT concat(‘wqeqe‘,‘asda‘) FROM dual;

--LENGTH获取字符数

SELECT LENGTH(‘wqeqeasda‘) FROM dual;

--lpad左填充

SELECT lpad(‘qweq‘,5,‘fgrty‘) FROM dual;

--rpad右填充

SELECT rpad(‘qweq‘,5,‘fgrty‘) FROM dual;

--ltrim去除左空格

SELECT ltrim(‘  qweq‘) FROM dual;

--RTRIM去除右空格

SELECT RTRIM(‘qweq   ‘) FROM dual;

--INSTR获取查询字符串的索引

SELECT INSTR(‘CORPORATE FLOOR‘,‘OR‘, 3, 2)

"Instring" FROM DUAL;

SELECT INSTR(‘ZXCVBNM‘,‘M‘, 1, 1)

"Instring" FROM DUAL;

--SUBSTR截取字符串

SELECT SUBSTR(‘ABCDEFG‘,3,4) "Substring"

FROM DUAL;/*从第三个开始截取一共截取4个*/

--REPLACE替换字符串

SELECT REPLACE(‘JACK and JUE‘,‘J‘,‘BL‘) "Changes"

FROM DUAL;

/*把J替换成BL*/

--LOOP循环

DECLARE

myindex INT:=0;

BEGIN

LOOP

--输出结果到控制台,字符串拼接使用||,也可使用concat函数

dbms_output.put_line(‘myindex = ‘ || myindex);

-- dbms_output.put_line(concat());

myindex := myindex + 1;

IF myindex > 10 THEN

EXIT;

END IF;

END LOOP;

END;

--while循环

DECLARE

myindex INT :=0;

BEGIN

WHILE myindex < 10

LOOP

dbms_output.put_line(concat(‘myindex = ‘,myindex));

myindex :=myindex + 1;

END LOOP;

END;

--自增序列

CREATE SEQUENCE

START WITH 1

INCREMENT BY 1;

--for loop 循环

BEGIN

FOR i IN 0..10

LOOP

dbms_output.put_line(‘index = ‘||i);

END LOOP;

END;

--反转reverse

BEGIN

FOR i IN REVERSE 0..10

LOOP

dbms_output.put_line(‘index = ‘||i);

END LOOP;

END;

--动态sql语句

CREATE TABLE tb_test(

t_id INT PRIMARY KEY,

t_name varchar2(10)

)

DECLARE

mysql VARCHAR2(500);

mydate DATE;

BEGIN

EXECUTE IMMEDIATE ‘select sysdate from dual‘ INTO mydate;

dbms_output.put_line(to_char(mydate,‘YYYY-MM-DD‘));

END;

DECLARE

mysql VARCHAR2(500) : =‘‘;

mytext VARCHAR2(10) := ‘小名的名字‘;

BEGIN

EXECUTE IMMEDIATE ‘insert into tb_test values(3,:x)‘ USING ‘小明‘;

END;

DECLARE

mysql VARCHAR2(500) :=‘insert into tb_test(t_id,t_name) values(3,:x)‘;

mytext VARCHAR2(10) := ‘小明‘;

BEGIN

EXECUTE IMMEDIATE mysql USING mytext;

END;

SELECT * FROM tb_test;

--给tb_test创建一个序列,用来生成主键的值

CREATE SEQUENCE seq_123

START WITH 5

INCREMENT BY 1;

--添加列

ALTER TABLE tb_test ADD t_mony VARCHAR2(50);

DECLARE

mysql VARCHAR2(500) :=‘insert into tb_test values(:n,:x,:y)‘;

myname VARCHAR2(10) := ‘李四‘;

mydesc VARCHAR2(100) :=‘这是李四的描述‘;

myindex INT;

BEGIN

SELECT seq_123.NEXTVAL INTO myindex FROM dual;

EXECUTE IMMEDIATE mysql USING myindex,myname,mydesc;

END;

--异常的处理

DECLARE

var1 INT :=87;

var2 INT :=0;

BEGIN

var1 := var1/var2;

dbms_output.put_line(‘已经执行了,‘);

--异常处理语句

EXCEPTION

--系统定义异常,zero_divide

WHEN zero_divide THEN

dbms_output.put_line(‘不能被0除,异常‘);

END;

--自定义异常

BEGIN

raise_application_error(-20001,‘我测试用的自定义异常‘);

END;

SELECT * FROM tb_user;

SELECT * FROM scott.emp;

SELECT * FROM emp;

CREATE TABLE emp AS SELECT * FROM scott.emp;

CREATE TABLE dept AS SELECT * FROM scott.dept;

--游标的使用

DECLARE

CURSOR mycur IS SELECT * FROM emp;

myrow emp%ROWTYPE;

BEGIN

OPEN mycur;

LOOP

FETCH mycur INTO myrow;

IF myrow.sal < 2000 THEN

IF myrow.sal + 500 > 2000 THEN

UPDATE emp SET sal =2000 WHERE empno = myrow.empno;

ELSE

UPDATE emp SET sal = myrow.sal + 500 WHERE empno=myrow.empno;

END IF;

END IF;

IF mycur%NOTFOUND THEN

EXIT;

END IF;

END LOOP;

CLOSE mycur;

COMMIT;

END;

--

DECLARE

myvar INT := &mynumber;

mystr varchar2(50) := &mytext;

BEGIN

dbms_output.put_line(mystr||‘=‘||myvar);

END;

--计算器--

DECLARE

myvar INT:=&mynumber;

mystr varchar2(50):=&mytext;

myvar1 INT:=&mynum;

mysum INT;

myjian INT;

mycheng INT;

mychu INT;

BEGIN

mysum:=myvar+myvar1;

myjian:=myvar-myvar1;

mycheng:=myvar*myvar1;

mychu:=myvar/myvar1;

IF mystr=‘+‘ THEN

dbms_output.put_line(mysum||‘=‘||myvar||‘+‘||myvar1);

ELSIF mystr=‘-‘ THEN

dbms_output.put_line(myjian||‘=‘||myvar||‘-‘||myvar1);

ELSIF mystr=‘*‘ THEN

dbms_output.put_line(mycheng||‘=‘||myvar||‘*‘||myvar1);

ELSIF mystr=‘/‘ THEN

dbms_output.put_line(mychu||‘=‘||myvar||‘/‘||myvar1);

END IF;

--  dbms_output.put_line(‘结果=‘||mysum);

END;

CREATE TABLE dept AS SELECT * FROM scott.dept;

SELECT * FROM dept;

DECLARE

TYPE MyDept IS RECORD (myDeptno dept.deptno%TYPE, myDeptName dept.dname%type);

v_myDept MyDept;

BEGIN

SELECT deptno,dname INTO v_myDept FROM dept WHERE deptno=10;

dbms_output.put_line(‘部门编号:‘||v_myDept.myDeptno||‘----‘||‘部门名称:‘||v_myDept.myDeptName);

END;

SELECT * FROM dept;

----savepoint的使用,rollback的使用

DECLARE

myrow dept%ROWTYPE;

BEGIN

SAVEPOINT x;--设置回滚点

UPDATE dept SET dname=‘IT‘ WHERE deptno=20;

SELECT * INTO myrow FROM dept WHERE deptno=20;

dbms_output.put_line(myrow.deptno||‘--‘||myrow.dname||‘--‘||myrow.loc);

dbms_output.put_line(‘update已经被执行‘);

ROLLBACK TO x;--事务回滚到x点

--也可以直接回滚;

--ROLLBACK;

dbms_output.put_line(‘回滚到x点‘);

COMMIT;

END;

COMMIT;

DECLARE

mynum INT;

mydname varchar2(14);

BEGIN

SAVEPOINT x;

UPDATE dept SET dname=‘IT‘ WHERE deptno=20;

SELECT dname INTO mydname FROM dept WHERE deptno=20;

dbms_output.put_line(‘update之后,提交事务之前:dname=‘||mydname);

mynum :=10/0;

COMMIT;

dbms_output.put_line(‘进行顺利,已经提交‘);

EXCEPTION

WHEN zero_divide THEN

dbms_output.put_line(‘发生异常,回滚‘);

ROLLBACK TO x;

COMMIT;

SELECT dname INTO mydname FROM dept WHERE deptno=20;

dbms_output.put_line(‘rollback之后:dname=‘||mydname);

END;

CREATE TABLE myacount(

acc_id INT PRIMARY KEY,

owner_name varchar2(50),

balance NUMBER (10,3)

)

INSERT INTO myacount VALUES(1,‘张三‘,1000.00);

INSERT INTO myacount VALUES(2,‘李四‘,2000.00);

SELECT * FROM myacount;

DECLARE

myindex INT :=&myindex;

mynum INT;

BEGIN

SAVEPOINT x1;

UPDATE myacount SET balance=balance-50 WHERE acc_id=1;

UPDATE myacount SET balance=balance+50 WHERE acc_id=2;

IF myindex=1 THEN

mynum :=10/0;

END IF;

COMMIT;

EXCEPTION

WHEN zero_divide THEN

dbms_output.put_line(‘发生异常,事务回滚‘);

ROLLBACK TO x1;

COMMIT;

END;

--存储过程

CREATE OR REPLACE PROCEDURE pro_test

AS

BEGIN

dbms_output.put_line(‘此存储过程已执行完毕!‘);

END;

--存储过程调用方法一

CALL pro_test();

--存储过程调用方法二 在pl/sql语句块中调用

BEGIN

pro_test();

END;

--带参数的存储过程

CREATE OR REPLACE PROCEDURE pro_test_params(v_num1 IN NUMBER,v_str IN varchar2,v_return OUT varchar2)

AS

BEGIN

v_return :=(v_num1+1)||v_str;

dbms_output.put_line(‘v_return‘||v_return);

END;

--带输入输出参数的调用

DECLARE

v_display VARCHAR(100);

BEGIN

pro_test_params(9,‘结构‘,v_display);

dbms_output.put_line(‘v_display=‘||v_display);

END;

--创建一个带参数的存储过程,输入参数同事又是输出参数

--第一个参数为number,输入参数.第二个为varchar2类型的,是输入输出参数

--在参数中,就写varchar2,number,不需要指定长度等

CREATE OR REPLACE PROCEDURE pro_test_params_inout(v_num IN NUMBER,v_str IN OUT varchar2)

AS

--此处用来声明变量

BEGIN

v_str :=(v_num+1)||v_str;

END;

--CALL pro_test_params_inout(99,);

--一个ASCII字符在Oracle中占用一个字节,一个汉字在Oracle中占据两个字节

DECLARE

v_str VARCHAR2(20);

BEGIN

v_str :=‘我是字符串‘;

pro_test_params_inout(99,v_str);

-- pro_test_params_inout(99);  报错:参数个数

dbms_output.put_line(v_str);

END;

------------------函数的创建---------------------

CREATE OR REPLACE FUNCTION func_test(v_num NUMBER,v_str varchar2)

--声明返回值类型

RETURN VARCHAR2

AS

v_return varchar2(100);

BEGIN

v_return :=v_str||(v_num+1);

--返回 返回值

RETURN v_return;

END;

SELECT func_test(99,‘我是字符串‘) FROM dual;

--模拟字符串拼接函数 concat

SELECT concat(‘aaa‘,‘ccc‘) FROM dual;

--func_concat

CREATE OR REPLACE FUNCTION func_concat(v_str1 VARCHAR2,v_str2 VARCHAR2)

--声明返回值类型

RETURN VARCHAR2

AS

v_return varchar2(50);

BEGIN

--给返回变量赋值

v_return := v_str1||v_str2;

--将处理加过返回

RETURN v_return;

END;

SELECT func_concat(‘a‘,‘b‘) FROM dual;

SELECT * FROM dept;

SELECT * FROM emp;

--游标在存储过程和函数中的使用

--存储过程中的使用

--根据部门的名称查找部门所有的员工

--对于存储过程来讲,如果参数不写明in或者out,系统默认为输入参数

--输出参数为有表的时候,类型是:sys_refcursor

CREATE OR REPLACE PROCEDURE pro_allEmps(v_deptname IN VARCHAR2,v_emps OUT SYS_REFCURSOR)

AS

v_deptno INT;

BEGIN

--根据用户输入的部门查询对应的部门标号

SELECT deptno INTO v_deptno FROM dept WHERE dept.dname=v_deptname;

--使用游标接收查询到的结果集

OPEN v_emps FOR SELECT * FROM emp WHERE emp.deptno=v_deptno;

END;

DECLARE

--声明一个属性行变量,用来接收遍历游标的时候,去除的一条结果

v_temp emp%ROWTYPE;

--声明一个sys_refcursor类型的游标来接收过程的输出参数

v_cursor SYS_REFCURSOR;

BEGIN

--使用声明的游标作为参数,接收存储过程的输出结果:v_cursor

pro_allEmps(‘RESEARCH‘,v_cursor);

LOOP

FETCH v_cursor INTO v_temp;

EXIT WHEN v_cursor%NOTFOUND;

dbms_output.put_line(v_temp.empno||‘-‘||v_temp.ename||‘-‘||v_temp.job||‘-‘||v_temp.sal||‘-‘||v_temp.deptno);

END LOOP;

END;

--在函数中使用游标

--根据部门名称查找该部门的所有员工

CREATE OR REPLACE FUNCTION func_allemps(v_deptname varchar2)

RETURN SYS_REFCURSOR

AS

v_cursor SYS_REFCURSOR;

v_deptno INT;

BEGIN

SELECT deptno INTO v_deptno FROM dept WHERE dept.dname=v_deptname;

OPEN v_cursor FOR SELECT * FROM emp WHERE emp.deptno=v_deptno;

RETURN v_cursor;

END;

SELECT func_allemps(‘sales‘) FROM dual;

CREATE TABLE emp AS SELECT * FROM scott.emp;

ALTER USER scott ACCOUNT UNLOCK;

ALTER USER scott ACCOUNT LOCK;

DECLARE

--声明一个游标用来接收函数的返回结果

v_cursorme SYS_REFCURSOR;

--声明一个属性行变量来接收游标返回的每一条记录

v_temprow emp%ROWTYPE;

BEGIN

--函数的调用,由于函数是有返回值的,所以我们使用声明的游标接收

v_cursorme := func_allemps(‘SALES‘);

LOOP

FETCH v_cursorme INTO v_temprow;

EXIT WHEN v_cursorme%NOTFOUND;

dbms_output.put_line(‘员工姓名‘||v_temprow.ename);

END LOOP;

END;

------触发器的操作

CREATE OR REPLACE TRIGGER tri_before_test_emp

BEFORE INSERT ON emp FOR EACH ROW

BEGIN

dbms_output.put_line(‘正在向emp表插入数据‘);

END;

SELECT * FROM emp;

BEGIN

INSERT INTO emp VALUES(104,‘王五‘,‘会计‘,0,SYSDATE,100,0,10);

COMMIT;

END;

CREATE OR REPLACE TRIGGER tri_before_test_emp

BEFORE INSERT ON emp FOR EACH ROW

BEGIN

dbms_output.put_line(‘正在向emp表插入数据‘);

dbms_output.put_line(‘新值:‘||:NEW.empno||‘--‘||:new.ename||‘--‘||:NEW.job||‘--‘||:new.mgr||‘--‘||:NEW.hiredate);

END;

---对于after的一个trigger

CREATE OR REPLACE TRIGGER tri_after_test_emp

BEFORE INSERT ON emp FOR EACH ROW

BEGIN

dbms_output.put_line(‘已经向emp表插入数据‘);

dbms_output.put_line(‘新值:‘||:NEW.empno||‘--‘||:new.ename||‘--‘||:NEW.job||‘--‘||:new.mgr||‘--‘||:NEW.hiredate);

END;

SELECT * FROM emp;

DELETE FROM emp WHERE empno=104;

--设置主键

ALTER TABLE emp ADD CONSTRAINT pk_emp PRIMARY KEY (empno);

--在插入数据的时候,生成主键的值

CREATE OR REPLACE TRIGGER tri_before_test_emp

BEFORE INSERT ON emp FOR EACH ROW

DECLARE

myindex INT;

BEGIN

dbms_output.put_line(‘正在向emp表插入数据‘);

SELECT MAX(empno)INTO myindex FROM emp;

:NEW.empno:=myindex +1;

END;

--执行插入数据的sql语句

BEGIN

INSERT INTO emp VALUES(1,‘测试‘,‘测试人‘,0,SYSDATE,1000,0,10);

--提交数据

COMMIT;

END;

SELECT MAX(empno) FROM emp;

SELECT *FROM emp ORDER BY empno DESC;

--将insert换为:update delete

--update

CREATE OR REPLACE TRIGGER tri_before_test_emp

BEFORE UPDATE ON emp FOR EACH ROW

BEGIN

dbms_output.put_line(‘将要执行的update操作‘);

dbms_output.put_line(‘新值为:‘||‘--‘||:new.ename||‘--‘||:NEW.job||‘--‘||:new.mgr||‘--‘||:NEW.sal);

dbms_output.put_line(‘旧值为:‘||‘--‘||:OLD.ename||‘--‘||:OLD.job||‘--‘||:OLD.mgr||‘--‘||:OLD.sal);

END;

SELECT * FROM emp;

BEGIN

UPDATE emp SET ename=‘小李‘,job=‘测试人‘,mgr=1000,sal=50 WHERE empno=100;

COMMIT;

END;

--after update

CREATE OR REPLACE TRIGGER tri_before_test_emp

BEFORE UPDATE ON emp FOR EACH ROW

BEGIN

dbms_output.put_line(‘己执行的update操作‘);

dbms_output.put_line(‘新值为:‘||‘--‘||:new.ename||‘--‘||:NEW.job||‘--‘||:new.mgr||‘--‘||:NEW.sal);

dbms_output.put_line(‘旧值为:‘||‘--‘||:OLD.ename||‘--‘||:OLD.job||‘--‘||:OLD.mgr||‘--‘||:OLD.sal);

END;

SELECT * FROM emp;

BEGIN

UPDATE emp SET ename=‘小张‘,job=‘经理人‘,mgr=2000,sal=520 WHERE empno=102;

COMMIT;

END;

--Oracle的分页

select t1.*,rownum rn from (select * from emp) t1

--取出前5条

select t1.*,rownum rn from (select * from emp) t1 where rownum<=5;

--取出10条之内大于等于6的

select * from(select t1.*,rownum rn from (select * from emp) t1 where rownum<=10) where rn>=6;

--开发一个包

--创建一个包,在该包中,我定义类型test_cursor,是个游标

create or replace package tespackage as

type test_cursor is ref cursor;

end tespackage;

create package sp_package is

procedure update_sal(name varchar2,newsal number);

function annual_income(name varchar2) return number;

end;

---创建包体

create  package body sp_package is

procedure update_sal(name varchar2,newsal number)

is

begin

update emp set sal = newsal where ename=name;

end;

function annual_income(name varchar2)

return number is

annual_salary number;

begin

select sal*12+nvl(comm,0) into annual_salary from emp

where ename=name;

return annual_salary;

end;

end;

--开始编写分页的过程

create or replace procedure fenye

(tableName in varchar2,

Pagesize in number,  --一页记录数

pageNow in number,

myrows out number,  --总记录数

myPageCount out number,  --总页数

p_cursor out tespackage.test_cursor  --返回记录集

) is

--定义部分

--定义sql语句  字符串

v_sql varchar2(1000);

--定义两个整数

v_begin number:= (pageNow-1)*Pagesize+1;

v_end number:=pageNow*Pagesize;

begin

--执行部分

v_sql:=‘select * from select * from(select t1.*,rownum rn from (select * from ‘|| tableName

||‘) t1 where rownum<=‘||v_end||‘) where rn>=‘||v_begin;

--把游标和sql关联

open p_cursor for v_sql;

--计算myrows和myPageCount

--组织一个sql

v_sql:=‘select count(*) from ‘||tableName;

--执行sql,并把返回的值,赋给myrows

execute immediate v_sql into myrows;

--计算myPageCount

if mod(myrows,Pagesize)=0 then

myPagecount := myrows/Pagesize;

else

myPageCount := myrows/Pagesize+1;

end if;

--关闭游标

--close p_cursor;

end;

时间: 2024-10-28 21:49:27

Oracle学习大全的相关文章

oracle 学习

删除用户,创建用户命令 drop user goda cascade:删除用户及其下所有对象,包括表 CREATE USER qdcenter     IDENTIFIED BY qdcenter     DEFAULT TABLESPACE data1     TEMPORARY TABLESPACE temp1     QUOTA unlimited ON data1     QUOTA unlimited ON temp1     QUOTA unlimited ON idx1     Q

Oracle学习-Power Designer、visio 2003、Oracle sql developer、OEM、expdp

Oracle的体系太庞大了.对于刚開始学习的人来说,难免有些无从下手的感觉. 经过一学期的学习对Oracle学习有了一些深入的了解,由于之前学习过Oracle的一些主要的知识.所以学习起来上手比較快一点. 这次Oracle项目让我又一次对Oracle的基本知识进行了运用,而且对软件project也有了新的认识.从需求分析.概念结构设计.逻辑结构设计.物理结构设计.数据库的建立和測试.数据库执行和维护. 尽管说数据库设计的周期比較长将近用了三周左右,可是每一步做的还是非常认真的对待.我选择的是舰队

Oracle学习系列4

Oracle学习系列4 ************************************************************************************ 数据库更新操作: 分类: 查询操作:select 更新操作:insert ,update , delete 为了保存原始的emp表的信息,在进行增删改之前备份词表: create table emp_bak as select * from emp ; //将表emp结构和数据完整的复制出来 添加数据:

Oracle学习系列3

Oracle学习系列3 ************************************************************************************ 多表查询: 1,SQL1999语法对多表查询的支持 2,分组统计及统计函数的使用 3,子查询,并结合多表查询,分组统计做复杂查询 4,数据库的更新操作 5,事务处理和数据库死锁 ****************************************************************

oracle学习--循环语句

oracle学习--循环语句  loop循环: create or replace procedure pro_test_loop is i number; begin i:=0; loop i:=i+1; dbms_output.put_line(i); if i>5 then exit; end if; end loop; end pro_test_loop; while循环: create or replace procedure pro_test_while is i number; b

Oracle 学习笔记 17 -- 异常处理(PL/SQL)

程序在执行过程中出现异常是正常的,在程序的编写过程中出现异常也是不可避免的.但是要有相应的异常处理的机 制,来保证程序的正常执行.PL/SQL程序执行过程中出现的错误,称为异常.一个优秀的程序都应该能够正确处理 各种出错的情况,并尽可能的从错误中恢复.PL/SQL提供了异常处理机制. 概念: 异常处理(exception)是用来处理正常执行过程中未预料的事件,程序块的异常处理定义的错误和自定义的错误, 由于PL/SQL程序块一旦产生异常而没有指出如何处理时,程序就会异常的终止. 有三种类型的错误

Oracle学习系列5

Oracle学习系列5 ************************************************************************************ 1,掌握表的建立与删除 了解Oracle中的主要数据类型 2,约束的分类和使用 3,表的关联:交,并,补 4,掌握ROWNUM伪列的作用 5,掌握序列的使用 6,掌握视图的作用 7,了解同义词,用户管理,权限分配与撤销,数据库的备份 ------------------------------------

oracle学习笔记之用户管理-3

用户权限机制 1.不同用户表权限的赋予 grant select on scott.emp to software; ---当前登录用户为表所有者,则表名前不用指定所属用户 2.用software登录后 select * from scott.emp; ---software才有权限查询到scott的emp表 方案(schema) 当用户创建好后,如果该用户创建了一个数据对象(如表),此时dbms会创建一个对应的方案与改用户对应,并且该方案的名称和用户名称一致. system与scott都拥有自

【Oracle学习笔记】

内容主要包含: (1)三种循环及其简化 (2)游标的使用 (3)异常处理 (4)存储过程 (5)存储函数 (6)触发器 (7)其他pl/sql操作 ---------------loop循环定义变量-------------------- declare cursor c1 is select * from emp;# rec emp%rowtype;# i numeber:=1; # v_count number;begin# select count(*) into v_count from