PLSQL介绍

PLSQL是Oracle对SQL99的一种扩展,基本每一种数据库都会对SQL进行扩展,Oracle对SQL的扩展就叫做PLSQL…

SQL99是什么

  • (1)是操作所有关系型数据库的规则
  • (2)是第四代语言
  • (3)是一种结构化查询语言
  • (4)只需发出合法合理的命令,就有对应的结果显示

SQL的特点

  • (1)交互性强,非过程化
  • (2)数据库操纵能力强,只需发送命令,无需关注如何实现
  • (3)多表操作时,自动导航简单,例如:
    • select emp.empno,emp.sal,dept.dname
    • from emp,dept
    • where emp.deptno = dept.deptno
  • (4)容易调试,错误提示,直接了当
  • (5)SQL强调结果

PLSQL是什么

  • 是专用于Oracle服务器,在SQL基础之上,添加了一些过程化控制语句,叫PLSQL
  • 过程化包括有:类型定义,判断,循环,游标,异常或例外处理。。。
  • PLSQL强调过程

为什么要用PLSQL

  • 因为SQL是第四代命令式语言,无法显示处理过程化的业务,所以得用一个过程化程序设计语言来弥补SQL的不足之处
  • SQL和PLSQL不是替代关系,是弥补关系

PLSQL语法

declare和exception都是可以省略的,begin和end;/是不能省略的。


  1. [declare]
  2. 变量声明;
  3. 变量声明;
  4. begin
  5. DML/TCL操作;
  6. DML/TCL操作;
  7. [exception]
  8. 例外处理;
  9. 例外处理;
  10. end;
  11. /

在PLSQL程序中:;号表示每条语句的结束,/表示整个PLSQL程序结束

PLSQL与SQL执行有什么不同:

  • (1)SQL是单条执行的
  • (2)PLSQL是整体执行的,不能单条执行,整个PLSQL结束用/,其中每条语句结束用;号

PLSQL变量

既然PLSQL是注重过程的,那么写过程的程序就肯定有基本的语法,首先我们来介绍PLSQL的变量

PLSQL的变量有4种

  • number
  • varchar2
  • 与列名类型相同
  • 与整个表的列类型相同

例子


  1. 写一个PLSQL程序,输出"hello world"字符串,语法:dbms_output.put_line('需要输出的字符串');
  2. begin
  3. --向SQLPLUS客户端工具输出字符串
  4. dbms_output.put_line('hello 你好');
  5. end;
  6. /
  7. 注意:
  8. dbms_outputoracle中的一个输出对象
  9. put_line是上述对象的一个方法,用于输出一个字符串自动换行
  10. 设置显示PLSQL程序的执行结果,默认情况下,不显示PLSQL程序的执行结果,语法:set serveroutput on/off;
  11. set serveroutput on;
  12. 使用基本类型变量,常量和注释,求10+100的和
  13. declare
  14. --定义变量
  15. mysum number(3) := 0;
  16. tip varchar2(10) := '结果是';
  17. begin
  18. /*业务算法*/
  19. mysum := 10 + 100;
  20. /*输出到控制器*/
  21. dbms_output.put_line(tip || mysum);
  22. end;
  23. /
  24. 输出7369号员工姓名和工资,格式如下:7369号员工的姓名是SMITH,薪水是800,语法:使用表名.字段%type
  25. declare
  26. --定义二个变量,分别装姓名和工资
  27. pename emp.ename%type;
  28. psal emp.sal%type;
  29. begin
  30. --SQL语句
  31. --select ename,sal from emp where empno = 7369;
  32. --PLSQL语句,将ename的值放入pename变量中,sal的值放入psal变量中
  33. select ename,sal into pename,psal from emp where empno = 7369;
  34. --输出
  35. dbms_output.put_line('7369号员工的姓名是'||pename||',薪水是'||psal);
  36. end;
  37. /
  38. 输出7788号员工姓名和工资,格式如下:7788号员工的姓名是SMITH,薪水是3000,语法:使用表名%rowtype
  39. declare
  40. emp_record emp%rowtype;
  41. begin
  42. select * into emp_record from emp where empno = 7788;
  43. dbms_output.put_line('7788号员工的姓名是'||emp_record.ename||',薪水是'||emp_record.sal);
  44. end;
  45. /

何时使用%type,何时使用%rowtype?

  • 当定义变量时,该变量的类型与表中某字段的类型相同时,可以使用%type
  • 当定义变量时,该变量与整个表结构完全相同时,可以使用%rowtype,此时通过变量名.字段名,可以取值变量中对应的值
  • 项目中,常用%type

判断体

语法:

值得注意的是:eslif并没有写错的,它是少了一个e的

例子


  1. 使用if-else-end if显示今天星期几,是"工作日"还是"休息日"
  2. declare
  3. pday varchar2(10);
  4. begin
  5. select to_char(sysdate,'day') into pday from dual;
  6. dbms_output.put_line('今天是'||pday);
  7. if pday in ('星期六','星期日') then
  8. dbms_output.put_line('休息日');
  9. else
  10. dbms_output.put_line('工作日');
  11. end if;
  12. end;
  13. /
  14. 从键盘接收值,使用if-elsif-else-end if显示"age<16""age<30""age<60""age<80"
  15. declare
  16. age number(3) := &age;
  17. begin
  18. if age < 16 then
  19. dbms_output.put_line('你未成人');
  20. elsif age < 30 then
  21. dbms_output.put_line('你青年人');
  22. elsif age < 60 then
  23. dbms_output.put_line('你奋斗人');
  24. elsif age < 80 then
  25. dbms_output.put_line('你享受人');
  26. else
  27. dbms_output.put_line('未完再继');
  28. end if;
  29. end;
  30. /

循环

在PLSQL中,循环的语法有三种:

WHILE循环:

  • while后面跟的是循环条件,与java的差不多,LOOP和END LOOP是关键字**

  1. WHILE total <= 25000
  2. LOOP
  3. total : = total + salary;
  4. END LOOP;

LOOP循环:

  • exit后面的条件成立了才退出循环【有点绕】

  1. Loop
  2. exit [when 条件成立];
  3. total:=total+salary;
  4. end loop;

FOR循环:

  • 循环的递增只能是1,不能自定义步长
  1. FOR I IN 1 . . 3
  2. LOOP
  3. 语句序列 ;
  4. END LOOP ;

例子


  1. 使用loop循环显示1-10
  2. declare
  3. i number(2) := 1;
  4. begin
  5. loop
  6. --当i>10时,退出循环
  7. exit when i>10;
  8. --输出i的值
  9. dbms_output.put_line(i);
  10. --变量自加
  11. i := i + 1;
  12. end loop;
  13. end;
  14. /
  15. 使用while循环显示1-10
  16. declare
  17. i number(2) := 1;
  18. begin
  19. while i<11
  20. loop
  21. dbms_output.put_line(i);
  22. i := i + 1;
  23. end loop;
  24. end;
  25. /
  26. 使用while循环,向emp表中插入999条记录
  27. declare
  28. i number(4) := 1;
  29. begin
  30. while( i < 1000 )
  31. loop
  32. insert into emp(empno,ename) values(i,'哈哈');
  33. i := i + 1;
  34. end loop;
  35. end;
  36. /
  37. 使用while循环,从emp表中删除999条记录
  38. declare
  39. i number(4) := 1;
  40. begin
  41. while i<1000
  42. loop
  43. delete from emp where empno = i;
  44. i := i + 1;
  45. end loop;
  46. end;
  47. /
  48. 使用for循环显示20-30
  49. declare
  50. i number(2) := 20;
  51. begin
  52. for i in 20 .. 30
  53. loop
  54. dbms_output.put_line(i);
  55. end loop;
  56. end;
  57. /

游标

Oracle中的游标其实就是类似JDBC中的resultSet,就是一个指针的概念

既然是类似与resultSet,那么游标仅仅是在查询的时候有效的

语法

  1. CURSOR 光标名 [ (参数名 数据类型[,参数名 数据类型]...)]
  2. IS SELECT 语句;

例子


  1. 使用无参光标cursor,查询所有员工的姓名和工资【如果需要遍历多条记录时,使用光标cursor,无记录找到使用cemp%notfound
  2. declare
  3. --定义游标
  4. cursor cemp is select ename,sal from emp;
  5. --定义变量
  6. vename emp.ename%type;
  7. vsal emp.sal%type;
  8. begin
  9. --打开游标,这时游标位于第一条记录之前
  10. open cemp;
  11. --循环
  12. loop
  13. --向下移动游标一次
  14. fetch cemp into vename,vsal;
  15. --退出循环,当游标下移一次后,找不到记录时,则退出循环
  16. exit when cemp%notfound;
  17. --输出结果
  18. dbms_output.put_line(vename||'--------'||vsal);
  19. end loop;
  20. --关闭游标
  21. close cemp;
  22. end;
  23. /
  24. 使用带参光标cursor,查询10号部门的员工姓名和工资
  25. declare
  26. cursor cemp(pdeptno emp.deptno%type) is select ename,sal from emp where deptno=pdeptno;
  27. pename emp.ename%type;
  28. psal emp.sal%type;
  29. begin
  30. open cemp(&deptno);
  31. loop
  32. fetch cemp into pename,psal;
  33. exit when cemp%notfound;
  34. dbms_output.put_line(pename||'的薪水是'||psal);
  35. end loop;
  36. close cemp;
  37. end;
  38. /
  39. 使用无参光标cursor,真正给员工涨工资,ANALYST1000MANAGER800,其它涨400,要求显示编号,姓名,职位,薪水
  40. declare
  41. cursor cemp is select empno,ename,job,sal from emp;
  42. pempno emp.empno%type;
  43. pename emp.ename%type;
  44. pjob emp.job%type;
  45. psal emp.sal%type;
  46. begin
  47. open cemp;
  48. loop
  49. fetch cemp into pempno,pename,pjob,psal;
  50. --循环退出条件一定要写
  51. exit when cemp%notfound;
  52. if pjob='ANALYST' then
  53. update emp set sal = sal + 1000 where empno = pempno;
  54. elsif pjob='MANAGER' then
  55. update emp set sal = sal + 800 where empno = pempno;
  56. else
  57. update emp set sal = sal + 400 where empno = pempno;
  58. end if;
  59. end loop;
  60. commit;
  61. close cemp;
  62. end;
  63. /

例外、异常

我们在上面看PLSQL中的语法已经知道,有一个exception,这个在Oracle中称为例外,我们也可以简单看成就是Java中的异常。。。

语法:


  1. declare节中定义例外
  2. out_of exception ;
  3. begin节中可行语句中抛出例外
  4. raise out_of
  5. exception节处理例外
  6. when out_of then

例子


  1. 使用oracle系统内置例外,演示除0例外【zero_divide
  2. declare
  3. myresult number;
  4. begin
  5. myresult := 1/0;
  6. dbms_output.put_line(myresult);
  7. exception
  8. when zero_divide then
  9. dbms_output.put_line('除数不能为0');
  10. delete from emp;
  11. end;
  12. /
  13. 使用oracle系统内置例外,查询100号部门的员工姓名,演示没有找到数据【no_data_found
  14. declare
  15. pename varchar2(20);
  16. begin
  17. select ename into pename from emp where deptno = 100;
  18. dbms_output.put_line(pename);
  19. exception
  20. when NO_DATA_FOUND then
  21. dbms_output.put_line('查无该部门员工');
  22. insert into emp(empno,ename) values(1111,'ERROR');
  23. end;
  24. /

存储过程和存储函数

在Oracle中,存储过程和存储函数的概念其实是差不多的,一般地,我们都可以混合使用。只不过有的时候有的情况使用过程好一些,有的情况时候函数的时候好一些。下面会讲解在什么时机使用过程还是函数的。

首先,我们在学习存储过程和存储函数之前,先要明白我们为什么要学他….

其实存储过程和函数就是类似与我们在Java中的函数的概念….

到目前为止,我们的PLSQL是有几个缺点的:

  • PLSQL不能将其封装起来,每次调用的时候都要将整片代码复制来调用
  • 有的时候,我们想要将PLSQL的代码保存起来,只能自己手动保存在硬盘中,非常麻烦
  • 我们学数据库就是为了让程序能够调用的,但是PLSQL不能让程序(java)调用

因此,存储过程和存储函数就能解决上面的问题了,能够将代码封装起来,保存在数据库之中,让编程语言进行调用….

存储过程和函数的语法

过程的语法:


  1. create [or replace] procedure 过程名[(参数列表)]
  2. as
  3. PLSQL程序体;【beginend;/】

函数的语法:


  1. CREATE [OR REPLACE] FUNCTION 函数名【(参数列表)
  2. RETURN 返回值类型
  3. AS
  4. PLSQL子程序体;
  5. beginend;/】

无论是过程还是函数,as关键字都代替了declare关键字。


过程例子

创建第一个过程:


  1. CREATE OR REPLACE PROCEDURE hello
  2. AS
  3. BEGIN
  4. dbms_output.put_line('hello world');
  5. END;

调用过程的三种方式:

  • exec过程名【SQLPLUS中使用】
  • PLSQL程序调用
  • Java调用

PLSQL调用


  1. BEGIN
  2. hello();
  3. END;

创建有参存储过程raiseSalary(编号),为7369号员工涨10%的工资,演示in的用法,默认in,大小写不敏感

  1. CREATE or REPLACE PROCEDURE bb(pempno in NUMBER)
  2. AS
  3. BEGIN
  4. UPDATE EMP
  5. SET sal = sal * 1.2
  6. WHERE empno = pempno;
  7. END;

调用:


  1. BEGIN
  2. bb(7369);
  3. END;

创建有参存储过程findEmpNameAndSalAndJob(编号),查询7788号员工的的姓名,职位,月薪,返回多个值,演示out的用法

创建过程:在过程中的参数,默认值是IN,如果是输出的话,那么我们要指定为OUT。


  1. CREATE OR REPLACE PROCEDURE find(pempno IN NUMBER, psal OUT VARCHAR2, pename OUT VARCHAR2, pjob OUT VARCHAR2)
  2. AS
  3. BEGIN
  4. SELECT
  5. ename,
  6. sal,
  7. job
  8. INTO pename, psal, pjob
  9. FROM emp
  10. WHERE empno = pempno;
  11. END;

调用:在调用的时候,使用到的psal,pname,pjob在调用的时候都没有定义的,因此我们需要先定义变量后使用!


  1. DECLARE
  2. psal emp.sal%TYPE;
  3. pename emp.ename%TYPE;
  4. pjob emp.job%TYPE;
  5. BEGIN
  6. find(7369, psal, pename, pjob);
  7. dbms_output.put_line(psal || pename || pjob);
  8. END;/

函数例子

创建有参存储函数findEmpIncome(编号),查询7369号员工的年收入,演示in的用法,默认in


  1. CREATE OR REPLACE FUNCTION findEmpIncome(pempno IN NUMBER)
  2. --这里指定的是返回值类型
  3. RETURN NUMBER
  4. AS
  5. income NUMBER;
  6. BEGIN
  7. SELECT sal * 12
  8. INTO income
  9. FROM emp
  10. WHERE empno = pempno;
  11. /*在PLSQL中一定要有return语句*/
  12. RETURN income;
  13. END;

调用:在PLSQL中,赋值的语句不是直接“=”,而是:=


  1. DECLARE
  2. income number;
  3. BEGIN
  4. income := findEmpIncome(7369);
  5. dbms_output.put_line(income);
  6. END;/

如果写的是=号,那么就会出现以下的错误:


  1. [2017-07-11 13:58:14] [65000][6550] ORA-06550: 4 行, 10 列:
  2. PLS-00103: 出现符号 "="在需要下列之一时:
  3. := . ( @ % ;
  4. ORA-06550: 4 行, 31 列:
  5. PLS-00103: 出现符号 ";"在需要下列之一时:
  6. . ( ) , * % & -
  7. + / at mod remainder rem <an exponent (**)> and or ||
  8. multiset
  9. ORA-06550: 7 行, 4 列:
  10. PLS-00103: 出现符号 "end-of-file"在需要下列之一时:
  11. end
  12. not pragma final instantiable order overriding static member
  13. constructor map

创建有参存储函数findEmpNameAndJobAndSal(编号),查询7788号员工的的姓名(return),职位(out),月薪(out),返回多个值


  1. CREATE OR REPLACE FUNCTION findEmpNameAndJobAndSal(pempno IN NUMBER, pjob OUT VARCHAR2, income OUT NUMBER)
  2. --这里指定的是返回值类型
  3. RETURN VARCHAR
  4. AS
  5. /*查询出来的字段与列名相同,就使用列名相同的类型就行了。*/
  6. pename emp.ename%TYPE;
  7. BEGIN
  8. SELECT
  9. sal,
  10. ename,
  11. job
  12. INTO income, pename, pjob
  13. FROM emp
  14. WHERE empno = pempno;
  15. /*在PLSQL中一定要有return语句*/
  16. RETURN pename;
  17. END;

调用函数:


  1. DECLARE
  2. /*输出的字段与列名的类型是相同的。*/
  3. income emp.sal%TYPE;
  4. pjob emp.job%TYPE;
  5. pename emp.ename%TYPE;
  6. BEGIN
  7. pename := findEmpNameAndJobAndSal(7369, pjob, income);
  8. dbms_output.put_line(pename || pjob || income);
  9. END;/

过程与函数的使用场景

我们发现过程与函数的区别其实是不大的,一般我们都可以用函数来实现的时候, 也可以使用过程来实现….

但是,总有些情况,使用函数比使用过程要好,使用过程比使用函数要好,那什么时候使用过程,什么时候使用函数呢???

不难发现的是,函数是必定要有一个返回值的,当我们在调用的时候,接受返回值就直接获取就行了。

也就是说

  • 当返回值只有一个参数的时候,那么就使用存储函数!
  • 当返回值没有参数或者多于一个参数的时候,那么就使用过程!

SQL与过程函数使用场景

【适合使用】过程函数:

  • 》需要长期保存在数据库中
  • 》需要被多个用户重复调用
  • 》业务逻辑相同,只是参数不一样
  • 》批操作大量数据,例如:批量插入很多数据

【适合使用】SQL:

  • 》凡是上述反面,都可使用SQL
  • 》对表,视图,序列,索引,等这些还是要用SQL

触发器

在PLSQL中也有个类似与我们Java Web中过滤器的概念,就是触发器…触发器的思想和Filter的思想几乎是一样的….

值得注意的是:对于触发器而言,是不针对查询操作的。也就是说:触发器只针对删除、修改、插入操作!

触发器语法


  1. CREATE [or REPLACE] TRIGGER 触发器名
  2. {BEFORE | AFTER}
  3. { INSERT | DELETE|-----语句级
  4. UPDATE OF 列名}----行级
  5. ON 表名
  6. -- 遍历每一行记录
  7. [FOR EACH ROW]
  8. PLSQL 块【declarebeginend;/】

例子

创建语句级触发器insertEmpTrigger,当对表【emp】进行增加【insert】操作前【before】,显示”hello world”


  1. CREATE OR REPLACE TRIGGER insertempTiriger
  2. BEFORE
  3. INSERT
  4. ON EMP
  5. BEGIN
  6. dbms_output.put_line('helloword');
  7. END;

调用:


  1. INSERT INTO EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) VALUES (1, '2', '3', 4, NULL, NULL, NULL, 10);

结果:


星期一到星期五,且9-20点能向数据库emp表插入数据,否则使用函数抛出异常,

语法:raise_application_error(‘-20000’,’例外原因’)


  1. CREATE OR REPLACE TRIGGER securityTrigger
  2. BEFORE
  3. INSERT
  4. ON EMP
  5. DECLARE
  6. pday VARCHAR2(10);
  7. ptime NUMBER;
  8. BEGIN
  9. /*得到星期几*/
  10. SELECT to_char(sysdate, 'day')
  11. INTO pday
  12. FROM dual;
  13. /*得到时间*/
  14. SELECT to_char(sysdate, 'hh24')
  15. INTO ptime
  16. FROM dual;
  17. IF pday IN ('星期六', '星期日') OR ptime NOT BETWEEN 7 AND 23
  18. THEN
  19. RAISE_APPLICATION_ERROR('-20000', '非工作事件,请工作时间再来!');
  20. END IF;
  21. END;

插入数据、响应触发器:


  1. INSERT INTO EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) VALUES (3, '2', '3', 4, NULL, NULL, NULL, 10);


创建行级触发器checkSalaryTrigger,涨后工资这一列,确保大于涨前工资,语法:for each row/:new.sal/:old.sal

可以使用:new.sal/:old.sal来对比插入之前的值和插入之后的值


  1. CREATE OR REPLACE TRIGGER checkSalTrigger
  2. BEFORE
  3. UPDATE OF sal
  4. ON EMP
  5. FOR EACH ROW
  6. BEGIN
  7. IF :new.sal <= :old.sal
  8. THEN
  9. RAISE_APPLICATION_ERROR('-20001', '你涨的工资也太少了把!!!!');
  10. END IF;
  11. END;

调用:


  1. UPDATE emp
  2. SET sal = sal - 1
  3. WHERE empno = 7369;

Oracle总结第三篇【PLSQL】的更多相关文章

  1. oracle系列--第五篇 PLSQL连接本地的Oracle数据库

    这篇blog主要是针对新手,我也是个新手:) 我们把oracle成功的安装在了我们的计算机上面,那我们如何才能将PLSQL developer连 接到本地的oracle呢? 首先,我们必须有下面步准备 ...

  2. Oracle学习第三篇—多行函数

    0 order by asc/desc 默认升序 order by 列的名字|表达式|别名|序号 把空放在后边:order by desc nulls last 1分组函数--会自动滤空值 count ...

  3. oracle系列--第三篇 Oracle的安装

    在安装之前,我先说说我的电脑的配置: OS : Windows 7 32bit CPU : 3GHz Memory : 2GB Desk : 320GB ======================= ...

  4. PLSQL连接ORACLE配置字符串简介 oracle网络配置 三个配置文件 listener.ora、sqlnet.ora、tnsnames.ora原理解释

    PLSQL连接ORACLE配置字符串简介 oracle网络配置 三个配置文件 listener.ora.sqlnet.ora.tnsnames.ora原理解释 oracle网络配置三个配置文件 lis ...

  5. Oracle的tnsnames.ora配置(PLSQL Developer)

    首先打开tnsnames.ora的存放目录,一般为D:\app\Administrator\product\11.2.0\client_1\network\admin,就看安装具体位置了. 步骤阅读 ...

  6. 如何在不装ORACLE的情况下使用PLSQL

    原来我电脑装了oracle跟plsql,然后使用plsql的.后来因为某些原因,我重装了系统,把装的软件都格调了,需要重新装.当时在装plsql的时候我就想,我一直都是直接用plsql远程连接的服务器 ...

  7. ORA-38760: This database instance failed to turn on flashback database 第三篇

    ORA-38760: This database instance failed to turn on flashback database  第三篇 第一篇 第二篇 问题现象:      在数据库a ...

  8. 分析RAC下一个SPFILE整合的三篇文章的文件更改

    大约RAC下一个spfile分析_整理在_2014.4.17 说明:文章来源于网络 第一篇:RAC下SPFILE文件改动 在RAC下spfile位置的改动与单节点环境不全然一致,有些地方须要特别注意, ...

  9. 转载《Oracle的tnsnames.ora配置(PLSQL Developer)》

    源地址:https://www.cnblogs.com/qq3245792286/p/6212617.html. 首先打开tnsnames.ora的存放目录,一般为D:\app\Administrat ...

随机推荐

  1. d3.js多个x轴y轴canvas柱状图

    最终效果图镇楼: 本文通过三个步骤来介绍d3.js. 1.简单的柱状图: 2.多个x轴的柱状图: 3.多个x轴.y轴的柱状图: 学习心得: d3.js入门相对比较困难,一旦掌握了核心思想,不断熟悉AP ...

  2. [js高手之路]深入浅出webpack系列2-配置文件webpack.config.js详解

    接着上文,重新在webpack文件夹下面新建一个项目文件夹demo2,然后用npm init --yes初始化项目的package.json配置文件,然后安装webpack( npm install ...

  3. Spring中ApplicationContext加载机制

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp33 加载器目前有两种选择:ContextLoaderListener和Co ...

  4. java-多个数的和

    目的:实现多个整数相加. 思路:1.首先要确定用户所需整数的个数n,此部分由用户在键盘上输入. 2.创建一个长度为n的数组. 3.用户从键盘上输入n个整数并判断是否输入正确,正确则存入数组,否则重新输 ...

  5. 学习笔记GAN004:DCGAN main.py

    Scipy 高端科学计算:http://blog.chinaunix.net/uid-21633169-id-4437868.html import os #引用操作系统函数文件 import sci ...

  6. 最近做了一个通达OA的大料:20170905最新版本破解可改单位名称,无限制安装

    最近做了一个通达OA的大料:20170905最新版本破解可改单位名称,无限制安装 用户约七十家,总体不错,修改了两次注册授权文件,完美使用中 可联系麦枫http://www.mfsun.com管理员Q ...

  7. nhibernate教程(4)--条件查询(Criteria Query)

    NHibernate之旅(4):探索查询之条件查询(Criteria Query) 2008-10-16 18:20 by 李永京, 44341 阅读, 43 评论, 收藏,  编辑 本节内容 NHi ...

  8. Mac Intellij Debug 模式

    前言:本文的核心是记录debug的使用,与具体的操作系统无关. 1.什么是Debug Debug是程序的一种运行模式.用来发掘程序的走向,以及程序在运行过程中参数的变化. 2.Debug的作用 deb ...

  9. CentOS6.5下LNMP环境的搭建

    #写的不好,大牛勿喷 #其实我很努力 OS:CentOS6.5 1.关闭SELinux,关闭防火墙 原因:1.SELinux确实可以提高服务器的安全性,但是对于服务器的性能存在一定的影响,同时它的复杂 ...

  10. 【集美大学1411_助教博客】团队作业3——需求改进&系统设计 成绩

    看到同学们越来越认真了,助教非常高兴.大家已经开始了alpha冲刺,请控制好进度.成功的关键就是不断迭代,不断迭代. 关于leangoo 我看到所有组的同学都已经开始使用leangoo,请大家把助教加 ...