文章目录
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;