ibatis 繫結變數 sql硬軟解析

2021-06-18 06:26:51 字數 1011 閱讀 6042

關於避免sql的硬解析:

1.ibatis中,所有的 ##都是繫結變數,所有的$$都不算繫結變數,所以盡量避免使用$$。

但是對於in,$$中傳入的值,不被看成乙個整體,此在in條件中可以順利使用只是不是繫結變數如:1 :2 :3 :4這種語句;

如果in的值是##傳入的,則in查不到任何資料因為##裡面的東西被看成乙個整體。

2.如果sql中涉及到 where id in(***),則要這麼寫,才算繫結變數的sql(其中allmxid是list型別,每個id直接list.add加入list):

where id in

#allmxid#

3.儲存過程中,我們平時那種寫法算繫結變數,不用特意寫成execute immediate的動態sql形式(參考位址

4.要查sql是否是硬解析,可以通過sql查詢,寫的語句裡面是否變數都是用 :1 :2 :3等等代替的,正確的sql應該所有的變數都用:1這種來代替,要不然就是硬解析sql需要改:

select * from v$sqlarea  --where sql_text like'..'

5.要想知道上面查詢出的語句中,佔位符 :1 :2 :3的具體值(需要從上面語句記錄sql_id),可以通過下面sql來查詢,但是此值是根據sql的執行時刻改變的:

例如,通過 4 中 查詢出來的sql可以看到下面兩個紅框中, where id in 裡面 兩個不一樣,這是2個sql,需要解析2次,實際正確的應該是這樣的(只用解析一次,其他的來的同類sql只是把佔位符替換):

圖中,打勾的2個sql,會因為 where id in 中 id的個數不同,in中內容生成不同個數的佔位符,但是相對於圖中上面兩個打叉的sql(每乙個sql,就是乙個sql,無法和其它同類sql共用)來說,已經是很少的硬解析了。

oracle 動態sql 繫結變數

無繫結變數的非sql查詢 declare v sql varchar2 4000 begin 使用execute immediate執行動態sql,最後提交事物 v sql create table account id number 3 not null,name varchar2 50 not ...

oracle動態sql以及繫結變數

實現動態sql有兩種方式 dbms sql和本地動態sql execute immeidate oracle從8代開始就提供了新的執行動態sql的功能 execute immeidate v sql using into 本地動態sql execute immediate 語句 into using...

oracle動態SQL繫結集合變數

有如下需求,在儲存過程中,傳遞的引數是字串,字串格式是 1,2,3 由數字組成,中間用 號分割 然後在sql語句如下使用 create or replace procedure movetoright v ids varchar2,v workid int asi sql varchar2 1000...