菜鸟一枚,记录学习过程中遇到的问题和解决办法。
统计表数据个数
create or replace procedure prm_example
is
n_number number;
begin
select count(*) into n_number from emp;
dbms_output.put_line(n_number);
end;
这里n_number是定义的一个变量,number代表数字类型,其他例如varchar,date等类型
执行
begin
prm_example;
end;
打印当前时间,简单测试
create or replace procedure prm_example
is
datenow date;
begin
select sysdate into datenow from dual;
dbms_output.put_line(datenow);
end;
dbms_out.put_line()是一个打印变量值的方法,效果如下
执行一个查找字段的方法
create or replace procedure prc_example(de in varchar,name out varchar,App_Code out varchar,error_Msg out varchar)
as
begin
select dname into name from dept where deptno=de;
exception when others then
App_Code:=-1;
error_Msg:='未找到数据';
end;
和普通sql不一样的是,这里使用了into字段,对name进行了赋值。假如未找到数据,会抛出异常,将异常抓住,给两个出参赋值。
其实存储过程简单理解为就是一个函数,把一堆sql操作集成到一起,一次执行,
de 代表入参,类似于函数的参数,name,app_code,error_meg代表出参,类似返回值。
写语句测试
declare
de varchar(10);
ab varchar(10);
appcode varchar(20);
ermg varchar(20);
begin
de:=10;
prc_example(de,ab,appcode,ermg);
dbms_output.put_line(ermg);
end;
这里:=是赋值符号
结果
第二种测试,先找到存储过程
右键选择test
给入参写值,按F8执行,这里我的入参是10,执行结果如下
因为进行了异常处理,假如没有找到数据,那么,会给后面两个出参赋值,效果图
插入两张表操作
create or replace procedure prm_example(do1 in number ,dn1 in varchar,eo1 in number,en1 in varchar ,App_Code out varchar,error_Msg out varchar)
as
begin
insert into dept(deptno,dname) values (do1,dn1);
insert into emp(empno,ename,deptno) values(eo1,en1,do1);
commit;
exception when others then
App_Code:=-1;
error_Msg:='插入失败';
end;
注意,在写存储过程时,在输入空格时,使用英式键盘,否则,会报如下错误
Compilation errors for PROCEDURE FENG.PRM_EXAMPLE
Error: PLS-00103: 出现符号 "?"在需要下列之一时:
( begin case declare exit for
goto if loop mod null pragma raise return select update while
with
<< continue close current delete fetch lock
insert open rollback savepoint set sql execute commit forall
merge pipe purge
Line: 3
Text: begin
这里遇到了写入全角空格而导致存储过程执行失败的错误,空格删掉,重新按空格解决。
游标的使用。看到的一段解释很好的概念,如下:
游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库。这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率。
游标有两种类型:显式游标和隐式游标。在前述程序中用到的SELECT...INTO...查询语句,一次只能从数据库中提取一行数据,对于这种形式的查询和DML操作,系统都会使用一个隐式游标。但是如果要提取多行数据,就要由程序员定义一个显式游标,并通过与游标有关的语句进行处理。显式游标对应一个返回结果为多行多列的SELECT语句。
游标一旦打开,数据就从数据库中传送到游标变量中,然后应用程序再从游标变量中分解出需要的数据,并进行处理。
在我们进行insert、update、delete和select value into variable 的操作中,使用的是隐式游标
隐式游标的属性 返回值类型 意 义
修改雇员工资
create or replace procedure prc_example (epo in number) as
BEGIN
UPDATE emp SET sal=sal+100 WHERE empno=epo;
IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE('成功修改雇员工资!');
COMMIT;
ELSE
DBMS_OUTPUT.PUT_LINE('修改雇员工资失败!');
END IF;
END;
declare
e_number number;
begin
e_number:=7788;
prc_example(e_number);
end;
显式游标
使用游标查询所有编号为10 的员工名
create or replace procedure prc_example is
begin
declare
cursor emp_sor is select ename,sal from emp where deptno=10;
cname emp.ename%type;
csal emp.sal%type;
begin
open emp_sor;
loop
fetch emp_sor into cname,csal; --取游标的值给变量。
dbms_output.put_line('ename:'||cname);
exit when emp_sor%notfound;
end loop;
close emp_sor;
end;
end;