UNION ALL returning wrong results?

有应用人员反映某套Linux上的11.2.0.1数据库系统中出现了UNION ALL后返回的结果集不正确的问题,我们具体分析下出现问题的其中一条语句:

SELECT MTL_SECONDARY_INVENTORIES.SECONDARY_INVENTORY_NAME,MTL_SECONDARY_INVENTORIES.ORGANIZATION_ID,MTL_SECONDARY_INVENTORIES.DESCRIPTION,MTL_SECONDARY_INVENTORIES.AVAILABILITY_TYPE,MTL_SECONDARY_INVENTORIES.MATERIAL_ACCOUNT,MTL_SECONDARY_INVENTORIES.MATERIAL_OVERHEAD_ACCOUNT,MTL_SECONDARY_INVENTORIES.RESOURCE_ACCOUNT,MTL_SECONDARY_INVENTORIES.OVERHEAD_ACCOUNT,MTL_SECONDARY_INVENTORIES.OUTSIDE_PROCESSING_ACCOUNT,MTL_SECONDARY_INVENTORIES.ASSET_INVENTORY,MTL_SECONDARY_INVENTORIES.EXPENSE_ACCOUNT,MTL_SECONDARY_INVENTORIES.ENCUMBRANCE_ACCOUNT,MTL_SECONDARY_INVENTORIES.ATTRIBUTE3,MTL_SECONDARY_INVENTORIES.ATTRIBUTE5,WORKFLOW_START_TIMES.WORKFLOW_START_TIMEFROM REPEMEAERP.MTL_SECONDARY_INVENTORIES,REPEMEAERP.WORKFLOW_START_TIMESWHERE MTL_SECONDARY_INVENTORIES.DW_UPDATE_DT >TO_DATE('01/01/1900 00:00:00', 'MM/DD/YYYY HH24:MI:SS')AND MTL_SECONDARY_INVENTORIES.DW_UPDATE_DT <=WORKFLOW_START_TIMES.WORKFLOW_START_TIMEAND WORKFLOW_START_TIMES.WORKFLOW_NAME =LTRIM(RTRIM('w_int_FreqBatch_EMEA'))
/*以上是QUERY A*/
UNION ALL
/*以下是QUERY B*/
SELECT DISTINCT 'WORKORDERS',MTL_SECONDARY_INVENTORIES.ORGANIZATION_ID,'WORK ORDERS WITH WIP AS CATEGORY VALUE',1,0,0,0,0,0,1,0,0,'MOI','0',WORKFLOW_START_TIMES.WORKFLOW_START_TIMEFROM REPEMEAERP.MTL_SECONDARY_INVENTORIES, EIMMAINT.WORKFLOW_START_TIMESWHERE MTL_SECONDARY_INVENTORIES.DW_UPDATE_DT >TO_DATE('01/01/1900 00:00:00', 'MM/DD/YYYY HH24:MI:SS')AND MTL_SECONDARY_INVENTORIES.DW_UPDATE_DT <=WORKFLOW_START_TIMES.WORKFLOW_START_TIMEAND WORKFLOW_START_TIMES.WORKFLOW_NAME =LTRIM(RTRIM('w_int_FreqBatch_EMEA'))
/
138 rows selected.
以上查询语句中,QUERY A部分(也就是UNION ALL之前的SELECT语句)单独查询时返回返回69条记录,QUERY B部分单独查询时返回15记录,UNION ALL后返回的结果却是138条记录,而非84条记录。实际上这套系统也是最近才从10g迁移到11gr2上,之前在10g中同样的应用没有出过类似的问题,可以猜测是11g中新引入的某种特性存在可能引发wrong result的Bug。 具体思路虽然有了,但仍无法确定问题的关键所在;我们来看看该SQL的执行计划:
-----------------------------------------------------------------------------------------------------------------
| Id  | Operation                       | Name                          | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                |                               |     7 |  2443 |    52   (0)| 00:00:01 |
|   1 |  NESTED LOOPS                   |                               |     7 |  2443 |    52   (0)| 00:00:01 |
|*  2 |   TABLE ACCESS FULL             | WORKFLOW_START_TIMES          |     1 |    29 |    48   (0)| 00:00:01 |
|   3 |   VIEW                          | VW_JF_SET$9BAED2EA            |     1 |   320 |     4   (0)| 00:00:01 |
|   4 |    UNION ALL PUSHED PREDICATE   |                               |       |       |            |          |
|*  5 |     FILTER                      |                               |       |       |            |          |
|   6 |      TABLE ACCESS BY INDEX ROWID| MTL_SECONDARY_INVENTORIES     |     3 |   336 |     2   (0)| 00:00:01 |
|*  7 |       INDEX RANGE SCAN          | IDX_MTL_SECONDARY_INVENTORIES |     1 |       |     1   (0)| 00:00:01 |
|*  8 |     FILTER                      |                               |       |       |            |          |
|   9 |      TABLE ACCESS BY INDEX ROWID| MTL_SECONDARY_INVENTORIES     |     3 |    36 |     2   (0)| 00:00:01 |
|* 10 |       INDEX RANGE SCAN          | IDX_MTL_SECONDARY_INVENTORIES |     1 |       |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------2 - filter("WORKFLOW_START_TIMES"."WORKFLOW_NAME"='w_int_FreqBatch_EMEA')
5 - filter(TO_DATE(' 1900-01-01 00:00:00', 'syyyy-mm-dd
hh24:mi:ss')<"WORKFLOW_START_TIMES"."WORKFLOW_START_TIME") 7 - access("MTL_SECONDARY_INVENTORIES"."DW_UPDATE_DT">TO_DATE(' 1900-01-01 00:00:00', 'syyyy-mm-dd
hh24:mi:ss') AND "MTL_SECONDARY_INVENTORIES"."DW_UPDATE_DT"<="WORKFLOW_START_TIMES"."WORKFLOW_START_TIME"
)
8 - filter(TO_DATE(' 1900-01-01 00:00:00', 'syyyy-mm-dd
hh24:mi:ss')<"WORKFLOW_START_TIMES"."WORKFLOW_START_TIME") 10 - access("MTL_SECONDARY_INVENTORIES"."DW_UPDATE_DT">TO_DATE(' 1900-01-01 00:00:00', 'syyyy-mm-dd
hh24:mi:ss') AND "MTL_SECONDARY_INVENTORIES"."DW_UPDATE_DT"<="WORKFLOW_START_TIMES"."WORKFLOW_START_TIME"
)
你可能从以上执行计划中发现了两处十分陌生的字眼:UNION ALL  PUSHED PREDICATE和VW_JF_SET$。它们是什么!? 先来说说JF,JF是join factorization的缩写,你可以把它翻译作链接因式分解,如果你学过离散数学或者数据库原理的话,那么这种在11.2.0.1中最新推出的基于成本的变换操作对你来说并不陌生。用公式的样式来表达大概是下面这样:

YYA,YYB和YYC是3个关联的数据对象亦或者是3个关联的结果集;
(YYA JOIN YYB) UNION [ALL] (YYA JOIN YYC)
可以转换成为:
YYA JOIN (YYB UNION [ALL] YYC)
这样做YYA部分只需要读取一次,还可以少做一次JOIN,听上去是挺不错的吧! 下面我们来看一个Oracle使用join factorization的十分简单的实例:

SQL> select * from v$version;BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - ProductionSQL> drop table yya;drop table yya*ERROR at line 1:ORA-00942: table or view does not existSQL> drop table yyb;drop table yyb*ERROR at line 1:ORA-00942: table or view does not existSQL> create table yya as select rownum id1,rownum id2,rownum id3 from dual connect by level<=20000;
Table created.
SQL> create table yyb as select rownum id1,rownum id2,rownum id3 from dual connect by level<=20000;
Table created.SQL> explain plan for
2  select * from yya ,yyb where yya.id1=yyb.id1
3  union all
4  select * from yya, yyb where yya.id1=yyb.id1;Explained.SQL> set linesize 100 pagesize 1400;SQL> select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value: 744914999-------------------------------------------------------------------------------------------
| Id  | Operation            | Name               | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |                    | 40000 |  2500K|    49   (3)| 00:00:01 |
|*  1 |  HASH JOIN           |                    | 40000 |  2500K|    49   (3)| 00:00:01 |
|   2 |   TABLE ACCESS FULL  | YYA                | 20000 |   234K|    16   (0)| 00:00:01 |
|   3 |   VIEW               | VW_JF_SET$6E3F6682 | 40000 |  2031K|    32   (0)| 00:00:01 |
|   4 |    UNION-ALL         |                    |       |       |            |          |
|   5 |     TABLE ACCESS FULL| YYB                | 20000 |   761K|    16   (0)| 00:00:01 |
|   6 |     TABLE ACCESS FULL| YYB                | 20000 |   761K|    16   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------1 - access("YYA"."ID1"="ITEM_1")/*执行计划中出现了VW_JF_SET$F22B2A93,Oracle选择了使用join factorization,该执行计划总成本49*/SQL> alter session set "_optimizer_join_factorization"=false;Session altered./*隐藏参数_optimizer_join_factorization决定了优化器是否可以选用join factorization,现在我们禁用它*/
SQL> explain plan for2  select * from yya join yyb on yya.id1=yyb.id13  union all4  select * from yya join yyb on yya.id1=yyb.id1;Explained.SQL> select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value: 3439541885----------------------------------------------------------------------------
| Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      | 40000 |  1992K|    66  (52)| 00:00:01 |
|   1 |  UNION-ALL          |      |       |       |            |          |
|*  2 |   HASH JOIN         |      | 20000 |   996K|    33   (4)| 00:00:01 |
|   3 |    TABLE ACCESS FULL| YYA  | 20000 |   234K|    16   (0)| 00:00:01 |
|   4 |    TABLE ACCESS FULL| YYB  | 20000 |   761K|    16   (0)| 00:00:01 |
|*  5 |   HASH JOIN         |      | 20000 |   996K|    33   (4)| 00:00:01 |
|   6 |    TABLE ACCESS FULL| YYA  | 20000 |   234K|    16   (0)| 00:00:01 |
|   7 |    TABLE ACCESS FULL| YYB  | 20000 |   761K|    16   (0)| 00:00:01 |
----------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------2 - access("YYA"."ID1"="YYB"."ID1")5 - access("YYA"."ID1"="YYB"."ID1")
/*禁用链接因式分解后,Oracle使用了常规的"笨办法",成本上升到66*//*有趣的是下面的测试*/SQL> alter session set "_optimizer_join_factorization"=true;Session altered.SQL> create table yyc as select * from yyb;Table created.SQL> explain plan for2  select * from yya,yyc where yya.id1=yyc.id13  union all4  select * from yya,yyb where yya.id1=yyb.id1;Explained.SQL>  select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value: 4240055274----------------------------------------------------------------------------
| Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      | 40000 |  1992K|    66  (52)| 00:00:01 |
|   1 |  UNION-ALL          |      |       |       |            |          |
|*  2 |   HASH JOIN         |      | 20000 |   996K|    33   (4)| 00:00:01 |
|   3 |    TABLE ACCESS FULL| YYA  | 20000 |   234K|    16   (0)| 00:00:01 |
|   4 |    TABLE ACCESS FULL| YYC  | 20000 |   761K|    16   (0)| 00:00:01 |
|*  5 |   HASH JOIN         |      | 20000 |   996K|    33   (4)| 00:00:01 |
|   6 |    TABLE ACCESS FULL| YYA  | 20000 |   234K|    16   (0)| 00:00:01 |
|   7 |    TABLE ACCESS FULL| YYB  | 20000 |   761K|    16   (0)| 00:00:01 |
----------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------2 - access("YYA"."ID1"="YYC"."ID1")5 - access("YYA"."ID1"="YYB"."ID1")
/*confused,Oracle有什么理由在这里反而不用join factorization了呢?看起来短期内join factorization的实际应用还有待"商榷"
*//*10053事件能解释这一问题吗?*/
SQL> alter system flush shared_pool;System altered.SQL> oradebug setmypid;
Statement processed.
SQL> oradebug event 10053 trace name context forever,level 1;
Statement processed.
SQL> explain plan for2  select * from yya join yyb on yya.id1=yyb.id13  union all4  select * from yya join yyc on yya.id1=yyc.id1;Explained.SQL> oradebug event 10053 trace name context off;
Statement processed.
SQL> oradebug tracefile_name;
/home/maclean/app/maclean/diag/rdbms/prod/PROD/trace/PROD_ora_7907.trcview /home/maclean/app/maclean/diag/rdbms/prod/PROD/trace/PROD_ora_7907.trc
***********************************
Cost-Based Join Factorization
***********************************
Join-Factorization on query block SET$1 (#1)
JF: Using search type: exhaustive
JF: Generate basic transformation units
Validating JF unit: (branch: {2, 3} table: {YYA, YYA})rejected: join predicates do not matchJF: Generate transformation units from basic units
JF: No state generated.
/*优化器认为其链接谓词不符合使用join  factorization的条件,JF题案被驳回,"悬案"!*/
join factorization是很棒的新技术,这点没错,但新技术往往又是horrible(可怕的),最近我常用这个词。我们的问题是不是这个新来的引起的呢?通过join factorization关键字检索MOS,可以发现一个今年(2010)3月出现的Bug 9504322,quote:
Hdr: 9504322 11.2.0.1 RDBMS 11.2.0.1 QRY OPTIMIZER PRODID-5 PORTID-226 Abstract: WRONG RESULTS WITH UNION_ALL AND INLINE VIEWS *** 03/24/10 05:38 am *** PROBLEM: -------- Wrong results on 11.2 for queries of type: SELECT * FROM ( SELECT ... FROM view, table WHERE ... UNION ALL SELECT ... FROM view, table WHERE NOT ... ); DIAGNOSTIC ANALYSIS: -------------------- Problem seen between 10.2.0.4 and 11.2.0.1. If we remove the use of inline view the correct results are returned. WORKAROUND: ----------- N/A RELATED BUGS: ------------- REPRODUCIBILITY: ---------------- It is reproducing on generic 11.2.0.1
呵呵,似乎有点眉目了,不过实践是检验真理的唯一标准:
SQL> alter session set "_optimizer_join_factorization"=true;Session altered.SELECT MTL_SECONDARY_INVENTORIES.SECONDARY_INVENTORY_NAME,MTL_SECONDARY_INVENTORIES.ORGANIZATION_ID,MTL_SECONDARY_INVENTORIES.DESCRIPTION,MTL_SECONDARY_INVENTORIES.AVAILABILITY_TYPE,MTL_SECONDARY_INVENTORIES.MATERIAL_ACCOUNT,MTL_SECONDARY_INVENTORIES.MATERIAL_OVERHEAD_ACCOUNT,MTL_SECONDARY_INVENTORIES.RESOURCE_ACCOUNT,MTL_SECONDARY_INVENTORIES.OVERHEAD_ACCOUNT,MTL_SECONDARY_INVENTORIES.OUTSIDE_PROCESSING_ACCOUNT,MTL_SECONDARY_INVENTORIES.ASSET_INVENTORY,MTL_SECONDARY_INVENTORIES.EXPENSE_ACCOUNT,MTL_SECONDARY_INVENTORIES.ENCUMBRANCE_ACCOUNT,MTL_SECONDARY_INVENTORIES.ATTRIBUTE3,MTL_SECONDARY_INVENTORIES.ATTRIBUTE5,WORKFLOW_START_TIMES.WORKFLOW_START_TIMEFROM REPEMEAERP.MTL_SECONDARY_INVENTORIES,REPEMEAERP.WORKFLOW_START_TIMESWHERE MTL_SECONDARY_INVENTORIES.DW_UPDATE_DT >TO_DATE('01/01/1900 00:00:00', 'MM/DD/YYYY HH24:MI:SS')AND MTL_SECONDARY_INVENTORIES.DW_UPDATE_DT <=WORKFLOW_START_TIMES.WORKFLOW_START_TIMEAND WORKFLOW_START_TIMES.WORKFLOW_NAME =LTRIM(RTRIM('w_int_FreqBatch_EMEA'))
/*以上是QUERY A*/
UNION ALL
/*以下是QUERY B*/
SELECT DISTINCT 'WORKORDERS',MTL_SECONDARY_INVENTORIES.ORGANIZATION_ID,'WORK ORDERS WITH WIP AS CATEGORY VALUE',1,0,0,0,0,0,1,0,0,'MOI','0',WORKFLOW_START_TIMES.WORKFLOW_START_TIMEFROM REPEMEAERP.MTL_SECONDARY_INVENTORIES, EIMMAINT.WORKFLOW_START_TIMESWHERE MTL_SECONDARY_INVENTORIES.DW_UPDATE_DT >TO_DATE('01/01/1900 00:00:00', 'MM/DD/YYYY HH24:MI:SS')AND MTL_SECONDARY_INVENTORIES.DW_UPDATE_DT <=WORKFLOW_START_TIMES.WORKFLOW_START_TIMEAND WORKFLOW_START_TIMES.WORKFLOW_NAME =LTRIM(RTRIM('w_int_FreqBatch_EMEA'))
/138 rows selected.
结果和我们猜想的大相径庭,join factorization并非罪魁,找不到终点让我们回到原点。 至此UNION ALL PUSHED PREDICATE有了极大的嫌疑,什么是PUSH PREDICATE?我把它叫做谓词前推,这玩样最早出现在10g上,但一直问题多多!它到底是何种OPERATION呢?让我们来看看下面的例子:

SQL> select * from v$version;BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - ProductionSQL> create table youyus (t1 int,t2 varchar2(20));Table created.SQL> alter table youyus add primary key(t1);Table altered.SQL> explain plan for2  select *3    from youyus4  union all5  select * from youyus;Explained.
/*在之后的语句中将用到这个子查询*/
SQL> select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value: 1959159425-----------------------------------------------------------------------------
| Id  | Operation          | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |        |     2 |    50 |     4  (50)| 00:00:01 |
|   1 |  UNION-ALL         |        |       |       |            |          |
|   2 |   TABLE ACCESS FULL| YOUYUS |     1 |    25 |     2   (0)| 00:00:01 |
|   3 |   TABLE ACCESS FULL| YOUYUS |     1 |    25 |     2   (0)| 00:00:01 |
-----------------------------------------------------------------------------
/*在之后的语句中将用到这个子查询,这里它的"原始"执行计划十分简单*/SQL> explain plan for2  select v2.t1, v2.t23    from (select t1 from youyus where rownum=1) v1,4         (select *5            from youyus6          union all7          select * from youyus) v28   where v1.t1 = v2.t1;Explained.SQL> select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value: 2456530141-----------------------------------------------------------------------------------------------
| Id  | Operation                      | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |              |     1 |    27 |     1   (0)| 00:00:01 |
|   1 |  NESTED LOOPS                  |              |     1 |    27 |     1   (0)| 00:00:01 |
|   2 |   VIEW                         |              |     1 |    13 |     1   (0)| 00:00:01 |
|*  3 |    COUNT STOPKEY               |              |       |       |            |          |
|   4 |     INDEX FULL SCAN            | SYS_C0010819 |     1 |    13 |     1   (0)| 00:00:01 |
|   5 |   VIEW                         |              |     1 |    14 |     0   (0)| 00:00:01 |
|   6 |    UNION ALL PUSHED PREDICATE  |              |       |       |            |          |
|   7 |     TABLE ACCESS BY INDEX ROWID| YOUYUS       |     1 |    25 |     0   (0)| 00:00:01 |
|*  8 |      INDEX UNIQUE SCAN         | SYS_C0010819 |     1 |       |     0   (0)| 00:00:01 |
|   9 |     TABLE ACCESS BY INDEX ROWID| YOUYUS       |     1 |    25 |     0   (0)| 00:00:01 |
|* 10 |      INDEX UNIQUE SCAN         | SYS_C0010819 |     1 |       |     0   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------3 - filter(ROWNUM=1)8 - access("YOUYUS"."T1"="V1"."T1")10 - access("YOUYUS"."T1"="V1"."T1")
/* PUSHED PREDICATE将谓词逻辑前推到UNION ALL的子查询中,其优势在于可以避免全表扫描,利用索引*/SQL> set linesize 100 pagesize 1400;
SQL>
SQL> explain plan for2  select /*+ no_push_pred(v2) */ v2.t1, v2.t23    from (select t1 from youyus where rownum=1) v1,4         (select *5            from youyus6          union all7          select * from youyus) v28   where v1.t1 = v2.t1;Explained.SQL> select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value: 2769827061-------------------------------------------------------------------------------------
| Id  | Operation            | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |              |     1 |    38 |     6  (17)| 00:00:01 |
|*  1 |  HASH JOIN           |              |     1 |    38 |     6  (17)| 00:00:01 |
|   2 |   VIEW               |              |     1 |    13 |     1   (0)| 00:00:01 |
|*  3 |    COUNT STOPKEY     |              |       |       |            |          |
|   4 |     INDEX FULL SCAN  | SYS_C0010819 |     1 |    13 |     1   (0)| 00:00:01 |
|   5 |   VIEW               |              |     2 |    50 |     4   (0)| 00:00:01 |
|   6 |    UNION-ALL         |              |       |       |            |          |
|   7 |     TABLE ACCESS FULL| YOUYUS       |     1 |    25 |     2   (0)| 00:00:01 |
|   8 |     TABLE ACCESS FULL| YOUYUS       |     1 |    25 |     2   (0)| 00:00:01 |
-------------------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------1 - access("V1"."T1"="V2"."T1")3 - filter(ROWNUM=1)
/*no_push_pred hint让Oracle 放弃使用PUSHED PREDICATE,使用常规UNION-ALL操作后,子查询执行计划回归成全表扫描,整个计划成本上升*/

转载于:https://www.cnblogs.com/macleanoracle/archive/2010/08/06/2967489.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263833.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android jni java类型与c语言类型互换

1.java String转换 C str char* Jstring2CStr(JNIEnv* env, jstring jstr) {char* rtn NULL;jclass clsstring (*env)->FindClass(env,"java/lang/String");jstring strencode (*env)->NewStringUTF(env,"GB2312");jme…

zip:命令行下zip压缩/解压缩

在Ubuntu 18.04下验证&#xff0c;造冰箱的大熊猫cnblogs 2019/6/6 1压缩单个文件zip package.zip file2压缩多个文件zip package.zip file1 file23压缩单个文件夹zip -r package.zip folder4压缩多个文件夹zip -r package.zip folder1 folder25压缩文件、文件夹zip -r package…

inv(a) matlab,在MATLAB中,inv(A)表示的是()

在MATLAB中&#xff0c;inv(A)表示的是()答&#xff1a;矩阵A的逆下列不属于植物生长调节剂的是( )。答&#xff1a;DDTHe received four years of training in English and two years in English teaching.He is a _______ English instructor.答&#xff1a;qualified第五章&…

TSQL与PL/SQL的比较

TSQL与PL/SQL的比较 以前一直用mssql 做开发&#xff0c;最近的项目都Oracle, 1)数据类型 TSQL PL/SQL numeric(p,s) numeric(p,s) or NUMBER(p,s) decimal(p,s) decimal(p,s) or NUMBER(p,s) char(m) Char(m) varchar(m) varchar2(m) datetime date…

前端文件表单/ajax上传实例代码

表单上传文件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>测试文件上传</title> </head> <body> <form action"/attach/upload" enctype"multipart/form-dat…

matlab2012生成dll,64位win7下vc2010如何调用matlab2012a中生成的dll文件

本文说是原创&#xff0c;但核心部分是参考http://blog.sina.com.cn/s/blog_a5fdbf0101018n91.html(大家可以先看看这篇文章)&#xff0c;在此再次感谢debug童鞋。debug童鞋的系统是 win7 32位 vc2010 (32位编译器) Matlab2012a &#xff0c;如果童鞋们win7是32位的话就不必…

CentOS/Linux 卸载MATLAB

rm -rf /usr/local/MATLAB/R2012arm /usr/local/bin/matlab /usr/local/bin/mcc /usr/local/bin/mex /usr/local/bin/mbuild

.NET中的正则表达式 (三)RegexCompilationInfo 类

RegexCompilationInfo 类 提供编译器用于将正则表达式编译为独立程序集的信息。 属性 IsPublic&#xff1a;获取或设置一个值&#xff0c;该值指示所编译的正则表达式是否具有公共可见性。 Name&#xff1a;获取或设置用于所编译的正则表达式的类型名称。 Namespace&#xff1a…

DOCKER - 容器抓包

https://help.aliyun.com/knowledge_detail/40564.html?spma2c4e.11153940.blogcont272172.10.b09e28a6AOdITp#Linux http://man7.org/linux/man-pages/man1/nsenter.1.html?spma2c4e.11153940.blogcont272172.9.b09e28a6AOdITp [转]待整理 nsenter nsenter 包含在绝大部分 L…

高仿QQ即时聊天软件开发系列之三登录窗口用户选择下拉框

上一篇高仿QQ即时聊天软件开发系列之二登录窗口界面写了一个大概的布局和原理 这一篇详细说下拉框的实现原理 先上最终效果图 一开始其实只是想给下拉框加一个placeholder效果&#xff0c;让下拉框在未选择未输入时显示一个提示字符串。由于Background对ComboBox无效&#xff0…

Nokia7610彩信设置

1. 进入功能表—工具—设置—连接设置 2. 进入接入点&#xff0c;按“选项”—“新增接入点”—“使用默认设置”。 3. 自定义连接名称&#xff0c;可为&#xff1a;中国移动彩信&#xff0c;数据承载方式&#xff1a;GPRS 接入点名称&#xff1a;cmwap 4. 用户名、提示输入…

matlab guidata两个,Matlab

%在控件本身函数中用hObject调用%在别的函数中&#xff0c;需要使用handles调用function varargout TestGUI(varargin)% TESTGUI MATLAB code for TestGUI.fig% TESTGUI, by itself, creates a new TESTGUI or raises the existing% singleton*.%% H TESTGUI …

spring boot jar包替换报错之Unable to open nested entry 'BOOT-INF/lib/cache-api-0.4.jar'.

spring boot用layout ZIP打出来的包能够支持外部classpath&#xff0c;但是当用rar/7zip替换其中的jar后&#xff0c;报下列错误&#xff1a; Unable to open nested entry BOOT-INF/lib/cache-api-0.4.jar. It has been compressed and nested jar files must be stored witho…

hadoop博客 oschina

http://my.oschina.net/Xiao629/blog?catalog449279

php用json交换二维数组,PHP和Javascript的JSON交互(处理一个二维数组)

我不得不承认&#xff1a;我是一个彻彻底底的JS白痴。但根据项目需要&#xff0c;不得不使用JSON&#xff0c;不管怎么说&#xff0c;经过一个晚上的学习&#xff0c;已经略有所成&#xff0c;记录下来。PHP的JSON类库我使用的是Services_JSON&#xff0c;没什么特别的优点&…

RoRoWoBlog 开源博客系统介绍

萝萝窝个人博客开源项目 以Asp.net MVC 2.0 ADO.Net Entity Framework 4.0 Unity 2.0 MvcPager JQuery 等技术框架&#xff0c;开发的个人博客系统。 支持MetaWeblog接口 通过MetaWeblog接口&#xff0c;可以将您个人博客系统中的博文&#xff0c;直接同步到您其它网站的博…

Python基础:模块化来搭项目

简单模块化 import 最好在最顶端sys.path.append("..")表示把当前程序所在位置向上提了一级在python3规范中&#xff0c;__init__.py并不是必须的。文件结构&#xff1a; . ├── utils │ ├── util.py │ └── class_util.py ├── src │ └── sub_…

(原)离开,只为更好的活着

序&#xff09;经过长时间的失眠&#xff0c;辗转反侧&#xff0c;开始默默的写下一篇文章&#xff0c;我不知道以后是怎样的方向&#xff0c;不过明天依旧会天亮。 入职&#xff09;那最初的梦想 有位朋友说&#xff0c;找工作一定不要找初创公司&#xff0c;那样你会疯狂的加…

Flask入门到放弃(四)—— 数据库

转载请在文章开头附上原文链接地址&#xff1a;https://www.cnblogs.com/Sunzz/p/10979970.html 数据库操作 ORM ORM 全拼Object-Relation Mapping&#xff0c;中文意为 对象-关系映射。主要实现模型对象到关系数据库数据的映射 优点 : 只需要面向对象编程, 不需要面向数据库编…

virtualbox安装centos6.5碰到的问题

今天无聊用virtualbox安装centos6.5 , 自己笔记本vm撑不住, 用公司的试试virtualbox先 安装快完成时 没有足够的内存配置kdump”&#xff08;在英文界面下提示的是“insufficient memory to configure kdump”&#xff09; 出现这个提示, 解决办法, 按这篇博客可以解决, 简单点…