创建:SQL> create or replace procedure insert_prol is//后面的or replace 是可选的
2 begin
3 insert into mytest values('dim','123');
4 end;
5 /
删除 drop procedure insert_prol;
执行 exec insert_prol;
call insert_prol;
例1:最简单的块
SQL> set serveroutput on;
SQL> begin
2 dbms_output.put_line('hell');//和java中的包中含有方法和函数相似
3 end;
4 /
例2:定义变量(假如输入为7788)
SQL> declare
2 v_name varchar(9);
3 v_sal number(5);
4 begin
5 select ename,sal into v_name,v_sal from emp where EMPNO=&no;// &是从控制台输入变量
6 dbms_output.put_line('用户名是:'||v_name||' 工资:'||v_sal);//"||"是连接符
exception
7 when no_data_found then
8 dbms_output.put_line('输入有误!');
9 end;
10 /
用户名是:SCOTT 工资:3000
2.1 定义常量的方法:“:=”
SQL> declare
2 c_tax_rate number(3,2):=0.03;
3 v_tax_sal number(7,2);
4 v_name varchar2(5);
v_sal number(7,2);
6 begin
7 select ename,sal into v_name,v_sal from emp where empno=&no;
8 v_tax_sal := v_sal*c_tax_rate;
9 dbms_output.put_line('姓名:'||v_name ||'工资:' ||v_sal ||'纳税:' ||v_tax_sal);
10 end;
11 /
标量:%type 解决字符串的不匹配:
还是上面的例子,如果我们得到的名字的个数大于5 那么就会报错(numeric or value error: character
string buffer too small),这是可以使用
declare
c_tax_rate number(3,2):=0.03;
v_tax_sal number(7,2);
v_name emp.ename%type;//这里是表示该变量的到的buffer大小和emp表中ename的大小相同
v_sal number(7,2);
begin
select ename,sal into v_name,v_sal from emp where empno=&no;
v_tax_sal := v_sal*c_tax_rate;
dbms_output.put_line('姓名:'||v_name ||'工资:' ||v_sal ||'纳税:' ||v_tax_sal);
end;
复合类型--pl/sql 记录实例【相当java中的结构体
declare
--定义一个pl/sql的记录类型emp_record_type 包含三个部分 name,salary,title
type emp_record_type is record(name emp.ename%type,salary emp.sal%type,title emp.job%type);
--定义一个emp_record_type类型的变量
dim_record emp_record_type;
begin
select ename,sal,job into dim_record from emp where empno=7788;
dbms_output.put_line('该记录的用户名是:'||dim_record.name);
end;
SQL>
SQL> declare
2 --定义一个pl/sql的表类型 存放的类型是:emp.ename%type
3 --index by binary_integer 表示下标是整数
4 type emp_table_type is table of emp.ename%type index by binary_integer;
5 --定义一个emp_table_type类型的变量
6 dim_table emp_table_type;
7 begin
8 select ename into dim_table(-1) from emp where empno=7788;
9 dbms_output.put_line('该记录的用户名是:'||dim_table(-1));
10 end;
11 /
该记录的用户名是:SCOTT
【在这里如果把where 后的去掉就会出现错误 ,因为返回的个数大于一 :解决问题如下:使用游标
declare
2 --定义游标类型dim_emp_cursor
3 type dim_emp_cursor is ref cursor;
4 --定义一个游标变量
5 test_cursor dim_emp_cursor;
6 --定义变量
7 v_ename emp.ename%type;
8 v_sal emp.sal%type;
9 begin
10 --把test_cursor 和一个select 结合
11 open test_cursor for select ename,sal from emp where deptno=&no;
12 --循环取出
13 loop
14 fetch test_cursor into v_ename,v_sal;
15 exit when test_cursor%notfound;
16 dbms_output.put_line('名字:'||v_ename||'工资:'||v_sal);
17 end loop;
18 --关闭游标
19 close test_cursor;
20 end;
21 /
函数:
create function dim_fun1 (s_name varchar2) return
2 number is yearSal number(7,2);
3 begin
4 select sal*12+nvl(comm,0)*12 into yearSal from emp where ename=s_name;
5 return yearSal;
6 end;
7 /
执行:SQL> var year_sal number;
SQL> call dim_fun1('SCOTT') into:year_sal;
SQL>
SQL> create package body dim_pag is
2 procedure update_sal(name varchar2,newSal number)
3 is
4 begin
5 update emp set sal=newSal where ename=name;
6 end;
7 function total_income(name varchar2)
8 return number is
9 all_sal number;
10 begin
11 select sal*12+nvl(comm,0) into all_sal from emp
12 where ename=name;
13 return all_sal;
14 end;
15 end;
16 /
Package body created
SQL> exec dim_pag.update_sal('SCOTT',200);
带有输入输出参数:
--输入参数 in(默认) 输出参数用out
create or replace procedure dim_inout(v_no in number,v_name out varchar2,v_sal out number)
is
begin
select ename,sal into v_name,v_sal from emp where empno=&v_no;
end;
在java中调用:
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection