创建了一个包,执行成功了但是没报错。但是调用的时候就报错了:
显示包无效。
然后重新编译包,显示:包已编译,但是有错误。
创建包的PL/SQL如下:
-------创建一个包,这个包里包含一个记录变量deptrec,两个函数和一个过程
--创建包定义
create or replace package demo_pack
is
deptrec dept%rowtype;
v_sqlcode number;
v_sqlerr varchar2(2048);
function add_dept(
dept_no number,dept_name varchar2,location varchar2)
return number;
function remove_dept(dept_no number)
return number;
procedure query_dept(dept_no in number);
end demo_pack;
--包体
create or replace package body demo_pack
is
flag integer;
function check_dept(dept_no number)
return integer;
function add_dept(dept_no number,dept_name varchar2,location varchar2)
return number
is
begin
if check_dept(dept_no)=0 then
insert into dept values(dept_no,dept_name,location);
return 1;
else
return 0;
end if;
exception
when others then
v_sqlcode:= sqlcode;
v_sqlerr := sqlerrm;
return -1;
end add_dept;
function remove_dept(dept_no number)
return number
is
begin
v_sqlcode := 0;
v_sqlerr := null;
if check_dept(dept_no) =1 then
delete from dept where deptno = dept_no;
return 1;
else
return 0;
end if;
exception
when others then
v_sqlcode := sqlcode;
v_sqlerr := sqlerrm;
return -1;
end remove_dept;
procedure query_dept(dept_no in number)
is
begin
if check_dept(dept_no) =1 then
select * into deptrec from dept where deptno=dept_no;
end if;
end query_dept;
function check_dept(dept_no number) ---check_dept这个函数是检查dept表里是否存在是否存在符合输入参数的数据
return integer
is
begin
select count(*) into flag from dept where deptno = dept_no;
if flag >0 then
flag :=1;
end if;
return flag;
end check_dept;
begin
v_sqlcode := null;
v_sqlerr := null;
end demo_pack;
执行成果,命令行没有任何消息。
调用包:
/* 调用demo_pack包内函数对dept表进行插入,查询和修改操作,并通过demo_pack包中的记录变量deptrec
显示所查询到的数据库信息*/
declare
var number;
begin
var := demo_pack.add_dept(90,'adminstration','beijing');
if var = -1 then
dbms_output.put_line(demo_pack.v_sqlerr);
elsif var = 0 then
dbms_output.put_line('该部门记录已经存在!');
else
dbms_output.put_line('添加记录成功!');
demo_pack.query_dept(90);
dbms_output.put_line(demo_pack.deptrec.deptno||'---'||demo_pack.deptrec.dname||'---'||demo_pack.deptrec.loc);
var := demo_pack.remove_dept(90);
if var = -1 then
dbms_output.put_line(demo_pack.v_sqlerr);
else
dbms_output.put_line('删除记录成功!');
end if;
end if;
end;
调用的时候就报错了。
上网百度,找到了一个解决办法:http://luoma.pro/Content/Detail/648?parentId=1
然后重新编译包,就没有报错了。此时命令行出现如下:
再次调用包,就成功了。