搜尋
首頁資料庫mysql教程Oracle学习大全
Oracle学习大全Jun 07, 2016 pm 02:51 PM
oraclesystem創建大全學習使用者空間

--在system表空间创建用户 --其中,jinanuser是用户名 jinanuser是密码 CREATE USER jinanuser IDENTIFIED BY jinanuser; --将DBA角色赋给jinanuser这个用户 GRANT DBA TO jinanuser; --撤销jinanuser用户的DBA角色 REVOKE DBA FROM jinanuser; --在自己创建

--在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      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              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 --取出10条之内大于等于6的
select * from(select t1.*,rownum rn from (select * from emp) t1 where rownum=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_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;




陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
oracle怎么查询所有索引oracle怎么查询所有索引May 13, 2022 pm 05:23 PM

方法:1、利用“select*from user_indexes where table_name=表名”语句查询表中索引;2、利用“select*from all_indexes where table_name=表名”语句查询所有索引。

什么是oracle asm什么是oracle asmApr 18, 2022 pm 04:16 PM

oracle asm指的是“自动存储管理”,是一种卷管理器,可自动管理磁盘组并提供有效的数据冗余功能;它是做为单独的Oracle实例实施和部署。asm的优势:1、配置简单、可最大化推动数据库合并的存储资源利用;2、支持BIGFILE文件等。

Oracle怎么查询端口号Oracle怎么查询端口号May 13, 2022 am 10:10 AM

在Oracle中,可利用lsnrctl命令查询端口号,该命令是Oracle的监听命令;在启动、关闭或重启oracle监听器之前可使用该命令检查oracle监听器的状态,语法为“lsnrctl status”,结果PORT后的内容就是端口号。

oracle全角怎么转半角oracle全角怎么转半角May 13, 2022 pm 03:21 PM

在oracle中,可以利用“TO_SINGLE_BYTE(String)”将全角转换为半角;“TO_SINGLE_BYTE”函数可以将参数中所有多字节字符都替换为等价的单字节字符,只有当数据库字符集同时包含多字节和单字节字符的时候有效。

oracle查询怎么不区分大小写oracle查询怎么不区分大小写May 10, 2022 pm 05:45 PM

方法:1、利用“LOWER(字段值)”将字段转为小写,或者利用“UPPER(字段值)”将字段转为大写;2、利用“REGEXP_LIKE(字符串,正则表达式,'i')”,当参数设置为“i”时,说明进行匹配不区分大小写。

oracle怎么删除sequenceoracle怎么删除sequenceMay 13, 2022 pm 03:35 PM

在oracle中,可以利用“drop sequence sequence名”来删除sequence;sequence是自动增加数字序列的意思,也就是序列号,序列号自动增加不能重置,因此需要利用drop sequence语句来删除序列。

oracle怎么查询数据类型oracle怎么查询数据类型May 13, 2022 pm 04:19 PM

在oracle中,可以利用“select ... From all_tab_columns where table_name=upper('表名') AND owner=upper('数据库登录用户名');”语句查询数据库表的数据类型。

Oracle怎么修改sessionOracle怎么修改sessionMay 13, 2022 pm 05:06 PM

方法:1、利用“alter system set sessions=修改后的数值 scope=spfile”语句修改session参数;2、修改参数之后利用“shutdown immediate – startup”语句重启服务器即可生效。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),