-- 定义了相关的包体,包的声明也不用我多说了。。
create or replace package body dt_books_info is
-- 将列表里的相关数据放入datagridview里的存储过程
function get_info(para_booksinfo out cur_type) return varchar2 is
excute_result varchar2(200);
begin
excute_result := 'succeed';
open para_booksinfo for
select dt.book_no, dt.book_name, dt.book_type, dt.up_time
from dt_books dt;
return excute_result;
close para_booksinfo;
exception
when no_data_found then
excute_result := sqlerrm;
return excute_result;
end get_info;
-- 插入数据到数据库中这个存储过程我写了很久,也看了网上的很多资料,大多都是介绍用lob包写
-- 跟我实验室要求的方法不一样,没办法,捣鼓了半天也写出来了,这里也有和同学讨论的成果
-- 主要的思路:
-- 在数据库的相关列(你存储lob数据的那一列)插入一个empty_blob(),之后利用select into...返回该列的
-- “引用”(数据库中我也不知道怎么称呼,那我就借用了c++的称呼),在前台的程序中将该blob赋给一个
-- OracleBlob类型的变量,之后往这个里面写入数据即可
procedure insert_data(
para_bookname in dt_books.book_name%type,
para_booktype in dt_books.book_type%type,
para_uptime in dt_books.up_time%type,
temp_blob out dt_books.book_content%type
) is
record_no integer;
begin
insert into
dt_books
(book_no,
book_name,
book_type,
up_time,
book_content
)
values
(
add_bookno.nextval,
para_bookname,
para_booktype,
para_uptime,
empty_blob()
);
select add_bookno.currval into record_no
from dual;
select book_content into temp_blob
from dt_books
where book_no = record_no
for update;
end insert_data;
-- 用于下载数据的blob,将blob返回,之后再将blob数据写入相关文件,这个和上传基本就是一个相反的过程
function get_blob(
para_bookno in varchar2
) return blob is
temp_blob blob;
begin
select book_content into temp_blob
from dt_books
where para_bookno = dt_books.book_no
for update;
return temp_blob;
exception
when no_data_found then
return null;
end get_blob;
-- 写的是delete blob,其实也就是删除数据库相关的一行数据
function delete_blob(
para_bookno in varchar2
) return varchar2 is
excute_result varchar2(200);
begin
excute_result := 'succeed';
delete from dt_books
where dt_books.book_no = para_bookno;
return excute_result;
exception
when others then
excute_result := sqlerrm;
return excute_result;
end;
end dt_books_info;