比如我们的应用都是链接在MD—SAL上,所以必须依赖MD-SAL。 config subsystem在MD-SAL之外而且被用来提供把应用接入MD-SAL的功能。 我们其中依赖了一个MD-SAL的服务 binding-aware-broker,这个跟MD-SAL的数据存取的datastore有关,我后面会讲到如何去用。 比如我们的应用都是链接在MD—SAL上,所以必须依赖MD-SAL。 config subsystem在MD-SAL之外而且被用来提供把应用接入MD-SAL的功能。
从大的结构上来看,MD-SAL与AD-SAL并没有太多的差别,都是由一些南向/北向的Plugin(SB/NB-Plugin)以及中间的适配层(SAL)组成。 MD-SAL与AD-SAL设计结构上的差别主要如下: 1.不同于AD-SAL,MD-SAL引入了Data Store的概念,在其提供的Data Store中,存储由北向Application和南向Device 图2-1 MD-SAL与AD-SAL的架构设计差别示意 我们再以图2-1为例来具体说明AD-SAL与MD-SAL的差别,以更好地理解MD-SAL新引进的一些理念: 在图2-1中,NB-Plugin1通过静态绑定访问 AD-SAL中原有的消息路由功能在MD-SAL中依然存在。 三.MD-SAL架构 MD-SAL内部实现的抽象架构如图3-1所示。 图3-1 MD-SAL架构示意图 四.MD-SAL Plugin生命周期 MD-SAL本身不提供任何的Model,所有的Model都是由对应的Plugin来提供。
为了有个比较,我们先设想一下如果不利用MD-SAL框架,如何实现? 见上图的实现步骤: 1)所有的面包机厂商,按照MD-SAL中约定好的“面包机南向接口协议”,实现面包机和MD-SAL框架的交互。 2)面包机APP应用程序通过调用MD-SAL提供的北向接口,实现APP和MD-SAL框架的交互。 3)MD-SAL框架内部完成北向接口和南向接口之间的对接。 绿色部分是ODL的 MD-SAL框架内部提供的数据存储服务, Provider会向MD-SAL框架中注册可Provider Bundler可以提供的服务: ? 胖子@南京 不部署到控制器里面,单独的bundle可以吗 不可以,要依赖ODL的MD-SAL框架。需要调用ODL MD-SAL的数据服务,所以要部署在一起。
win7环境)、SDN控制器的使用(ubuntu环境搭建、controller使用、mininet的使用)和ODL源码编译生成发行版控制器之后,终于有时间写第4篇文章,本章主要讲如何开发一个基于MD-SAL
文章目录 一、add / sub / mul / div 数值运算指令 二、xor / not / sal / sar / shl / shr 位运算指令 总结 一、add / sub / mul / 减法运算指令 , 运算结果存储到操作数 1 中 ; mul : 乘法运算指令 , 运算结果存储到操作数 1 中 ; div : 除法运算指令 , 运算结果存储到操作数 1 中 ; 二、xor / not / sal / sar / shl / shr 位运算指令 ---- 位运算指令 : xor : 异或运算指令 ; not : 取反运算指令 ; sal : 算术左移指令 ; sar : 算术右移指令 ; shl pusha , popa ret , retn 返回指令 , set 设置目标值指令 add , sub , mul , div 数值运算指令 xor , not , shl , shr , sal
DECLARE v_empid emp.empno%TYPE; v_job emp.job%TYPE; v_old_sal emp.sal%TYPE; v_new_sal emp.sal%TYPE DECLARE v_empid emp.empno%TYPE; v_job emp.job%TYPE; v_old_sal emp.sal%TYPE; v_new_sal emp.sal%TYPE ='CLERK' THEN v_new_sal:=v_old_sal*1.1; ELSE v_new_sal:=v_old_sal*1.08; END IF; UPDATE emp SET sal DECLARE v_empid emp.empno%TYPE; v_job emp.job%TYPE; v_old_sal emp.sal%TYPE; v_new_sal emp.sal%TYPE :=v_old_sal*1.1; WHEN v_job='SALESMAN' THEN v_new_sal:=v_old_sal*1.08; ELSE v_new_sal:=v_old_sal*
定义和列的类型保持一致 v_sal emp.sal%type;-- 和emp表sal列的类型保持一致 2. %type,v_empsal EMP.SAL%type); --变量名是v_name_sal 类型是type_emp_name_sal v_name_sal case when v_temp_empno_sal.v_sal > 3000 then update emp set sal = sal * 0.6 where empno = v_temp_empno_sal.v_empno; when v_temp_empno_sal.v_sal > 2000 and v_temp_empno_sal.v_sal when v_temp_empno_sal.v_sal > 1500 and v_temp_empno_sal.v_sal <= 2000 then update emp set
‘low sal’))) FROM emp 输出结果 SMITH 800 low sal ALLEN 1600 low sal WARD 1250 low sal JONES 2975 low sal MARTIN 1250 low sal BLAKE 2850 low sal CLARK 2450 low sal SCOTT 3000 mid sal KING 5000 high sal TURNER 1500 low sal ADAMS 1100 low sal JAMES 950 low sal FORD 3000 mid sal MILLER 1300 low sal 4:利用decode实现表或者试图的行列转换 ,SAL,0)) ALLEN, SUM(DECODE(ENAME,’WARD’,SAL,0)) WARD, SUM(DECODE(ENAME,’JONES’,SAL
SQL>SELECT ename, sal13+nvl(comm,0) year_sal FROM emp; (year_sal为别名,可按别名排序) SQL>SELECT * FROM emp WHERE (sal) from emp; SQL>SELECT * FROM emp where sal=(SELECT MAX(sal) from emp)); SQL>SELEC COUNT(*) FROM BY deptno; SQL>SELECT deptno, job, AVG(sal),MIN(sal) FROM emp group by deptno,job having AVG(sal)<2000 5.3 使用ALL SQL>SELECT ename,sal,deptno FROM emp WHERE sal> ALL (SELECT sal FROM emp WHERE deptno=30); 或SQL>SELECT ename,sal,deptno FROM emp WHERE sal> (SELECT MAX(sal) FROM emp WHERE deptno=30);查询工资比部门号为
EMP" set "SAL" = '0' where "EMPNO" = '7369' and "SAL" = '800' and ROWID = 'AAAR3xAAEAAAACXAAA'; update EMP" set "SAL" = '0' where "EMPNO" = '7499' and "SAL" = '1600' and ROWID = 'AAAR3xAAEAAAACXAAB'; update EMP" set "SAL" = '0' where "EMPNO" = '7900' and "SAL" = '950' and ROWID = 'AAAR3xAAEAAAACXAAL'; update EMP" set "SAL" = '800' where "EMPNO" = '7369' and "SAL" = '0' and ROWID = 'AAAR3xAAEAAAACXAAA'; update EMP" set "SAL" = '1300' where "EMPNO" = '7934' and "SAL" = '0' and ROWID = 'AAAR3xAAEAAAACXAAN'; 6.9、
*12 as annual_sal from emp;与select ename,sal*12 "annual sal" from emp;区别,加双引号保持原大小写。 *12 annual_sal from emp where ename not like '_A%' and sal>800 order by sal desc; select sal from emp where sal>888.88 无错.但 select sal from emp where sal>$1,250,00; select ename,sal from emp where sal>(select avg(sal) from emp); 查找每个部门挣钱最多的那个人的名字. from emp where sal not in( select distinct e1.sal from emp e1 join emp e2 on (e1.sal<e2.sal)
显示平均工资为>2000的职位 select job,avg(sal) from emp group by job having avg(sal)>2500; 2. (sal)>3000; 3. 找每一个部门的最高和最低的工资 Select deptno,max(sal),min(sal) From emp group by deptno; 4. ,max(sal),min(sal) from emp where job is notnull group by job,deptno; 5. 最低工资及工资的和 select avg(sal),max(sal),min(sal),sum(sal) from emp where job like ‘%MAN%’; 6.
DUAL CONNECT BY LEVEL<=10000; UPDATE T_ST_20170604_LHR SET SAL=5000 WHERE SAL BETWEEN 6 AND 9995; - -9990 CREATE INDEX T_ST_20170604_LHR_SAL ON T_ST_20170604_LHR(SAL); EXEC DBMS_STATS.GATHER_TABLE_STATS 这种显示说明列SAL没有直方图信息,从DBA_TAB_COL_STATISTICS的HISTOGRAM列值为NONE也说明列SAL没有直方图。 SYS@orclasm > SELECT SAL ENDPOINT_VALUE,SUM(COUNT(*)) OVER(ORDER BY SAL RANGE UNBOUNDED PRECEDING) ENDPOINT_NUMBER 下面重新对列SAL收集直方图,让Bucket的数量为9,小于SAL列的DISTINCT的值,那么Oracle会收集高度直方图。
1.知识点:可以对照下面的录屏进行阅读 SQL> --组函数类型:avg,count,max,min,sum SQL> --工资总额 SQL> select sum(sal) from emp; SQL> --员工人数 SQL> select count(*) from emp; SQL> --平均工资 SQL> select sum(sal)/count(*) 一, avg(sal) 二 from *),count(nvl(comm,0)) from emp; --结果相同,count(comm)统计所有结果 SQL> --求各个部门的平均工资 SQL> select deptno,avg(sal group by子句中 SQL> --包含在group by子句中的列不必包含在select列表中 SQL> --按部门,不同的职位统计平均工资 SQL> select deptno,job,avg(sal SQL> select deptno,avg(sal) 2 from emp 3 group by deptno 4 having deptno=10; SQL> --SQL优化
php class employee{ protected $sal=3000; public function getSal(){ $this->sal = $this->sal + 1200; return $this->sal ; } } class Manager extends employee $this->sal = $this->sal + 1500; return $this->sal ; } } $emp = new employee() > 程序运行结果: 1 PHP 5.2.9 2 5000 3 parent's $sal 3000 打开zend调试状态看看,内存中的情况。注意最下面,有两个$sal 。 > 程序运行结果: 1 PHP 5.2.9 2 3000 将父类的属性$sal 改成 protected ,子类重写了父类的属性。在内存中只有一个 $sal 。 <?
E.DEPTNO, MAX(E.SAL) OVER(PARTITION BY E.DEPTNO) MAX_SAL FROM TEMP_EMP E; 说明: (1)聚合函数用group , SUM(E.SAL) OVER(PARTITION BY E.DEPTNO) SUM_SAL FROM TEMP_EMP E; 3、查询各员工的工资,附带部门按姓名排序的工资加和 (2)窗口指定到该分组中的第一行数据到当前行 4、LAG函数 SELECT E.DEPTNO, E.SAL A, LAG(E.SAL,1,E.SAL) OVER(ORDER N行的数据作为独立的一列 6、LAG函数和LEAD函数的NULL SELECT E.DEPTNO, E.SAL A, LAG(E.SAL, 1, NULL) OVER(ORDER , E.SAL, E.DEPTNO, RANK() OVER(PARTITION BY E.DEPTNO ORDER BY E.SAL) ERANK FROM TEMP_EMP
('factor = ' || factor); DBMS_OUTPUT.PUT_LINE('sal = ' || sal); DBMS_OUTPUT.PUT_LINE('sal_multiple = 12000 factor = 3 sal = 7000 sal_multiple = 14000 factor = 4 sal = 8000 sal_multiple = 16000 2 使用sys_refcursor = 6000 sal_multiple = 12000 factor = 3 sal = 7000 sal_multiple = 14000 factor = 4 sal = 8000 sal_multiple = 12000 factor = 3 sal = 7000 sal_multiple = 14000 factor = 4 sal = 8000 sal_multiple = 16000 3 使用包定义的 = 6000 sal_multiple = 12000 factor = 3 sal = 7000 sal_multiple = 14000 factor = 4 sal = 8000 sal_multiple
SELECT e2.empno,e2.ename,e2.sal FROM t_emp e1 JOIN t_emp e2 WHERE e2.sal>=AVG(e1.sal); SELECT e.empno ,e.ename,e.sal FROM t_emp e JOIN (SELECT AVG(sal) avg FROM t_emp) t ON e.sal>=t.avg; 查询 RESEARCH 部门的 SELECT COUNT(*),MAX(e.sal),MIN(e.sal),AVG(e.sal), AVG(DATEDIFF(NOW(),e.hiredate)/365) FROM t_emp e JOIN SELECT COUNT(*),MAX(e.sal),MIN(e.sal),AVG(e.sal), FLOOR(AVG(DATEDIFF(NOW(),e.hiredate)/365)) FROM t_emp SELECT e.job, MAX(e.sal+IFNULL(e.comm,0)), MIN(e.sal+IFNULL(e.comm,0)), AVG(e.sal+IFNULL(e.comm,0)),
select ename,sal,comm,sal*12+ifnull(comm,0) 年薪 from emp order by 年薪 desc; 显示工资最高的员工的名字和工作岗位 select * from emp where sal=(select max(sal) from emp); 显示工资高于平均工资的员工信息 select * from emp where sal > (select avg(sal) from emp); 显示每个部门的平均工资和最高工资 select deptno, max(sal)最高,format(avg(sal),2) 平均 from emp group sal)<2000; -- select deptno,avg(sal) 平均工资 from emp group by deptno having 平均工资<2000; 显示每种岗位的雇员总数,平均工资 > (select max(sal) from emp where deptno=30); 第二种做法: select * from emp where sal>all(select distinct
DATE NOT NULL, sal_id NUMBER NOT NULL, sal_row NUMBER(12) NOT NULL) partition by range(sal_date) ( partition sal_11 values less than(to_date('2012-01-01','YYYY-MM-DD')) , partition sal_12 values sal_15 values less than(to_date('2016-01-01','YYYY-MM-DD')) , partition sal_16 values less than(to_date ---------- 2873 SQL> select * from tb_pt partition(sal_12) where rownum < 3; SAL_DATE SAL_ID SAL_ROW _11 300 rows exported . . exporting partition SAL_12 366 rows exported . . exporting partition SAL_