MySQL与Oracle 差异比较之七 其它
其它
1、 2、 oracle使用数组步骤: ENDLOOP;
编号
类别
ORACLE
MYSQL
注释
1
内连接的更改
selecta.*,b.*,c.*,d.*
froma,b,c,d
wherea.id=b.id
anda.nameisnotnull
anda.id=c.id(+)
anda.id=d.id(+)
"(+)"所在位置的另一侧为连接的方向,
所以上面的例子1是左连接。
以下的例子2既是右连接。
selecta.*,b.*,c.*,d.*
froma,b,c,d
wherea.id=b.id
anda.nameisnotnull
anda.id(+)=c.id方法一
selecta.*,c.*,d.*
froma
leftjoin(c,d)
on(a.id=c.idanda.id=d.id),b
wherea.id=b.id
anda.nameisnotnull
方法二
selecta.*,c.*,d.*
froma
leftjoincona.id=c.id
leftjoindona.id=d.id,b
wherea.id=b.id
anda.nameisnotnulloraclesql语句和mysqlsql语句有一定的区别.
1.oracle左连接,右连接可以使用(+)来实现.
Mysql只能使用leftjoin,rightjoin等关键字.
2
最后一句执行的sqlstatement所取得或
影响的条数SQL%ROWCOUNT
执行select语句后用:FOUND_ROWS()
执行updatedeleteinsert语句后用:
ROW_COUNT(). oracle中:
sql表示最后一句执行的SQLStatement,rowcount表示該SQL所取得或影响的条数.
Mysql中:
执行select语句后查询所影响的条数用:FOUND_ROWS()
执行updatedeleteinsert语句后查询所影响的条数用:ROW_COUNT()
3
查询分页
SELECTt1.*
FROM
(SELECTMSG_INT_KEY,
MSG_TY,
MSG_CD,
ROWNUMROW_NUM
FROMSD_SYS_MSG
WHERE(ii_msg_int_keyISNULL
ORmsg_int_key=ii_msg_int_key)
ORDERBYMSG_CD
)t1
WHERE(in_page_noISNULL)
OR(t1.ROW_NUM>
((in_page_no-1)*li_per_page_amt)
ANDt1.ROW_NUM<
(in_page_no*li_per_page_amt+1)
);方法:使用循环变量替换oracle中ROWNUM
set@mycnt=0;
SELECT(@mycnt:=@mycnt+1)asROW_NUM,t1.*
FROM
(SELECT MSG_INT_KEY, MSG_TY, MSG_CD, ROWNUMROW_NUM
FROMSD_SYS_MSG
WHERE(ii_msg_int_keyISNULLORmsg_int_key =ii_msg_int_key)
ORDERBYMSG_CD
)t1
WHERE(in_page_noISNULL)
OR(t1.ROW_NUM>((in_page_no-1)*li_per_page_amt)
ANDt1.ROW_NUM<(in_page_no*li_per_page_amt+1)
);
4
javanull值
""作为参数传入后,在oracle中将识别为null
""作为参数据传mysql还是""
现在java代码需要修改:
inPara.add(MSG_TY.equals("")?null:MSG_TY);
5
执行动态sql
lv_sql:='SELECT'||'distinct'||iv_cd_field_name||'FIELD1'||
'FROM'||iv_table_name||
'WHERE'||NVL(iv_where_cause,'1=1');
OPENl_sys_curFORlv_sql; set@a=iv_cd_field_name;
set@b=iv_table_name;
set@c=IFNULL(iv_where_cause,'1=1');
SET@s=concat('SELECTdistinct',@a,'FIELD1 FROM',@b,
'WHERE',IFNULL(@c,'1=1'));
PREPAREstmt3FROM@s;
EXECUTEstmt3;
DEALLOCATEPREPAREstmt3;1.oracle可以将动态sql放在游标中执行.
mysql游标声明有一定的局限性: mysql游标必须在声明处理程序之前被声明,并且变量和条件必须在声明光标或处理程序之前被声明。Mysql采用PreparedStatements实现动态sql.例子如下:
INTEmp_id_var=56
PREPARESQLSA
FROM"DELETEFROMemployeeWHEREemp_id=?";
EXECUTESQLSAUSING:Emp_id_var;
6
存储过程相互调用时传递数组
1. 将传入的字符串通过P_UNPACK_LIST方法转换为数组.(lo_holiday_jan_upl即为数组)
P_UNPACK_LIST(iv_jan__str,lv_delimiter,lo_holiday_jan_upl);
2. 传数组到另一个存储过程.
P_MOD_MONTH(iv_year,1,lo_holiday_jan_upl,iv_user_cd);
3.P_MOD_MONTH中使用数组:(将数组中的各个元素取出来插入到SD_HOLIDAY表)
FORli_cntIN0..9LOOP
IFiv_daystr(li_cnt)ISNOTNULLTHEN
INSERTINTOSD_HOLIDAY
(HOLIDAY_INT_KEY,
YEAR,
MONTH,
DAY,
ENABLE_FLAG,
CREATE_BY,
CREATE_DATE,
LAST_UPD_BY,
LAST_UPD_DATE)
VALUES
(SEQ_HOLIDAY_INT_KEY.NEXTVAL,
iv_year,
iv_month,
iv_daystr(li_cnt),
1,
iv_user_cd,
ld_sys_date,
iv_user_cd,
ld_sys_date);
ENDIF;mysql中数用数组步骤:
1. 将需要处理的字符串交给执行业务逻辑
的存储过程处理.
CALLSD_HOLIDAY_P_MOD_MONTH(iv_year,1,iv_jan__str,iv_user_cd);
2.SD_HOLIDAY_P_MOD_MONTH中处理字符串.(将字符串按自定格式分隔出来,在对每个小字符串进行业务逻辑处理.)
SETlv_inputstr=iv_inputstr;
loopLable:LOOP
IFli_cnt>9THEN
LEAVElooplable;
ELSE
SETli_pos=INSTR(lv_inputstr,iv_delimiter);
IFli_pos=0THEN
leavelooplable;
ELSE
settemp_str=SUBSTR(lv_inputstr,1,li_pos-1);
/*插入temp_str到SD_HOLIDAY表*/
INSERTINTOSD_HOLIDAY(...)
SETlv_inputstr=SUBSTRING(lv_inputstr,li_pos+LENGTH(iv_delimiter));
ENDIF;
SETli_cnt=li_cnt+1;
ENDIF;
ENDLOOPloopLable; 存储过程相互调用时传递数组解决方法:
oracle中传入12个字符串到存储过程,然后将这12个字符串转换为12个数组,再调用其他存储过程并将这12个数组分别传给存储过程,便利每个数组进行业务逻辑处理.
mysql解决方法:将存储过程中的数组去掉,两个存储过程调用时直接传递字符串,然后再需要处理业务逻辑的地方将字符串分解,进行业务逻辑处理.
可以参考<<2009002-OTMPPS-DifficultQuestions-0001.doc>>中 2.4.2逐层分解字符串
7
Java无法以String来接取int
selectfac_unit_key FILED1在oracle可以
selectfac_unit_keyFILED1在mysql中要改
selectCAST(fac_unit_keyASCHAR)FILED1CAST(intvalue ASCHAR)