经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Oracle » 查看文章
oracle学习笔记(十七) PL/SQL高级应用 - Stars-one
来源:cnblogs  作者:Stars-one  时间:2019/5/29 8:48:43  对本文有异议

PL/SQL高级应用

动态SQL

在PL/SQL中,不能直接执行DDL(create,alter,drop),得使用动态SQL,当然,除了DDL,动态SQL也可以执行DML(select,insert,update,delete)

语法:

  1. EXECUTE IMMEDIATE '动态SQL语句'
  2. [INTO define_variable_list]
  3. [USING bind_argument_list];

例子:

  1. --创建一个表
  2. declare
  3. v_sql string(200);
  4. begin
  5. v_sql := '
  6. create table my_diagrams(
  7. diagram_descr VARCHAR2(40),
  8. diagram_no integer,
  9. )
  10. ';
  11. execute immediate v_sql;
  12. end;
  13. /
  14. --动态赋值,插入数据
  15. --后面的数值可以使用变量
  16. execute immediate 'INSERT INTO employee VALUES(:eptno, :ename)' USING 1010,'stars';
  17. --相当于insert into employee(eptno,ename) values(1010,stars)
  18. --把查询到的员工编号以及员工姓名赋值给两个变量,使用动态赋值
  19. execute immediate 'select empno,ename from employee where sal=:sal' INTO v_empno,v_ename USING 1010;

目录对象

创建目录对象表示文件系统的某个文件夹,需要sysdba授权:

  1. grant create any directory to scgs;
  2. --语法
  3. create directory SCGS_SQL_DIR
  4. as 'directory_path'
  5. drop directory DIR_NAME;--删除目录对象
  6. --创建目录对象
  7. create directory MY_IMG_DIR
  8. as 'Q:\img';

LOB类型(大数据类型)

BLOB

按二进制来存储的,存放图片,文件,音乐

CLOB

直接存储文字的,文章或者是较长的文字

BFILE

一个二进制数据,相当于一个指针,指向某个文件,不属于数据库管理

  • BFILE字段指向的文件不是数据库的一部份,只能在数据库外维护
  • 对BFILE字段操作要使用BFILENAME函数
  • 读取BFILE字段需要使用DBMS_LOB包

存放图片

  1. 用bfilename()函数定位文件
  1. --此方法返回一个bfile对象,第二步需要使用
  2. bfilename($dir_name$,$file_name$)
  1. 以只读方式打开文件:dbms_lob.open()
  1. --mode模式选择dbms_lob包中提供的常量
  2. dbms_lob.open($bfile$,$mode$)
  1. 插入数据,预先用empty_blob()填充字段值,并将该字段关联到blob变量
  2. 调用dbms_lob.loadfromfile(dest_lob, src_lob, amount)函数将bfile对象的数据加载到关联的blob变量
  3. 关闭文件:dbms_lob.close()
  1. declare
  2. src_bfile bfile;
  3. dest_file blob;
  4. v_amount number;
  5. begin
  6. -- 1. bfilename()函数定位文件,此函数返回bfile对象(文件定位器)
  7. --oracle10g文件名可以使用中文,oracle11g好像使用中文会出错?
  8. src_bfile := bfilename('GLLG_IMG_DIR','priscilla chan.jpg');
  9. --2.以只读方式打开文件:dbms_lob.open()
  10. dbms_lob.open(src_bfile,dbms_lob.file_readonly);
  11. --3. 插入数据,预先用empty_blob()填充字段值,并将该字段关联到blob变量
  12. --diagram是该表中的一个列名
  13. insert into my_diagrams values('永远是你的陈慧娴',1,empty_blob()) returning diagram into dest_file;
  14. --4. 调用dbms_lob.loadfromfile(dest_lob, src_lob, amount)函数将bfile对象的数据加载到关联的blob变量
  15. v_amount := dbms_lob.getlength(src_bfile); --得到图片文件的大小
  16. dbms_lob.loadfromfile(dest_file,src_bfile,v_amount);
  17. --5. 关闭文件:dbms_lob.close()
  18. dbms_lob.close(src_bfile);
  19. commit;
  20. end;
  21. /

存放文本文件

步骤与上面一样,加载数据的函数参数有些不同,是把bfile文件的数据加载到了clob

  1. declare
  2. src_file bfile;
  3. dest_file clob;
  4. v_amount number;
  5. v_dest_offset number := 1;
  6. v_src_offset number := 1;
  7. v_lang_context number := dbms_lob.default_lang_ctx;
  8. v_warning number;
  9. begin
  10. -- 1. bfilename()函数定位文件
  11. src_file := bfilename('GLLG_SQL_DIR','oracle.sql');
  12. --2. 以只读方式打开文件:dbms_lob.open()
  13. dbms_lob.open(src_file,dbms_lob.file_readonly);
  14. --3. 插入数据,预先用empty_clob()填充字段值,并将该字段关联到blob变量
  15. insert into my_book values(2,'oracle所有章节',empty_clob()) returning book_file into dest_file;
  16. v_amount := dbms_lob.getlength(src_file);
  17. --4. 调用 dbms_lob.loadclobfromfile(...有8个参数...)函数将bfile对象的数据加载到关联的blob变量
  18. dbms_lob.loadclobfromfile(dest_lob => dest_file,
  19. src_bfile => src_file,
  20. amount => v_amount,
  21. dest_offset => v_dest_offset,
  22. src_offset => v_src_offset,
  23. bfile_csid => dbms_lob.default_csid,
  24. lang_context => v_lang_context,
  25. warning => v_warning);
  26. -- 检查错误
  27. IF v_warning = DBMS_LOB.WARN_INCONVERTIBLE_CHAR THEN
  28. DBMS_OUTPUT.PUT_LINE('字符转换错误!');
  29. END IF;
  30. --5. 关闭文件:dbms_lob.close()
  31. dbms_lob.close(src_file);
  32. commit;
  33. end;
  34. /

原文链接:http://www.cnblogs.com/kexing/p/10938714.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号