关于Oracle的使用
授权:
切换到system用户 : conn system/123456
grant create view to scott;
1.创建视图
create view emp_view as
select empno,ename,job from emp;
2.查询视图
select * from emp_view;
3.向视图中插入一条记录
insert into emp_view values(1234,'李白','诗人');
4.删除视图中的一条记录
deletefrom emp_view where empno=1234;
5.修改视图中的一条记录
update emp_view set ename='李太白' whereempno=1234;
6.删除视图
drop view emp_view;
创建一个复杂的视图(封装了多个基本表):
create or replace view emp_view as
select ename,job,dname from emp inner joindept
onemp.deptno=dept.deptno and emp.ename='SCOTT';
创建索引(B树索引):
create index emp_sal_index on emp(sal);
创建student表:
create table student(
stuid int primary key,
stuname varchar2(20),
score number
);
创建序列:
create sequence myseq;
create sequence good_sequence
start with 100
increment by 20
maxvalue 2000;
插入记录:
insert into student values(myseq.nextval,'杜甫',95);
insert into studentvalues(good_sequence.nextval,'白居易',85.5);
1.使用if...then语句比较两个字符串变量的长度,并输出比较结果。
declare
var_str1 varchar2(20);
var_str2 varchar2(20);
begin
var_str1:='hello';
var_str2:='Oracle is good';
if length(var_str1) dbms_output.put_line('字符串"'||var_str1||'"的长度小于"'||var_str2||'"'); end if; end; / 2.通过if..else语句实现只有年龄大于等于65岁,才可以申请退休,否则程序会提示不可以 申请退休。 declare age number:=15; begin if age>=65 then dbms_output.put_line('您可以申请退休'); else dbms_output.put_line('年龄不到,不能申请退休!'); end if; end; / 3.指定一个月份数值,然后使用if...then..elsif语句判断它所属的季节,并 输出季节信息,代码如下。 declare month int:=4; begin if month>=1 and month<=3 then dbms_output.put_line('春天'); elsif month>=4 and month<=6 then dbms_output.put_line('夏日炎炎'); elsif month>=7 and month<=9 then dbms_output.put_line('秋天'); else dbms_output.put_line('冬天很冷'); end if; end; / 4.使用loop语句求前100个自然数的和,并输出到屏幕。 declare iint:=0; sum_i int:=0; begin loop i:=i+1; sum_i:=sum_i+i; exit when i=100; end loop; dbms_output.put_line('前100个自然数的和是:'||sum_i); end; / 5.使用while语句求前100个自然数的和,并输出到屏幕。 declare iint:=0; sum_i int:=0; begin while i<=99 loop i:=i+1; sum_i:=sum_i+i; end loop; dbms_output.put_line('前100个自然数的和是:'||sum_i); end; / 6.使用for语句求前100个自然数中偶数之和,并输出到屏幕。 declare sum_i int:=0; begin for i in 1..100 loop if mod(i,2)=0 then sum_i:=i+sum_i; end if; end loop; dbms_output.put_line('前100个自然数的和是:'||sum_i); end; / 7.指定一个季度数值,然后使用case语句判断它所包含的月份信息并输出。 declare season varchar2(20):='夏天'; begin case season when '春天' then dbms_output.put_line('包含1、2、3月份'); when '夏天' then dbms_output.put_line('包含4、5、6月份'); when '秋天' then dbms_output.put_line('包含7、8、9月份'); when '冬天' then dbms_output.put_line('包含10、11、12月份'); else dbms_output.put_line('未知季节!'); end case; end; / 1.在SCOTT模式下,使用%type类型的变量输出emp表中编号为7369的员工姓名和职务 信息(考察%type类型) setserveroutput on declare var_ename emp.ename%type; var_job emp.job%type; begin select ename,job into var_ename,var_job from emp where empno=7369; dbms_output.put_line('编号为7369的员工姓名为:'||var_ename||',职位为'||var_job); end; / 2.声明一个记录类型emp_type,然后使用该类型的变量存储emp表中编号为7369 员工的姓名、职务、工资信息,并输出这条记录信息。(考察record类型) declare type emp_type is record( var_ename emp.ename%type, var_job emp.job%type, var_sal emp.sal%type ); emp_info emp_type; begin select ename,job,sal into emp_info from emp where empno=7369; dbms_output.put_line('编号为7369员工姓名:' ||emp_info.var_ename||',职务:'||emp_info.var_job|| '工资是:'||emp_info.var_sal); end; / 3.声明一个%rowtype类型的变量rowVar_emp,然后使用该变量存储emp表中的一行数据。 (考察%rowtype类型) declare rowVar_emp emp%rowtype; begin select * into rowVar_emp from emp where empno=7369; dbms_output.put_line('编号为7369的员工姓名为:'||rowVar_emp.ename|| ',雇佣日期为:'||rowVar_emp.hiredate||'工资为:'||rowVar_emp.sal); end; / 1.使用触发器监听对dept表的操作,并记录到日志表中。 建立日志表: create table dept_log( opertime date, operdesc varchar2(50) ); 创建触发器: create or replace trigger dept_trigger after insert or update or delete ondept for each row begin if inserting then insert into dept_log values(sysdate,'执行了insert操作'); elsif updating then insert into dept_log values(sysdate,'执行了update操作'); elsif deleting then insert into dept_log values(sysdate,'执行了delete操作'); end if; end; / 2.在不指定主键名称的情况下,实现student表主键自增效果。 先创建序列: create sequence my_sequ start with 1 increment by 1; create or replace trigger stu_trigger before insert onstudent for each row begin select my_sequ.nextval into :new.stuid from dual; end; / 1.使用存储过程插入dept表一条记录(无参存储过程)。 create or replace procedure dept_proc is var_dname dept.dname%type; begin var_dname:='总裁部'; insert into dept values(95,var_dname,'中国'); commit; end; / 2.使用存储过程查询指定编号的员工信息(使用了in参数)。 create or replace procedure empno_proc(var_empno in int) is type emp_record is record( var_ename emp.ename%type, var_job emp.job%type ); empinfo emp_record; begin select ename,job into empinfo from emp where empno=var_empno; dbms_output.put_line(var_empno||'工号的员工姓名是:'||empinfo.var_ename|| ',职位是:'||empinfo.var_job); end; / 3.根据员工编号查询其姓名(使用了out参数) create or replace procedure empno_proc(var_empno in int,var_ename out varchar2) is begin select ename into var_ename from emp where empno=var_empno; end; / 在PL/SQL中调用存储过程: declare var_good emp.ename%type; begin empno_proc(7369,var_good); dbms_output.put_line('查询到的姓名为:'||var_good); end; / 4.使用in out类型参数根据工号查询工资。 create or replace procedure emp_proc(var_info in out number) is begin select sal into var_info from emp where empno=var_info; end; / 在PL/SQL中调用该存储过程: declare var_emp_info number:=7369; begin emp_proc(var_emp_info); dbms_output.put_line('该工号的员工工资是:'||var_emp_info); end; / 定义一个PL/SQL代码块,计算两个整数的和与这两个整数的 差的商。 setserveroutput on declare aint:=100; bint:=200; cnumber; begin c:=(a+b)/(a-b); dbms_output.put_line(c); exception when zero_divide then dbms_output.put_line('除数不许为零!'); end;