Oracle学习指南

文章目录

      • 1.管理员进入sqlplus:
      • 2.数据库的默认管理员为两种:
      • 3.oracle创建语句发生not logged on:
      • 4.调用存储过程的两种方式及区别:
        • 1.两种方式:
        • 2.区别:
      • 5.PL/SQL基础
        • 1.编写规范
          • 注释
          • 标识符号的命名规范
        • 2.块(block)
          • 块结构示意图
        • 3.案例
          • 案例一
          • 案例二
          • 案例三
          • 案例四(函数)
          • 案例五(包)
          • 案例六
          • 案例七(记录)
          • 案例八(表)
          • 案例九(游标)
          • 案例十(条件结构)
          • 案例十一(循环结构--loop)
          • 案例十二(循环结构--while)

1.管理员进入sqlplus:

  • 运行,win键+R;
  • 输入sqlplus sys/system as sysdba;
  • 输入密码;

2.数据库的默认管理员为两种:

  • sys用户是超级用户,具有最高权限,具有sysdba角色,有create database的权限,默认密码为change_on_install;
  • system用户是管理操作员,具有sysoper角色,没有create database的权限,默认密码为manager;
  • 一般对数据库维护,使用普通用户。

3.oracle创建语句发生not logged on:

重启oracle服务

4.调用存储过程的两种方式及区别:

1.两种方式:

exec 过程名(参数名1,参数名2);
call 过程名(参数名1,参数名2);

2.区别:

1.exec是sqlplus命令,只能在sqlplus中使用;call为SQL命令,没有限制.
2.存储过程没有参数时,exec可以直接跟过程名(可以省略()),但call则必须带上().

5.PL/SQL基础

过程
函数
触发器

1.编写规范

注释
  • 单行注释: --
  • 多行注释:“/* ...*/”
标识符号的命名规范
  • 当定义变量时,建议使用v_作为前缀v_sal
  • 当定义常量时,建议使用c_作为前缀c_rate
  • 当定义游标时,建议使用_cursor作为后缀emp_cursor;
  • 当定义例外时,建议使用e_作为前缀e_error

2.块(block)

块是pl/sql的基本程序单元,编写pl/sql程序实际上就是编写pl/sql块。简单功能只要编写一个pl/sql块;复杂功能可能需要一个pl/sql块嵌套其他的pl/sql块。

块结构示意图

pl/sql块由三个部分组成:定义部分、执行部分、例外处理部分:

declear
/* 定义部分-----定义常量、变量、游标、例外、复杂数据类型*/
begin
/* 执行部分-----要执行的pl/sql语句和sql语句*/
exception
/* 例外处理部分-----处理运行的各种错误*/
end;
注:
[外链图片转存失败(img-r1jigHMB-1567328115605)(en-resource://database/7345:1)]

3.案例

案例一
set serveroutput on;--打开输出选项
begin
dbms_output.put_line('hello,world');--dbms_output为oracle所提供的包,put_line是其中的一个过程
insert into emp 
values('7369','SMITH','CLERK','7902',to_date('1980-12-17','yyyy-mm-dd'),'10.00',null,'20');
-- 需要将字段用单引号进行修饰,空字段用null
end;
案例二
declare
    v_ename varchar2(5);--定义字符串变量
begin
    select ename into v_ename from emp where empno=&no;
    dbms_output.put_line('雇员名:'||v_ename);
exception
when no_data_found then 
dbms_output.put_line('朋友你的输入有误!');
end;
案例三
create procedure sp_pro3(spName varchar2,newSal number) is 
begin
--执行部分,根据用户名去修改工资
update emp set sal= newSal where ename= spName;
end;
案例四(函数)
create function sp_fun2(spName varchar2) return
number is yearSal number(28,4);
begin
-- 执行部分
select sal*12+nvl(comm,0)*12 into yearSal from emp where ename=spName;
return yearSal;
end;
案例五(包)
create package sp_package is 
procedure update_sal(name varchar2,newsal number);
function annual_income(name varchar2) return number;
end;

– 给sp_package实现包体

create or replace 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)*12 into annual_salary from emp where ename=name;
return annual_salary;
end;
end;
案例六
declare 
c_tax_rate number(3,2):=0.3;
-- 用户名
v_ename varchar2(5);--emp.ename%type
v_sal emp.sal%type;
v_tax_sal emp.sal%type;
begin
select ename,sal into v_ename,v_sal from emp where empno=&no;
-- 计算所得税
v_tax_sal:=v_sal*c_tax_rate;
-- 输出
dbms_output.put_line('姓名是:'||v_ename||',工资:'||v_sal||',交税:'||v_tax_sal);
end;
案例七(记录)
declare
type emp_record_type is record(name emp.ename%type,salary emp.sal%type,title emp.job%type);
sp_record emp_record_type;
begin
select ename,sal,job into sp_record
from emp where empno=&no;
dbms_output.put_line('员工名:'||sp_record.name||'工资是'||sp_record.salary);
end;
案例八(表)
declare 
type sp_table_type is table of emp.ename%type index by binary_integer;
-- 定义了一个sp_table变量。这个变量的类型是sp_table_type
sp_table sp_table_type;
begin
select ename into sp_table(0) from emp where empno=&no;
dbms_output.put_line('员工名:'||sp_table(0));
end;
案例九(游标)
declare
--定义游标类型
type sp_emp_cursor is ref cursor;
-- 定义一个游标变量
test_cursor sp_emp_cursor;
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
-- 执行
-- 把test_cursor和select结合
open test_cursor for select ename,sal from emp where deptno=&no;
-- 循环取出
loop
fetch test_cursor into v_ename,v_sal;
-- 判断是否test_cursor为空
exit when test_cursor%notfound;
dbms_output.put_line(''||v_ename||'工资:'||v_sal);
end loop;
close test_cursor;
end;
案例十(条件结构)
create or replace procedure sp_pro6(spName varchar2) is
v_sal emp.sal%type;
begin
select sal into v_sal from emp where ename=;
if v_sal<2000 then
update emp set sal=sal*1.1 where ename=spName;
end if;
end;
案例十一(循环结构–loop)
create or replace procedure sp_pro7(spName varchar2) is
-- 定义
v_num number:=1;
begin 
loop
    insert into users values(v_num,spName);
    -- 判断是否要退出循环
    exit when v_num=10;
    -- 自增
    v_num:=v_num+1;
end loop;
end;
案例十二(循环结构–while)
create or replace procedure sp_pro8(spName varchar2) is
v_num number:=11;
begin 
while v_num<=20 loop
-- 执行
    insert into users values(v_num,spName);
    v_num:=v_num+1;
end loop;
end;

你可能感兴趣的:(Oracle)