/* 2 功能:生成博客目录的JS工具 3 测试:IE8,火狐,google测试通过 6 */ 7 var BlogDirectory = { 8 /* 9 获取元素位置,距浏览器左边界的距离(left)和距浏览器上边界的距离(top) 10 */ 11 getElementPosition:function (ele) { 12 var topPosition = 0; 13 var leftPosition = 0; 14 while (ele){ 15 topPosition += ele.offsetTop; 16 leftPosition += ele.offsetLeft; 17 ele = ele.offsetParent; 18 } 19 return {top:topPosition, left:leftPosition}; 20 }, 21 22 /* 23 获取滚动条当前位置 24 */ 25 getScrollBarPosition:function () { 26 var scrollBarPosition = document.body.scrollTop || document.documentElement.scrollTop; 27 return scrollBarPosition; 28 }, 29 30 /* 31 移动滚动条,finalPos 为目的位置,internal 为移动速度 32 */ 33 moveScrollBar:function(finalpos, interval) { 34 35 //若不支持此方法,则退出 36 if(!window.scrollTo) { 37 return false; 38 } 39 40 //窗体滚动时,禁用鼠标滚轮 41 window.onmousewheel = function(){ 42 return false; 43 }; 44 45 //清除计时 46 if (document.body.movement) { 47 clearTimeout(document.body.movement); 48 } 49 50 var currentpos =BlogDirectory.getScrollBarPosition();//获取滚动条当前位置 51 52 var dist = 0; 53 if (currentpos == finalpos) {//到达预定位置,则解禁鼠标滚轮,并退出 54 window.onmousewheel = function(){ 55 return true; 56 } 57 return true; 58 } 59 if (currentpos < finalpos) {//未到达,则计算下一步所要移动的距离 60 dist = Math.ceil((finalpos - currentpos)/10); 61 currentpos += dist; 62 } 63 if (currentpos > finalpos) { 64 dist = Math.ceil((currentpos - finalpos)/10); 65 currentpos -= dist; 66 } 67 68 var scrTop = BlogDirectory.getScrollBarPosition();//获取滚动条当前位置 69 window.scrollTo(0, currentpos);//移动窗口 70 if(BlogDirectory.getScrollBarPosition() == scrTop)//若已到底部,则解禁鼠标滚轮,并退出 71 { 72 window.onmousewheel = function(){ 73 return true; 74 } 75 return true; 76 } 77 78 //进行下一步移动 79 var repeat = "BlogDirectory.moveScrollBar(" + finalpos + "," + interval + ")"; 80 document.body.movement = setTimeout(repeat, interval); 81 }, 82 83 htmlDecode:function (text){ 84 var temp = document.createElement("div"); 85 temp.innerHTML = text; 86 var output = temp.innerText || temp.textContent; 87 temp = null; 88 return output; 89 }, 90 91 /* 92 创建博客目录, 93 id表示包含博文正文的 div 容器的 id, 94 mt 和 st 分别表示主标题和次级标题的标签名称(如 H2、H3,大写或小写都可以!), 95 interval 表示移动的速度 96 */ 97 createBlogDirectory:function (id, mt, st, interval){ 98 //获取博文正文div容器 99 var elem = document.getElementById(id); 100 if(!elem) return false; 101 //获取div中所有元素结点 102 var nodes = elem.getElementsByTagName("*"); 103 //创建博客目录的div容器 104 var divSideBar = document.createElement('DIV'); 105 divSideBar.className = 'sideBar'; 106 divSideBar.setAttribute('id', 'sideBar'); 107 var divSideBarTab = document.createElement('DIV'); 108 divSideBarTab.setAttribute('id', 'sideBarTab'); 109 divSideBar.appendChild(divSideBarTab); 110 var h2 = document.createElement('H2'); 111 divSideBarTab.appendChild(h2); 112 var txt = document.createTextNode('目录导航'); 113 h2.appendChild(txt); 114 var divSideBarContents = document.createElement('DIV'); 115 divSideBarContents.style.display = 'none'; 116 divSideBarContents.setAttribute('id', 'sideBarContents'); 117 divSideBar.appendChild(divSideBarContents); 118 //创建自定义列表 119 var dlist = document.createElement("dl"); 120 divSideBarContents.appendChild(dlist); 121 var num = 0;//统计找到的mt和st 122 mt = mt.toUpperCase();//转化成大写 123 st = st.toUpperCase();//转化成大写 124 //遍历所有元素结点 125 for(var i=0; i

oracle学习笔记(十七) PL/SQL高级应用

PL/SQL高级应用

动态SQL

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

语法:

EXECUTE IMMEDIATE '动态SQL语句'
      [INTO  define_variable_list]
      [USING  bind_argument_list];

例子:

--创建一个表
declare
  v_sql string(200);
begin
  v_sql := '
        create table my_diagrams(
          diagram_descr     VARCHAR2(40),
          diagram_no          integer,
        )
  ';
  execute immediate v_sql;
end;
/

--动态赋值,插入数据
--后面的数值可以使用变量
execute immediate 'INSERT INTO employee VALUES(:eptno, :ename)' USING 1010,'stars';
--相当于insert into employee(eptno,ename) values(1010,stars)

--把查询到的员工编号以及员工姓名赋值给两个变量,使用动态赋值
execute immediate 'select empno,ename from employee where sal=:sal' INTO v_empno,v_ename USING 1010;

目录对象

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

grant create any directory to scgs; 
--语法
create directory SCGS_SQL_DIR 
   as 'directory_path'
   
drop directory DIR_NAME;--删除目录对象

--创建目录对象
create directory MY_IMG_DIR
  as 'Q:\img';

LOB类型(大数据类型)

BLOB

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

CLOB

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

BFILE

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

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

存放图片

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

存放文本文件

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

declare
    src_file              bfile;
    dest_file             clob;
    v_amount              number;
    v_dest_offset         number := 1;
    v_src_offset          number := 1;
    v_lang_context        number := dbms_lob.default_lang_ctx;
    v_warning             number;
begin
    -- 1. 用bfilename()函数定位文件
    src_file := bfilename('GLLG_SQL_DIR','oracle.sql');

    --2. 以只读方式打开文件:dbms_lob.open()
    dbms_lob.open(src_file,dbms_lob.file_readonly);

    --3. 插入数据,预先用empty_clob()填充字段值,并将该字段关联到blob变量
    insert into my_book values(2,'oracle所有章节',empty_clob()) returning book_file into dest_file;

    v_amount := dbms_lob.getlength(src_file);

    --4. 调用 dbms_lob.loadclobfromfile(...有8个参数...)函数将bfile对象的数据加载到关联的blob变量
    dbms_lob.loadclobfromfile(dest_lob => dest_file,
                            src_bfile => src_file,
                            amount => v_amount,
                            dest_offset => v_dest_offset,
                            src_offset => v_src_offset,
                            bfile_csid => dbms_lob.default_csid,
                            lang_context => v_lang_context,
                            warning => v_warning);
     -- 检查错误
     IF v_warning = DBMS_LOB.WARN_INCONVERTIBLE_CHAR THEN     
       DBMS_OUTPUT.PUT_LINE('字符转换错误!');
     END IF; 
 
      --5. 关闭文件:dbms_lob.close()
      dbms_lob.close(src_file);
      commit;
end;
/
posted @ 2019-09-19 14:41  我的人生  阅读(271)  评论(0编辑  收藏  举报