① java資料庫中的問號代表什麼意思
你說的是寫sql時候的?嗎 那是佔位符的意思。
比如:
佔位符方式寫sql的好處:
1.增加SQL代碼可讀性
2.佔位符可以預先編譯,提高執行效率
3.防止SQL注入
4用佔位符的目的是綁定變數,這樣可以減少數據SQL的硬解析,所以執行效率會提高不少
② 在java 中寫oracle的sql是:insert into A values(,); 然後綁定變數,DB2的sq也有這樣寫的嗎l
db2也可以這么寫。。。。。這個其實是通用sql支持的,但是不建議這么做,維護和查看程序邏輯不方便。建議這樣寫 INSERT INTO 表名(列1,列2,.....) VALUES(?,?,.....)
③ 如何在DELPHI或JAVA實現綁定變數
var s:string;begin s:='declare @MyId varchar(800)' +' set @MyId=''''' +' select top 4 @MyId=@MyId+','+cast(id as varchar(20)) from Mytable' +' select @MyId'; with adoquery1 do begin close; sql.text:=s; open; showmessage(fields[0].asstring);//取值 end;end;
④ jdbc查詢資料庫報:java.sql.SQLException: ORA-01006: 綁定變數不存在
胡亂猜測一下。
int i = 1;
if(um.getUuid() != null && um.getUuid().trim().length() > 0){
pstmt.setString(i, um.getUuid());
i++;
}
java中所有這種類似數組的東西,都應該是從0開始,而不是從1開始。
所以 int i = 0;
⑤ java oracle綁定變數使用問題
PreparedStatement pstmt = con.prepareStatementSELECT QUESTION_ID FROM KM_T_FAQ WHERE XML_ID=? AND UNIQUE_ID LIKE '?'); //注意,這要換寫法
pstmt.setString(1, "%_ABCDEFG");//這裡面的ABCDEFG,傳的參數
⑥ 預編譯sql語句就sql綁定變數嗎
1. 認識綁定變數:
綁定變數是為了減少解析的,比如你有個語句這樣
select aaa,bbb from ccc where ddd=eee;
如果經常通過改變eee這個謂詞賦值來查詢,像如下
select aaa,bbb from ccc where ddd=fff;
select aaa,bbb from ccc where ddd=ggg;
select aaa,bbb from ccc where ddd=hhh;
每條語句都要被資料庫解析一次,這樣比較浪費資源,如果把eee換成「:1」這樣的綁定變數形式,無論ddd後面是什麼值,都不需要重復解析
Java實現綁定變數的方法:
[java] view plain
PreparedStatement pstmt = con.prepareStatement("UPDATE employees SET salay = ? WHERE id = ?");
pstmt.setBigDecimal(1, 15.00);
pstmt.setInt(2, 110592);
/result statmement: UPDATE employees SET salay = 15.00 WHERE id = 110592
pstmt.executeQuery();
假設要將id從1到10000的員工的工資都更新為150.00元,不使用綁定變數,則:
[java] view plain
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 1");
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 2");
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 3");
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 4");
....
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 10000");
使用綁定變數,則:
[java] view plain
PreparedStatement pstmt;
for (id = 1; id < 10000; id )
{
if (null == pstmt)
pstmt = con.prepareStatement("UPDATE employees SET salay = ? WHERE id = ?");
pstmt.setBigDecimal(1, 150.00);
pstmt.setInt(2, id);
pstmt.executeQuery();
}
二者區別在於,不用綁定變數,則相當於反復解析、執行了1w個sql語句。使用綁定變數,解析sql語句只用了一次,之後的9999次復用第一次生成的執行計劃。顯然,後者效率會更高一些。
2. 什麼時候不應該/不必要使用綁定變數
a. 如果你用數據倉庫,一條大查詢一跑幾個小時,根本沒必要做綁定變數,因為解析的消耗微乎其微。
b. 變數對優化器產生執行計劃有很重要的影響的時候:綁定變數被使用時,查詢優化器會忽略其具體值,因此其預估的准確性遠不如使用字面量值真實,尤其是在表存在數據傾斜(表上的數據非均勻分布)的列上會提供錯誤的執行計劃。從而使得非高效的執行計劃被使用。
3. 綁定變數在OceanBase中的實現
目
前OceanBase中實現了綁定變數,目的主要是為了編程方便,而不是為了降低生成執行計劃的代價。為什麼呢?因為OceanBase中目前使用的是一
種」靜態執行計劃「,無論什麼Query,執行流程都一樣。OB在前端代理ObConnector中實現綁定變數,將用戶傳入的變數進行
to_string()操作,替代SQL語句中相應的部分,形成一個完整的SQL。然後這個SQL傳遞給MS,MS按照標准流程來解析和執行。相信不遠的
將來,OB將會實現真正意義上的綁定變數,讓用戶享受到綁定變數帶來的好處。
⑦ jdbc查詢資料庫報:java.sql.SQLException: ORA-01006: 綁定變數不存在
setSqlValue方法為什麼返回是void呢,你試試看把傳入的pstmt返回回去,在主函數處接收返回的pstmt,就解決了!
⑧ java為啥使用 preparestatement麻煩告訴我
其中分析分為硬分析(Hard Parse)和軟分析(Soft Parse)。一條SQL語句通過語法檢查後,Oracle 會先去shared pool 中找是否有相同的sql,如果找著了,就叫軟分析,然後執行SQL語句。硬分析主要是檢查該sql所涉及到的所有對象是否有效以及許可權等關系,然後根據RBO或CBO模式生成執行計劃,然後才執行SQL語句。可以看出,硬分析比軟分析多了很多動作,而這裡面的關鍵是「在shared pool 中是否有相同的sql」,而這就取決於是否使用綁定變數。另:oracle9i引入了soft soft parse,先到pga中的session cursor cache list列表中去查找(session cursor cache list的長度是由session_cache_cursor參數決定的),如果沒有找到這條sql,這時候才去檢查shard_pool.對於Oltp系統,很多時候硬分析的代價比執行還要高,這個我們可以通過10046事件跟蹤得知。(2)共享池中SQL語句數量太多,重用性極低,加速了SQL語句的老化,導致共享池碎片過多。共享池中不同的SQL語句數量巨大,根據LRU原則,一些語句逐漸老化,最終被清理出共享池;這樣就導致shared_pool_size 裡面命中率下降,共享池碎片增多,可用內存空間不足。而為了維護共享池內部結構,需要使用latch,一種內部生命周期很短的lock,這將使用大量的cpu 資源,使得性能急劇下降。不使用綁定變數違背了oracle 的shared pool 的設計的原則,違背了這個設計用來共享的思想。2、怎麼查看沒有使用綁定變數select * from v$sql or v$sqlarea 查看是否有很多類似的語句,除了變數不一樣,其他的都一樣3、如何使用綁定變數?編寫java 程序時,我們習慣都是定義JAVA 的程序變數,放入SQL 語句中,如String v_id = 'xxxxx';String v_sql = 'select name from table_a where id = ' + v_id ; 以上代碼,看起來是使用了變數v_id ,但這卻是java 的程序變數,而不是oracle 的綁定變數,語句傳遞到資料庫後,此java 的程序變數已經被替換成具體的常量值,變成:select * from table_a where name = 'xxxxx' ;假定這個語句第一次執行,會進行硬分析。後來,同一段java 代碼中v_id 值發現變化(v_id = 'yyyyyy'),資料庫又接收到這樣的語句:select * from table_a where name = 'yyyyyy' ;ORACLE 並不認為以上兩條語句是相同的語句,因此對第二條語句會又做一次硬分析。這兩條語句的執行計劃可是一樣的!其實,只需將以上java 代碼改成以下這樣,就使用了oracle 的綁定變數:String v_id = 'xxxxx';String v_sql = 'select name from table_a where id = ? '; //嵌入綁定變數stmt = con.prepareStatement( v_sql );stmt.setString(1, v_id ); //為綁定變數賦值stmt.executeQuery();在Java中,結合使用setXXX 系列方法,可以為不同數據類型的綁定變數進行賦值,從而大大優化了SQL 語句的性能。4、java中應用綁定變數的例子PreparedStatement stmt = conn.prepareStatement('select a from b where c = ? ');stmt.setLong(1,123);stmt.executeQuery()……結論:綁定變數主要適用在Oltp,運行時間很短的系統。如客服系統,時時地進行insert方面的系統。數據倉庫系統不適用,和資料庫倉庫系統的一條sql運行時間相比,硬分析的代價顯然是微不足道的,通過硬分析去選擇正確的執行計劃才是關鍵。
⑨ 誰能給一個java 寫好的解析普通SQL語句 為綁定變數形式java 不勝感謝
你啥意思啊?不咋明白? 你的意思是不是根據sql語句中佔位符"?"號的個數和你傳進來的參數(像"aaa"、24),給你拼湊好sql語句啊?
也就是說pstm.setString(1,"aaa");pstm.setint(2,24);這樣類似的操作由某個程序自動幫你完成嗎?
⑩ java.sql.SQLException: ORA-01006: 綁定變數不存在
你system("SELECT name FROM Test WHERE FID="+paras[2]+" FOR UPDATE")這個出來,看下你拼接的,跟你測試的,是不是一摸一樣。然後把system出來的這句,復制過去,看能執行不,肯定有拼接錯誤的,仔細看下