1.注释
单行注释 --
select * from emp where empno=7788; --取得员工信息
多行注释 /*...*/来划分
2.标志符号的命名规范
1).当定义变量时,建议用v_作为前缀v_sal
2).当定义常量时,建议用c_作为前缀c_rate
3).当定义游标时,建议用_cursor作为后缀emp_cursor
4).当定义例外时,建议用e_作为前缀e_error
3.块结构示意图
pl/sql块由三个部分构成:定义部分,执行部分,例外处理部分。
如下所示:
declare
/*定义部分——定义常量、变量、游标、例外、复杂数据类型*/
begin
/*执行部分——要执行的pl/sql语句和sql语句*/
exception
/*例外处理部分——处理运行的各种错误*/
end;
定义部分是从declare开始的,该部分是可选的;
执行部分是从begin开始的,该部分是必须的,至少要写null,不能不写;
例外处理部分是从exception开始的,该部分是可选的。
& 表示要接收从控制台输入的变量。
4.过程
过程用于执行特定的操作,当建立过程时,既可以指定输入参数(in),也可以指定输出参数(out),
通过在过程中使用输入参数,可以将数据传递到执行部分;
通过使用输出参数,可以将执行部分的数据传递到应用环境。
在sqlplus中可以使用create procedure命令来建立过程。
--只有输入参数的存储过程
create or replace procedure proc01(eno number) --in 输入参数 out输出参数
as
begin
update emp set sal = sal+500 where empno = eno;
---select sal into money from emp where empno=eno;
end proc01;
在oracle中调用存储过程:
第一种:call proc01(7654);
第二种:在plsql块中调用
SQL> begin
3 proc01(7654);
5 end;
6 /
–既有输入又有输出参数的存储过程
create or replace procedure proc02(eno in number,money out number) is
begin
update emp set sal=sal+1000 where empno=eno;
select sal into money from emp where empno=eno;
commit;
exception
rollback;
end proc02;
在oracle中调用存储过程:
SQL> set serveroutput on;
SQL> declare money number;
2 begin
3 proc02(7654,money);
4 dbms_output.put_line(money);
5 end;
6 /
5.JAVA中调用存储过程
Java代码
1. CallableStatement cs = con.prepareCall("{call emp_pro(?,?)}");
2. //4.给?赋值
3. cs.setString(1,"SMITH");
4. cs.setInt(2,10);
5. //5.执行
6. cs.execute();
6.函数
函数用于返回特定的数据,当建立函数时,在函数头部必须包含return子句。
而在函数体内必须包含return语句返回的数据。我们可以使用create function来建立函数,实际案例:
Sql代码
1. --编写函数 返回指定人员的年薪
2. create function annual_income(name varchar2)
3. return number is
4. annual_salary number(7, 2);
5. begin
6. select sal*12 + nvl(comm, 0) into annual_salary from emp where ename = name;
7. return annual_salary;
8. end;
在sqlplus中调用函数
Sql代码
1. SQL> var income number
2. SQL> call annual_incomec('scott') into :income; --注意:和income之间不能有空白
3. SQL> print income
同样我们可以在java程序中调用该函数 select annual_income('SCOTT') from dual;
7.包
包用于在逻辑上组合过程和函数,它由包规范和包体两部分组成。
1).我们可以使用create package命令来创建包。
Sql代码
1. --使用create package命令创建包
2. create package pkg_sal is
3. procedure update_sal(name varchar2, new_sal number);
4. function annual_income(name varchar2) return number;
5. end;
包的规范只包含了过程和函数的说明,但是没有过程和函数的实现代码。包体用于实现包规范中的过程和函数。
2).建立包体可以使用create package body命令
Sql代码
1. --使用create package body创建包体
2. create or replace package body pkg_sal is
3. procedure update_sal(name varchar2, new_sal number) is
4. begin
5. update emp set sal = new_sal where ename = name;
6. end;
7. function annual_income(name varchar2) return number is
8. income number(7, 2);
9. begin
10. select sal*12 + nvl(comm, 0) into income from emp where ename = name;
11. return income;
12. end;
13. end;
3).如何调用包的过程或是函数
当调用包的过程或是函数时,在过程和函数前需要带有包名,如果要访问其它方案的包,还需要在包名前加方案名。
调用存储过程
exec pkg_sal.update_sal('zhang',50000);
调用函数
1.plsql代码块
DECLARE
v_income number;
begin
v_income :=pkg_sal.annual_income('zhang');
DBMS_OUTPUT.PUT_LINE('年薪为:'||v_income);
end;
/
2.execute
variable v_income number
execute :v_income :=pkg_sal.annual_income('xiaoming');
结果:
PL/SQL procedure successfully completed
v_income
---------
60000
3.call
var v_income number;
call pkg_sal.annual_income('xiaoming') into :v_income;
4.select
select pkg_sal.annual_income('xiaoming') from dual;
结果:
PKG_SAL.ANNUAL_INCOME('XIAOMIN
------------------------------
60000
5.将函数作为另一个子程序的参数
execute dbms_output.put_line(pkg_sal.annual_income('xiaoming'));