綁定變數sql
① 什麼是sql綁定變數,如何實現綁定變數
--聲明變數
declare @var varchar(50), @sql varchar(1000);
--這里全部都是單引號,沒有雙引號
set @var = '變數';
set @sql = 'select * from post where post_addr like ''%'+@var+'%''';
--注意,sql默認是不支持雙引號的,只能用單引號
exec @sql;
② 拼的sql,怎麼使用綁定變數
很多方法 1.自定義函數返回集合,然後用table,注意計劃,可能要用rownum固定 2.正則表達式 3.INSTR+SUBSTR 4.SYS_CONTEXT 反正不管哪種方法,計劃符合條件,可用到綁定變數,那麼就可以了
③ 如何查看Oracle SQL綁定變數
查看Oracle SQL綁定變數方法如下:
alter session set nls_date_format = 'yyyy-mm-dd,hh24:mi:ss';
set linesize 400
col sql_Id format a20
col name format a20
col datatype_string format a14
col value_string format a20
--這個sql從內存中讀取綁定變數值信息,若是不在內存中,則使用下一個sql
select
sql_id,name, datatype_string, last_captured,value_string from
v$sql_bind_capture where sql_id='dxfcacn4t4ppw' order by
LAST_CAPTURED,POSITION;
--這個sql從awr中讀取綁定變數值信息
select
instance_number, sql_id,name, datatype_string,
last_captured,value_string from dba_hist_sqlbind where
sql_id='fahv8x6ngrb50'order by LAST_CAPTURED,POSITION;
④ 綁定變數的SQL語句實現
首先用var進行聲明,確定變數名及類型,再使用exec賦值。格式為「:變數名:=變數值」。「:=」為賦值符號,例如「SQL> exec :i:=:i+1;」。使用時通過「:變數名」方式調用。
例如:
SQL> var i varchar2(10);
SQL> exec :i:='sql';
SQL> select * from table_name where name=:i;
⑤ 關於綁定變數的SQL綁定什麼值
declare @變數 首先 你要聲明一個變數。然後給變數賦值 。關於你要綁定什麼值 是根據你自己的代碼需求~~~視情況而定。
⑥ sql語句like匹配,怎麼使用綁定變數
應用程序進行升級,出現該條語句每次都硬解析
select tabxncompa0_.COMPANY_ID as x0_0_ from TAB_XN_COMPANY tabxncompa0_ where (tabxncompa0_.COMPANY_MOBILE like '%13509563578' )and((tabxncompa0_.COMPANY_STATUS<3 )or(tabxncompa0_.COMPANY_STATUS>3 ))
⑦ 什麼是SQL綁定變數,如何實現綁定變數
declare @var varchar(50), @sql varchar(1000); --聲明變數set @var = '變數';set @sql = 'select * from post where post_addr like ''%'+@var+'%'''; --這里全部都是單引號,沒有雙引號exec @sql;注意,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將會實現真正意義上的綁定變數,讓用戶享受到綁定變數帶來的好處。
⑨ 動態SQL中的重復佔位符如何與綁定變數進行
BEGIN calc_stats(:x, :x, :y, :x); END 是一個PL/SQL 代碼段,而非 insert into t6 (a,b,c) values (:x,:y,:x) 這樣的DML,標准SQL語句。
在EXECUTE IMMEDIATE 中,利用USING語句綁定變數時,Oracle遵循針對PL/SQL存儲過程使用佔位符名稱匹配的原則,而針對SQL語句則採用佔位符位置匹配的原則。
PL/SQL 用戶指南與參考 中的 例子如下:
動態SQL語句中的佔位符與USING子句中的綁定參數是位置關聯的,而不是名稱關聯。所以,如果在SQL語句中同樣的佔位符出現兩次或多次,那麼,它的每次出現都必須與一個USING子句中的綁定參數相關聯。例如下面的動態字元串:
sql_stmt := 'INSERT INTO payroll VALUES (:x, :x, :y, :x)';
我們可以為動態字元串編寫對應的USING子句:
EXECUTE IMMEDIATE sql_stmt USING a, a, b, a;
但 是,動態PL/SQL塊中只有唯一的佔位符才與USING子句中的綁定參數按位置對應。所以,如果一個佔位符在PL/SQL塊中出現兩次或多次,那麼所有 這樣相同的佔位符都只與USING語句中的一個綁定參數相對應。比如下面的例子,第一個佔位符(x)與第一個綁定參數(a)關聯,第二個佔位符(y)與第 二個綁定參數(b)關聯。
DECLARE
a NUMBER := 4;
b NUMBER := 7;
BEGIN
plsql_block := 'BEGIN calc_stats(:x, :x, :y, :x); END';
EXECUTE IMMEDIATE plsql_block
USING a, b;
...
END;
---------------------------------------------------------------------------------------------
CREATE TABLE T1 (N1 NUMBER, N2 NUMBER,N3 NUMBER,N4 NUMBER);
BEGIN
EXECUTE IMMEDIATE 'INSERT INTO T1(N1,N2,N3,N4) VALUES (:N1,:N2,:N2,:N1)' USING 1,2;
END;
/
*
ERROR at line 1:
ORA-01008: not all variables bound
ORA-06512: at line 2
BEGIN
EXECUTE IMMEDIATE 'BEGIN INSERT INTO T1(N1,N2,N3,N4) VALUES (:N1,:N2,:N2,:N1); END;' USING 1,2;
END;
/
PL/SQL procere successfully completed.
SELECT * FROM T1;
N1 N2 N3 N4
---------- ---------- ---------- ----------
1 2 2 1
----------------------------------------------