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;




  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle 是一种关系型数据库管理系统,常被用于企业级应用的开发和数据管理。学习Oracle需要掌握数据库的基本概念和SQL语言,同时需要了解Oracle的特有功能和特点。 首先,对于初学者来说,可以通过查阅Oracle官方文档和教程来了解基本的数据库理论以及Oracle的安装和配置。官方文档提供了详细的说明和指导,包括数据库的架构、对象、数据类型和索引等内容。 其次,学习SQL语言是掌握Oracle的关键。SQL是结构化查询语言,用于对数据库进行增删改查操作。可以通过在线教程、书籍或者学习网站来学习SQL的基本语法和常用命令,例如SELECT、INSERT、UPDATE和DELETE等。 除了SQL,还需要学习PL/SQL(Oracle的过程式语言)。PL/SQL是Oracle数据库的编程语言,可以用于编写存储过程、触发器和函数等。学习PL/SQL可以通过官方文档和相关教程来深入理解。 另外,参加Oracle的培训课程也是一个不错的选择。Oracle官方和一些培训机构提供了各种级别的培训课程,从入门到专业水平。培训课程可以帮助学习者系统地了解Oracle的各个方面,并提供实际操作的机会。 最后,通过实践来巩固所学的知识。可以使用Oracle提供的演示数据库,或者自己搭建测试环境来练习SQL语句的编写和数据库管理的操作。 总之,学习Oracle需要系统地学习数据库理论、SQL语言和PL/SQL编程,可以通过官方文档、教程、培训课程和实践来提高自己的水平。不断的学习和实践将帮助您掌握Oracle的技术,并在企业级应用开发和数据管理中获得更好的发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值