北大青鸟oracle学习笔记29 30

本文主要介绍了Oracle中的多个内置程序包,如DBMS_ALERT、DBMS_LOB、DBMS_OUTPUT等,详细讲解了它们的功能及示例。DBMS_OUTPUT用于输出调试信息,DBMS_LOB则涉及LOB对象的操作,而DBMS_ALERT则支持数据库事件的异步通知。文章还提到了文件操作,如UTL_FILE的使用,并展示了读取BFILE字段的PL/SQL代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

oracle内置程序包

STANDARD和DBMS_STANDARD 定义和扩展PL/SQL语言环境

DBMS_ALERT 支持数据库事件的异步通知

DBMS_APPLICATION_INFO 允许为跟踪目的而注册应用程序

DBMS_AQ&DBMS_AQADM 管理oracle advanced queuing选件

DBMS_DEFER、DBMS_DEFER_SYS和DBMS_DEFER_QUERY 允许构建和管理延迟的远程过程调用

DBMS_DDL 某些DDL命令的pl/sql等效项

CALENDAR 提供日历维护功能

DBMS_DESCRIBE 描述存储子程序

DBMS_LOB 操纵LOB对象

DBMS_LOG 提供对 Oracle LOB数据类型进行操作的功能

DBMS_LOCK 用户定义的锁

DBMS_OUTPUT 处理PL/SQL 块和子程序输出调试信息

DBMS_SESSION 提供ALTER SESSION 命令的PL/SQL等效功能

DBMS_ROWID 获得ROWID 的详细信息

DBMS_RANDOM 提供随机生成器

DBMS_SQL 允许用户使用动态SQL,构造和执行任意DML和DDL语句

DBMS_JOB 提交和管理在数据库中执行的定时任务

DBMS_XMLDOM 用DOM模型读写XML类型的数据

DBMS_XMLPARSER XML解析,处理XML文档内容和结构

DBMS_XMLGEN 将SQL 查询结果转换为规范的XML格式

DBMS_XMLQUERY 提供将数据转换为XML类型的功能 DBMS_XSLPROCESSOR 提供XSLT功能. 转换XML文档

UTL_FILE 用PL/SQL程序来读写操作系统文本文件

 

DBMS_OUTPUT中的一些过程

Enable
Disable
Put 将字符放入缓冲区
Put_line 将缓冲区中数据输出并换行
New_line
Get_line
Get_lines

DBMS_LOB(只能由sys权限才能操作)

append
compare
copy
erase
fileclose
fileexists
filegetname
getlength

/*创建下载目录表,以记录下载的各种文件*/
Create Table DownFileList
(
  Id Varchar(20) Not Null Primary Key,
  Name Varchar(40)  Not Null,
  FileLocation BFILE,/*文件存放位置*/
  Description CLOB/*文件描述*/
)
/*
创建目录
Create Or Replace Directory 目录名 AS '本地或网络共享路径名';
Create Or Replace Directory FILEDIR AS 'D:/down' 或者 '//SERVER/down' //服务器名/共享名
*/
Create Or Replace Directory FILEDIR AS ' D:/temp'; --指定FILEDIR为 D:/temp 目录(该目录必须存在)
insert into downfilelist values
('1001','oracle',BFILENAME(upper('filedir'),'oracle.txt'),'这是一本oracle的教程');


在select * from downfilelist;命令是,BFILE字段无法显示,需要使用Read函数读取。

read

declare
  tempdesc CLOB;
  iReadCount int;
  iStart int;
  sOutputDesc varchar(100);
begin
  iReadCount:=5;
  iStart:=1;
  select description into tempdesc from downfilelist where id = '1001'; 
  dbms_lob.read(tempdesc, ireadcount, istart, soutputdesc);
  dbms_output.put_line(soutputdesc);
  dbms_output.put_line(dbms_lob.getlength(tempdesc));
end;
write
declare
  tempDesc clob;
  iCount int;
  iStart int;
  sNewVar varchar(30);
begin
  iCount:=3;
  iStart:=1;
  sNewVar:='new';
  Select Description Into tempDesc From DownFileList
    Where id = '1001' For Update;--锁定本行为修改 行级锁
  dbms_output.put_line('old:'|| tempdesc);
  dbms_lob.write(tempdesc,icount,istart, snewvar);
  dbms_output.put_line('new:'|| tempdesc);
  commit;--必须提交事务,否则该行一直处于锁定状态 
end;
append
declare
  destDesc clob;
  srcdesc clob;
begin
 select description into destdesc from downfilelist where id = '1001' for update;
 select description into srcdesc from downfilelist where id = '1002';
 dbms_lob.append(destdesc, srcdesc);
 dbms_output.put_line(destdesc);
 rollback;--commit提交的话,即更改数据库中1001记录的description字段数据
end;
erase

declare
  tempdesc clob;
  icount int;
  istart int;
begin
icount:=7;
istart:=1;
select description into tempdesc from downfilelist where id = '1001' for update;
dbms_lob.erase(tempdesc, icount, istart);
dbms_output.put_line(tempdesc);
 rollback;--这里commit会更改数据库中值
end;

 

copy
declare
  destdesc clob;
  srcdesc clob;
  icount int;
  ideststart int;
  isrcstart int;
begin
 icount:=10;
 ideststart:=10;
 isrcstart:=1;
 select description into destdesc from downfilelist where id = '1001' for update;
 select description into srcdesc from downfilelist where id = '1002';
 dbms_output.put_line(srcdesc);
 dbms_output.put_line(destdesc);
 dbms_lob.copy(destdesc, srcdesc, icount, ideststart, isrcstart);
 dbms_output.put_line(srcdesc);
 dbms_output.put_line(destdesc);
 rollback;--这里commit会更改数据库中值
end;

 

猜想可能是clob类型的变量如果赋值给临时变量的话,占用缓存区太大,所以赋值的时候可能类似于传递了一个引用代理,使其指向数据库中的字段值,所以在需要修改clob对象时,select语句中会出现for update锁定该行的语句。

文件相关操作

declare
  tempBFile BFILE;--临时BFILE
  iFileExistsFlag int;--文件存在标志
  iFileOpenFlag int;--文件打开标志
  iOutputCount NUMBER(14);--输出数量
  iStart int;--从第几个字符开始输出
  sDirAlias varchar(40);--目录别名
  sFileName varchar(30);--文件名
  sOutputVar long;--输出结果
begin
  --从表中取出编号为1001的记录的文件定位信息
  select filelocation into tempBFile from downfilelist where id = '1001';
  --取出文件名
  dbms_lob.filegetname(tempBFile,sDirAlias,sFileName);
  --检查文件是否存在
  iFileExistsFlag := dbms_lob.fileexists(tempbfile);
  if ifileexistsflag = 1 then
    dbms_output.put_line(sDirAlias||'/'||sFileName||' 存在');
  else
    dbms_output.put_line('文件不存在');
    Goto EndBlock;
  end if;
  --打开文件
  iFileOpenFlag := dbms_lob.fileisopen(tempbfile);
  if ifileopenflag = 1 then
    dbms_output.put_line('文件已经打开');
    Goto EndBlock;
  else
    dbms_output.put_line('正在打开文件。。。');
    dbms_lob.fileopen(tempBFile);
  end if;
  --输出字符
  iOutputCount:=255;--输出字符数量
  iStart:=1;--开始字符数
  dbms_lob.read(tempbfile, ioutputcount, istart, soutputvar);
  dbms_output.put_line('文件第'||iStart||'开始的'|| ioutputcount||'个字符为:');
  dbms_output.put_line(soutputvar);
  --关闭文件
  dbms_output.put_line('正在关闭文件。。。');
  dbms_lob.fileclose(tempBFile);
  dbms_output.put_line('文件正常关闭');
<>
  null;
exception
  when No_Data_Found then
    dbms_output.put_line('没有相应记录');
  when OTHERS then
    dbms_output.put_line(SQLCODE||' '||SQLERRM);
end;

 

读取文件使用二进制ascall码读取

FILEDIR/oracle.txt 存在
正在打开文件。。。
文件第1开始的30个字符为:
6F7261636C656F7261636C656F7261636C656F7261636C656F7261636C65
正在关闭文件。。。
文件正常关闭

编码问题始终很头痛。。。没找到方法显示出来。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值