重启oracle服务
exec 过程名(参数名1,参数名2);
call 过程名(参数名1,参数名2);
1.exec是sqlplus命令,只能在sqlplus中使用;call为SQL命令,没有限制.
2.存储过程没有参数时,exec可以直接跟过程名(可以省略()),但call则必须带上().
--
“/* ...*/”
块是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)]
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;
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;
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;