Ⅰ 綁定變數的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的綁定變數
因為OceanBase中目前使用的是一種」靜態執行計劃「,無論什麼Query,執行流程都一樣。OB在前端代理ObConnector中實現綁定變數,將用戶傳入的變數進行to_string()操作,替代SQL語句中相應的部分,形成一個完整的SQL。
然後這個SQL傳遞給MS,MS按照標准流程來解析和執行。相信不遠的將來,OB將會實現真正意義上的綁定變數,讓用戶享受到綁定變數帶來的好處。
Ⅲ 什麼是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語句實現
首先用var進行聲明,確定變數名及類型,再使用exec賦值。格式為「:變數名:=變數值」。「:=」為賦值符號,例如「SQL> exec :i:=:i+1;」。使用時通過「:變數名」方式調用。例如:SQL> var i varchar2(10);SQL> exec :i:='sql';SQL> select * fromtable_name where name=:i;
Ⅳ pl/sql 綁定變數應當怎麼寫
sql_string :=
'SELECT inyear FROM tbl_student WHERE ID = :ID ';
EXECUTE IMMEDIATE sql_string into stu_inyear
USING id;
Ⅵ 如何在SQL中綁定變數,實現從一個資料庫中將數據遷移到另一個資料庫中
declare @a int;
declare @b int;
declare @c varchar(180);
declare @d varchar(180)
DECLARE @f 你的數據類型
DECLARE @sql VARCHAR(1000)
select @a = ISNULL(min(iRecNo),0) from sys_MK_trans_Detail6 where sbillno='No.12/07-0004'
select @b= ISNULL(max(iRecNo),0) from sys_MK_trans_Detail6 where sbillno='No.12/07-0004'
WHILE @a<@b BEGIN
select @c = sTableId from sys_MK_trans_Detail6 where sbillno='No.12/07-0004' and iRecNo =@a
select @d = SOutBook from sys_MK_trans where sbillno='No.12/07-0004' and iRecNo =@a
select @f = SinBook from sys_MK_trans where sbillno='No.12/07-0004' and iRecNo =@a
--這里不能直接這種方式,要拼SQL語句
SET @sql = "INSERT 遷入帳套.dbo."+@c+" select * from 遷出帳套.DBO."+@c
exec (@sql)
set @a=@a+1
end
--iRecNo 為記錄序號
--sys_MK_trans 為主表,有sbillno單據號,SOutBook遷出帳套,SinBook遷入帳套
--sys_MK_trans_Detail6為要遷移數據表的清單記錄
Ⅶ 如何查看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語句放在vba里需要什麼框架
VBA里使用SQL語句,不僅要需要遵循SQL的語法規則。在VBA中構造不光要遵循SQL的語法規則,還必須要遵循VBA的語法規則。
於是就會多出來好些如連接符(&)、雙引號(")等符號,很多初學者就是被這些符號搞暈了。下面就簡單講一下如何通過拆分法來理解VBA中動態SQL語句的構造。
在查詢的時候雖然我們可以將查詢條件綁定到窗體控制項,如下面的示例:
Select
* FROM 訂單表 Where客戶名稱
=Forms!客戶查詢窗體!客戶名稱輸入框但這樣只能適用於比較簡單的查詢,隨著條件復雜度的增加,SQL語句的構造難度也會直線上升,更重要的是這樣
的SQL語句很難理解,就算最終做出來了,一旦過了一段時間需要修改的話,就非常麻煩。
於是在VBA中使用變數構造動態的
SQL語句就成了一種理想的選擇。我們來看一個例子,比如我們要通過在窗體上的三個文本框(txt客戶名稱、txt開始日期、txt結束日期)內輸入相應
的條件值,來構造一個查詢訂單表中指定客戶在某個時間段內銷售記錄的SQL語句,在VBA中的代碼如下:
strSQL="
Select * FROM 訂單表 Where 客戶名稱='www.gzlij.com" & Me.txt客戶名稱 & "'
AND 銷售日期 Between #" & Me.txt開始日期 & "# And #" & Me.txt結束日期
& "#"
上面的的語句該如何理解呢?這里通過替換法來進行拆分,我們先假設文本框的值分別是:
txt開始日期=2010-5-1
txt結束日期=2010-5-31
txt客戶名稱=東南實業
根據上面的條件,我們需要得到的SQL語句應該是:
Select * FROM 訂單表 Where 客戶名稱="東南實業" AND 銷售日期 Between #2010-5-1# And #2010-5-31#
這里的由於要在VBA中構造,而雙引號(")是VBA中的字元串界定符,所以我們需要把它改成單引號(')來符合VBA的語法規則,那麼SQL語句就成了:
Select * FROM 訂單表 Where 客戶名稱='東南實業' AND 銷售日期 Between #2010-5-1# And #2010-5-31#
(當然我們也可以根據VBA的語法來用兩個雙引號,這樣VBA編譯器就會把這兩個連續的雙引號識別為一個雙引號字元,而不是字元串界定符,不過這樣相對來說更加復雜和麻煩一些,還有一些其它原因這里就不細說了。)
我們再把裡面的條件值換回變數,由於條件需要用變數代替,所以我們這里把上面的SQL語句拆分成如下的多個片段:
Select * FROM 訂單表 Where 客戶名稱='東南實業' AND 銷售日期 Between #2010-5-1# And #2010-5-31#
然後把其中的條件值換成變數,就成了:
Select * FROM 訂單表 Where 客戶名稱='Me.txt客戶名稱' AND 銷售日期 Between #Me.txt開始日期# And #Me.txt結束日期#
接下來再把其中不是變數的片段兩頭加上雙引號,使其符合VBA中的字元串語法:
"Select * FROM 訂單表 Where 客戶名稱='"Me.txt客戶名稱"' AND 銷售日期 Between #"Me.txt開始日期"# And #"Me.txt結束日期"#"
最後我們再用連接符(&)把這些拆分處理後得到的片段連接組合成一個字元串(注意,使用連接符組合多個字元串或變數時,連接符兩邊要有空格),就得到了我們需要的VBA中的動態SQL語句的寫法:
"Select
* FROM 訂單表 Where 客戶名稱='" & Me.txt客戶名稱 & "' AND 銷售日期 Between #"
& Me.txt開始日期 & "# And #" & Me.txt結束日期 & "#"
Ⅸ 關於綁定變數的SQL綁定什麼值
declare @變數 首先 你要聲明一個變數。然後給變數賦值 。關於你要綁定什麼值 是根據你自己的代碼需求~~~視情況而定。