/* 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

简介

  • PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言。
  • PL/SQL 是对 SQL 的扩展。
  • 支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制结构。
  • 可用于创建存储过程、函数、触发器和程序包,给SQL语句的执行添加程序逻辑。

作用:
如果出现需要插入1000条数据,这些数据带有某种规律性,就可以通过PL/SQL进行增加数据的操作
优点:

  1. 支持 SQL,在 PL/SQL 中可以使用:
    • 数据操纵命令:DML,DDL(需要动态执行)
    • 事务控制命令:TCL
    • 游标控制, 下一章学习
    • SQL函数和SQL运算符
  2. 与 SQL 紧密集成,简化数据处理。
    • 支持所有 SQL 数据类型
    • 支持 NULL 值
    • 支持 %TYPE 和 %ROWTYPE
      • %TYPE: 引用字段类型,如:employee.ename%TYPE
      • %ROWTYPE:引用表的行类型, 如: employee%ROWTYPE
  3. 支持面向对象编程 (OOP)
  4. 可移植性,可运行在任何操作系统和平台上的Oralce 数据库
  5. 更佳的性能,PL/SQL 经过编译执行

常用数据类型

  • 数值
    number, numeric, decimal, float, int, integer, real
  • 字符串
    varchar,varchar2,string(PLSQL特有的)
  • 布尔类型boolean
  • 日期常用类型
    date, timestamp
  • 属性类型
    %type:引用某一个变量的类型或都是某个列名(字段)的类型。employee.ename%type;
    %rowtype:表示可存储某表行的记录类型。Employee%rowtype;

变量声明以及赋值

--赋值号为 :=
$变量名$ [CONSTANT] $datatype$ [NOT NULL] [:= value];--赋值
$变量名$ [CONSTANT] $datatype$ [NOT NULL] [DEFAULT expr];--默认值

age int;--声明一个整型变量age,
age int := 18;--声明age并赋值
age int default 18;--默认age为18
age constant int :=18;--声明整型常量age并赋值为18

--声明一个与employee.ename相同类型的变量myname
myname employee.ename%type;

--声明一个变量,类型为表的行类型(相当于表中每条数据对应的实体类)
rec_emp employee%rowtype;--employee表中的数据有多少列,rec_emp也有多少列

--例子,输入员工编号,输出该员工信息
declare
  v_empno employee.empno%type;
  rec_emp employee%rowtype;
begin
  v_empno := &请输入员工编号;
  select * into rec_emp from employee where empno=v_empno;
  --使用 .列名 得到列的值
  dbms_output.put_line(rec_emp.empno||','
                       ||rec_emp.ename||','
                       ||rec_emp.sal||','
                       ||rec_emp.job);
end;
/

--自定义一个新的数据类型,然后再用这个去声明变量,使用的话也是 .列名
  type TYPE_EMP_REC is record(
      empno employee.empno%type,
      ename employee.ename%type,
      sal employee.sal%type,
      job employee.job%type
  );

--赋值还可以通过select into语句
select ename into myname from employee where empno=7879;
--多个变量,注意要两边要对应
select ename,sal into myname,mysal from employee where empno =7879;

基本单元框架

[DECLARE
   --声明变量、常量、游标、自定义记录类型等。
]
BEGIN
    --执行部分。
   [EXCEPTION 
       --异常处理部分。
   ]
END;
/ --立即执行

输出输入语句

输出

oracle内置有一个dbms_output对象,负责输出
dbms_output对象有两个输出方法,一个为put,另外一个外put_line
参数可以接收数值型

--此方法不能立即输出,需要等待数据缓冲区满了之后或者是刷新数据缓冲区之后才会输出
dbms_output.put('hello world');
--下面两个任选一个即可让上面的hello world立即输出
dbms_output.put_line('');
dbms_output.new_line;

dbms_output.put_line('hello world');--立即输出

如果是在命令行窗口的话,没有见到输出语句,需要设置开启输出

set serveroutput on;

输入

--&号在PL/SQL中作为一个替代变量,用于在运行中输入值。如果输入的是字符类型那把&号放在两个单引号中,
--若是数字则不用单引号括起来
v_ename := '&请输入姓名:';
v_sal := &请输入工资;

输入输出例子

declare
    v_name varchar2(10) := '&输入名字';
    v_age int := &输入年龄;
begin
    dbms_out.put_line('我是'||v_name||'年龄为'||v_age);
    --使用||连接字符串
end;
/

判断与分支语句

if判断

--if判断
if 表达式 then
end if

if-else判断

--if-else判断
if 表达式 then 
--代码
else
--代码
end if

if-else if判断

--if-else if判断
if 表达式 then
    else if 表达式 then
    --代码
    else
    --代码
    end if
end if  

例子:

--出现几个if就得出现几个end if
declare
    v_sal employee.sal%type := &请输入工资;
begin
    if v_sal >=5000 then
        dbms_output.put('经理');
    else if v_sal<5000 and v_sal >=3000 then
          dbms_output.put('员工');
    else if v_sal<3000 and v_sal>1000 then
        dbms_output.put('other');
    else 
      dbms_output.put('others');
    end if;
    end if;
end if;
dbms_output.new_line;
end;
/

--少了elsle
declare
    v_sal employee.sal%type := &请输入工资;
begin
    if v_sal >=5000 then
        dbms_output.put('经理');
    else if v_sal<5000 and v_sal >=3000 then
              dbms_output.put('员工');
    else if v_sal<3000 and v_sal>1000 then
            dbms_output.put('other');
    end if;
    end if;
    end if;
    dbms_output.new_line;
end;
/

case分支语句

--1.判断是否满足表达式
case 
    when 表达式 then
    --代码
    when 表达式 then
    --代码
    else
    --代码
end case;   

--2.判断是否等于某个数值
case 
    when 数值 then
    --代码
    when 数值 then
    --代码
    else
    --代码
end case;

数值不能能为字符串类型

循环语句for while loop

loop循环

--无条件循环
loop
    --代码以及初始化相关
    --满足条件退出当前循环
    IF 条件 THEN 
       EXIT;
    END IF;
    --或者使用 EXIT WHEN 条件
end loop;

while循环

--有条件循环
--满足条件进入循环
while 条件 LOOP
    --初始化数值;
    --代码
    EXIT WHEN 条件; --满足条件退出循环
    --代码
end loop;

for循环

--oracle会自动创建计数器变量,也就是我们的i
--除了i,也可以起其他的名字

--相当于for(i=1;i<=10;i++)
for i in 1..10 loop
    --statement;
end loop;

--相当于for(i=10;i>=1;i--)     
for i in reverse 1..10 loop
    --statement;
end loop;

-使用变量作为for循环的范围
declare
  v_min integer default 1;
  v_max integer default 20;
begin
  for i in reverse v_min..v_max loop
    dbms_output.put(i||',');
  end loop;
  dbms_output.new_line;
end;
/

循环结构练习

--遍历输出某个部门的全部员工信息
declare
  v_deptno integer := &请输入部门号;
begin
  for emp in (select e.* from employee e where deptno=v_deptno) loop
    dbms_output.put_line(||emp.empno||','||emp.ename||','||emp.job||','||emp.sal);
  end loop;
end;
/

--for打印99乘法表
begin
  --如果不在rownum,可以吗?
  for num1 in 1..9 loop
    for num2 in 1..num1 loop
      dbms_output.put(num2||'*'||num1||'='||num1*num2||' ');
      end loop;
      dbms_output.new_line;
  end loop;
end;
/

--loop打印99乘法表
declare
  num1 int := 1;
  num2 int;
begin
  loop
    num2 := 1;
    loop 
      dbms_output.put(num2||'*'||num1||'='||num1*num2||' ');
      exit when num1=num2;
      num2 := num2+1;
    end loop; 
    dbms_output.new_line;
    exit when num1=9; 
    num1 := num1+1;
  end loop;
end;
/

--while打印99乘法表
declare
  num1 int := 1;
  num2 int;
begin
  while num1 <= 9 loop
    num2 := 1;
    while num2 <= num1 loop
      dbms_output.put(num2||'*'||num1||'='||num1*num2||' ');
      exit when num2=num1;
      num2 :=num2+1;
      end loop;
      dbms_output.new_line;
      exit when num1=9;
      num1 := num1+1;
  end loop;
end;
/
posted @ 2019-09-19 14:39  我的人生  阅读(433)  评论(0编辑  收藏  举报