sql排序語句order by,Mybatis中sql的各種寫法,項目中的。存儲過程寫法,創建索引寫法

 2023-11-19 阅读 40 评论 0

摘要:關鍵是擴大自己的視野,因為有的我真的不知道可以這樣寫? 比如: 一:if test --可以去掉多余的and <if test = "defaultQuery and sum == false"> AND (sysdate - T.CREATED) &lt; 90 </if> <if test =

關鍵是擴大自己的視野,因為有的我真的不知道可以這樣寫?
比如:
一:if test --可以去掉多余的and

<if test = "defaultQuery and sum == false"> AND (sysdate - T.CREATED) &lt; 90 </if>
<if test = "limit30 and sum == false"> AND (sysdate - T.CREATED) &lt; 30 </if>

sql排序語句order by、test里面的表達式,limit30是model中的一個布爾變量,sum是統布爾計變量,
如果limit30 傳 true ,sum 傳 false,就是不統計,那么 test 表達式就為 true,那么就會走后面的語句(只查詢近30天的記錄),否則不走。
如果前端不傳limit30,布爾默認為false,那么怎么都不會走下面的。也就是
要查90天就是 傳 defaultQuery = true,要查30天 就傳limit30 = true.

二:一個字段代表多層意思進行搜索

<!--按照 產品描述,物料號,內部型號,外部型號 進行搜索-->
<if test = "productName != null and productName != '' ">AND ( T1.X_NAME like '%'||#{productName}||'%' OR T1.PART_NUM  like '%'||#{productName}||'%'OR T2.ATTRIB_01 like '%'||#{productName}||'%'OR T2.ATTRIB_02 like '%'||#{productName}||'%')
</if>

java執行sql語句?三:mybatis調用存儲過程寫法

<select id = "quote2agreement" statementType = "CALLABLE" parameterType="java.util.Map"><![CDATA[{call QUOTE_TO_AGREE_COMMIT( #{AGREE_ID,mode=IN,jdbcType=VARCHAR} )}]]>
</select>

QUOTE_TO_AGREE_COMMIT 這個應該是 存儲過程的名字。 ()這個應該存儲過程要用到的參數
statementType = “CALLABLE” 這個應該是固定寫法,如果是調用存儲過程的話。

java生成sql文件、四:有的話,再寫。到PLSQL去看了下 文件夾 Procedures(存儲過程),看了很多 綠色P圓圈,可能就是Procedures的標志吧看了上面的 QUOTE_TO_AGREE_COMMIT 這個。所以看看別人是怎么寫存儲過程的。

create or replace procedure QUOTE_TO_AGREE_COMMIT(AGREE_ID in varchar2) isAGREE_ID1			varchar2(50)   := null ; -----合同Id OPPTY_ID1			varchar2(50)   := null ; -----商機Id QUOTE_ID1			varchar2(50)   := null ; -----報價Id CHANNEL_ID			varchar2(50)   := null ; -----招投標結果,中標渠道Id Standard_Payment	 varchar2(100)   := null ; -----客戶標準付款方式Payment_Days		varchar2(100)   := null ; -----客戶賬期 Black_Type				varchar2(100)   := null ; -----黑名單類型PR_ADDR_ID			varchar2(50)   := null ; -----客戶地址Id ATTRIB_07			    varchar2(50)   := null ; -----付款Id ORDER_DATES		varchar2(50)   := null ; -----預期天數 LoginID					varchar2(50)   := null ; -----用戶Id beginAGREE_ID1 := AGREE_ID;
/*  select substr( AGREE_ID,0,instr(AGREE_ID,';') -1 ) tt into AGREE_ID1 from dual;select substr( AGREE_ID,0,instr(AGREE_ID,';') +1,length(AGREE_ID) ) tt into LoginID from dual; 	*//*根據合同Id,匹配其他邏輯需要的信息*/select  T.QUOTE_ID,T.OPTY_ID,T.CREATED_BY into QUOTE_ID1,OPTY_ID1,LoginID from siebel.s_doc_agree T where T.ROW_ID = AGREE_ID1;
/*		\*獲取當前登錄人的用戶Id*\
select t2.row_id into LoginID from siebel.s_user T2 where T2.LOGIN in (select t.USERNAME from user_users T);
*/
--如果合同Id 和 商機Id  都不為空的情況下,將招投標結果客戶 寫到合同下單渠道
IF ( AGREE_ID1 IS NOT NULL AND OPPTY_ID1 IS NOT NULL) THEN select   T.CHANNEL_IDinto   CHANNEL_IDfrom  sieble.CX_BIDDING_RE Twhere T.OPTY_ID = OPPTY_ID1and   ROWNUM <= 1;
--如果招投標結果的中標渠道不為空,獲取中標渠道客戶的賬期信息	
if ( CHANNEL_ID is not null ) thenselect   T2.ATTRIB_47,T2.ATTRIB_59,T.X_BLACK_TYPE,T.PR_ADDR_ID,T2.ATTRIB_07into       Standard_Payment,Payment_Days,Black_Type,PR_ADDR_ID,ATTRIB_07from     siebel.s_org_ext T, siebel.s_org_ext_x T2where   T.ROW_ID = CHANNEL_IDand    T.ROW_ID = T2.PAR_ROW_ID(+);	
/*把中標渠道客戶設置到生成的合同上,并同時更新賬期信息*/update  siebel.s_Doc_Agree T set   T.X_ACCOUNT_ID       			= CHANNEL_ID,T.BILL_TO_ADDR_ID  			= PR_ADDR_ID,T.X_CONSIGNEE_ADD_ID  =PR_ADDR_ID,T.X_CONSIGNEE_ACC_ID  =CHANNEL_ID,T.X_CUS_PAY_ID					=ATTRIB_07,T.X_BLACK_TYPE 				=Black_Type,T.X_ACCNT_DAYS				=Payment_Days,T.X_ACCNT_PAY_TYPE		=Standard_Paymentwhere  T.ROW_ID = AGREE_ID1;commit;end if; --判定招投標結果 尾
END IF; --判定合同ID 和商機Id 都不為空/*將報價銷售團隊,復制到生成的合同中*/
siebel.quote_to_agree_add_position(AGREE_ID1,QUOTE_ID1);  --這應該是個寫好的方法吧。/*回寫報價下產品清單的請求數量*/
siebel.UPDATE_QUOTE_ITEM_NUM(QUOTE_ID1);/*更新商機的銷售階段*/
siebel.Change_Oppty_Stage(OPPTY_ID1);/*報價生成合同后回寫標記*/
siebel.Update_Quote_Flag(QUOTE_ID1);/*下單客戶是否轉交易 置為Y,并且通過ERP視圖 獲取下單客戶的預期款天數*/
siebel.ORDER_ACCOUNT_CHECK(QUOTE_ID1,ORDER_DATES);/*對生成的合同進行邏輯操作*/
siebel.UPDATE_AGREE(AGREE_ID1,LoginID);/*檢查合同行的意向單價與報價行是否一致,解決小數點問題*/
--siebel.QUOTE_TO_AGREE_FIXPRICE(AGREE_ID1,QUOTE_ID1);end QUOTE_TO_AGREE_COMMIT;

五:創建表,創建索引
偶爾看到的,語法如下:

--create table創建表
create table S_DOC_AGREE
(
row_id             varchar(15) not null,
created		   DATE default sysdate not null,
created_by     varchar(15) not null,
last_upd         DATE default sysdate not null,
dcking_num   number(22,7) default 0,
active_id         char(1) default 'N' not null,
agr_active_id  char(1) default 'Y' not null,
name 				varchar2(50) not null,
rev_num			number(22,7) not null,
eff_date 			DATE,
desc_text			varchar2(255)
...
)--表空間
tablespace SIEBELDATApctfree		10initrans	 1maxtrans   255storage     ( intial 1M  next 8K  minextends 1  maxextends unlimited);--create / recreate   indexs 創建索引
create index   S_DOC_AGREE_F52 on   S_DOC_AGREE(FN_ACCNT_ID)tablespace   SIEBELINDEXpctfree		10initrans	2maxtrans  255storage	(  initial 1M  next 1M   minextends 1 maxextends unlimited   );...	
--grant/revoke object privileges  賦予/撤回 對象特權。grant select ,insert,update ,delete  on  S_DOC_AGREE  to  IF_USER with grant option;  //賦予增刪改查權限?、grant select ,insert,update ,delete  on  S_DOC_AGREE  to  SSE_ROLE; 	

六:今天看到了 一個新的標簽,Mybatis中的sql。也可能是我之前忘記了,可能不常用吧,還是寫下來。

<select  id="getHomeFunctionList" resultMap="HomeFunctionMapperTwo" parameterType="com.xxxxx.model.setting.HomeFunctionModel" >select   t.* ,case when t1.parentid is null and t.name != '公共辦公' then 'N' else 'Y' end  as ISCHILDRENfrom t_home_function  tleft join ( select distinct a.parentid from t_home_function a where a.parentid is not null) t1 on t.id=t1.parentidwhere   <if test ="type != -1"> t.type = #{type}</if><choose>                 <!--我日,第一次在項目中看到。這個感覺和 if test 沒區別吧--><when test="parentId != null and parentId != '' "> and t.parentid = #{parentId}</when><otherwise>and t.parentid is null </otherwise></choose>order by idx
</select>

七:2019-3-25今天在SettingMapper中 又看到了一個新的sql,update標簽的
應該是是修改密碼。 T_CONFIG中的VALUE字段是 密碼。具體可以看 另一篇文章:登陸接口補充
我去,后來我又看到了 好多啊。還有insert ,delete 里面都有這種寫法。insert內有selectKey標簽

<!--更新語句后,執行插入,在執行查詢?可以這樣寫?、 插入語句,這樣寫 有問題吧? insert  into 表 (字段) select ?????->
<sql id="insertLog">insert into T_LOG (ID , opration,content,created,loginname)select  ( select max(id)+1 from (select id from T_LOG union all select 0 from dual) ) , '${opration}', '${content}' , systimestamp,#{loginname}from dual ;
</sql><!--修改密碼:編輯配置信息-->
<update id="editConfig" parameterType="com.xxxxx.commmon.model.ConfigModel">beginupdate T_CONFIG set VALUE = #{value}  where KEY = #{rowId} ;<include refid = "isnertLog"><property name="opration"  value="編輯配置信息" /><property name="content"    value="id = ${rowId} ,新值 = ${value}" /></include>end ;
</update><!--編輯關鍵字-->
<insert id="editKey" parameterType="com.xxxxx.model.setting.KeyModel">begin<!--這個表示在執行 insert 語句之前,首先執行 selectKey(不一定為主鍵字段)語句,并把得到的結果 賦值給 totalRecords.--><selectKey keyProperty="totalRecords"  resultType="int" order="BEFORE">	select count(1) from T_PERMISSION_KEY where KEY = #{rowId}</selectKey><if test="totalRecords != 0">update T_PERMISSION_JEY set (NAME,DESCRIPTION,TYPE) = (select #{name} , #{decription} ,#{type} from dual)where  KEY = #{rowId};<include refid = "isnertLog"><property name="opration"  value="更新關鍵字" /><property name="content"    value="id = ${rowId} ,名稱 => ${name}" /></include></if><if test="totalRecords == 0">insert into T_PERMISSION_KEY set (KEY,NAME,DESCRIPTION,TYPE) values (#{rowId},#{name} , #{decription} ,#{type}) ;<include refid = "isnertLog"><property name="opration"  value="新增關鍵字" /><property name="content"    value="id = ${rowId} ,名稱 => ${name}" /></include></if>			end;
</insert><!--刪除關鍵字-->
<delete id="delKey" parameterType="com.xxxx.model.setting.KeyModel" >beindelete from T_PERMISSION_KEY where KEY = #{rowId};<include refid = "isnertLog"><property name="opration"  value="刪除關鍵字" /><property name="content"    value="id = ${rowId}" /></include>end;
</delete>

其中涉及的KeyModel如下:
包:com.xxxxx.model.setting
KeyModel(埋點信息) extends BaseModel
name—名稱 decription—描述 int type= -1;—類型
其實埋點是啥,我不是不清楚。不知道用的多不多。

八:2019-03-27:今天Siebel又提供我了一個sql,里面用到了一個關鍵字 EXISTS,可能我很久沒寫過了,都忘記怎么用了。今天就下下來回憶回憶.基本計數很少用count(*) ,都是用COUNT(1),我在mapper.xml中都沒看到過COUNT() .

1可以刪除 0不可以刪除

SELECT    	COUNT(1)  FROM    	DUAL 
WHERE     (  EXISTS ( select 1 from SIEBEL.CX_UBID_APPLY T1 WHERE T1.ROW_ID = #{rowId}  AND CREATED_BY = #{loginId} )      OR  EXISTS  ( select 1 from SIEBEL.S_LST_OF_VAL   T2  WHERE T2.TYPE= 'DH_UNBID_MANAGER'  AND T2.NAME = '非標管理員'  AND 				T2.ACTIVE_FLG = 'Y' AND T2.LANG_ID = 'CHS'  AND INSTR(T2.DESC_TEXT,#{loginName})>0  ) 		)AND		EXISTS( select 1 from SIEBEL.CX_UBID_APPLY T1 WHERE T1.ROW_ID = #{rowId}  AND (T1.X_FCHECKSTATUS IS NULL OR T1.X_FCHECKSTATUS = '未啟動') )

九:如果可以請使用 【between and】 或者【Exists】來代替 【in,not in】;
如果一個擴展虛擬表 被多次重復使用 請使用【with】語法。
sql優化的本質是:避免全表掃描,盡量使用索引。
比如:模糊搜索的時候盡量使用“a%”(走索引),不要使用“%a%”.(不走索引)

INSTR(T1.X_FTASKERS, #{loginName}) &gt; 0  

這個呢類似于

T1.X_FTASKERS  like '%'||#{loginName}||'%'

十:Model中的get set方法
ContractModel

public String getMyAccountType(){if("甲方".equals(this.getAccountType())){ return "甲方客戶";}if(  "戰略工程商".equals(this.getChannelAccountType()) || "核心工程商".equals(this.getChannelAccountType()) ||"普通工程商".equals(this.getChannelAccountType())  ||"中小工程商".equals(this.getChannelAccountType())         ){  return “工程商”;}return "分銷商";
}

十一:HTTP代碼
400----BadRequest : 1前段提交的字段與后臺尸體類型不一致。2后臺需要json字符串類型,前段沒有將對象轉化為String類型。
404—路徑錯誤
405—請求方法get,post使用錯誤
415—(media-Type)傳輸的數據格式錯誤
203—重定向
500—服務器錯誤,也就是內部代碼有問題
304—查詢的數據走的是本地緩存。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/185205.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息