① sql拼接以後佔位符填充不了怎麼辦
qlparameter是為了防止你的數據類型不對。 string.format(sql, '{0}',{1})是不工會管這些的,這樣會造成如果有人惡意拼寫參數,會執行某些惡意的sql,你的網站就危險了。
② 動態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
----------------------------------------------
③ SQL在JSP中佔位符的使用方法!~
?是個佔位符這個地方是可以被替換的。
dbc.setBytes(1,password.getBytes("GB2312")); 替換第一個問號
dbc.setBytes(2,userName.getBytes("GB2312")); 替換第二個問號
sql語句也可以這樣寫,如下:
String strSQL ="UPDATE user SET UserPassword = '" + password + "'" + " WHERE UserName = '" + "userName" + "'";
④ sql動態查詢佔位符查詢
sql語句,不帶條件
條件拼接變數1
if 有值
條件拼接變數 + and + 條件
如:
select 1 from a
條件拼接變數
有值 name = 'aaa'
拼sql
'select 1 from a ' + 'where ' + 條件拼接變數
最後用
exec(sql語句)
⑤ SQL Server中能否使用「」佔位符
sql server 好像沒有佔位符「?」,
我見過的有 :% ,_ ,^等
⑥ jdbc 中prepareStatement對sql中的佔位符賦值問題
第一個問題: prepareStatement 傳遞值
prepareStatement.setObject(序號,值)需要依據資料庫而定,有得從1開始,有得從 0開始。
Oracle,MySQL從 0 開始。
prepareStatement.setObject(1,12);
prepareStatement.setObject(2,13);
第二個:(?) 表示只有一個參數,等價於select *from table where field=? ,如果in 的范圍中有第二個值,你那個SQL就玩不轉了。建議你拼寫在SQL 中select *from table where field in(12,13....) and field2 = ?
⑦ java中,sql語句里的條件採用佔位符形式如 cond1=:cond1 怎麼理解呢
這是一種SQL組織形式,等號之前的cond1指資料庫中的欄位,後面的是一個參數站位符,之後由特定的方法執行SQL語句,需要傳遞一個Map(由SQL中的佔位符為註解,參數具體值作為映射的值)形式的集合,在執行方法中會解析參數集合並替換為真實值,然後執行SQL語句,並返回結果。
⑧ 如何使用佔位符防範sql注入
使用參數化來解決,如SQL server
select * from table where name =@name
到時傳參數進去,而不是拼字元
⑨ 關於SQL的一點問題~!
語法
sp_executesql [ @stmt = ] stmt
[
{, [@params=] N'@parameter_name data_type [ OUT | OUTPUT ][,...n]' }
{, [ @param1 = ] 'value1' [ ,...n ] }
]
參數
[ @stmt = ] stmt
包含 Transact-SQL 語句或批處理的 Unicode 字元串。stmt 必須是 Unicode 常量或 Unicode 變數。不允許使用更復雜的 Unicode 表達式(例如使用 + 運算符連接兩個字元串)。不允許使用字元常量。如果指定了 Unicode 常量,則必須使用 N 作為前綴。例如,Unicode 常量 N'sp_who' 是有效的,但是字元常量 'sp_who' 則無效。字元串的大小僅受可用資料庫伺服器內存限制。在 64 位伺服器中,字元串大小限制為 2 GB,即 nvarchar(max) 的最大大小。
注意:
stmt 可以包含與變數名形式相同的參數,例如: N'SELECT * FROM HumanResources.Employee WHERE EmployeeID = @IDParameter'
且[]內均為可選參數
stmt 中包含的每個參數在 @params 參數定義列表和參數值列表中均必須有對應項。
[ @params = ] N'@parameter_name data_type [ ,... n ] '
包含 stmt 中嵌入的所有參數定義的字元串。字元串必須是 Unicode 常量或 Unicode 變數。每個參數定義由參數名稱和數據類型組成。n 是表示附加參數定義的佔位符。在 stmt 中指定的每個參數必須在 @params 中定義。如果 stmt 中的 Transact-SQL 語句或批處理不包含參數,則不需要 @params。該參數的默認值為 NULL。
[ @param1 = ] 'value1'
參數字元串中定義的第一個參數的值。該值可以是 Unicode 常量,也可以是 Unicode 變數。必須為 stmt 中包含的每個參數提供參數值。如果 stmt 中的 Transact-SQL 語句或批處理沒有參數,則不需要這些值。
[ OUT | OUTPUT ]
指示參數是輸出參數。除非是公共語言運行 (CLR) 過程,否則 text、ntext 和 image 參數均可用作 OUTPUT 參數。使用 OUTPUT 關鍵字的輸出參數可以為游標佔位符,CLR 過程除外。
n
附加參數值的佔位符。這些值只能為常量或變數,不能是很復雜的表達式(例如函數)或使用運算符生成的表達式。
返回代碼值
0(成功)或非零(失敗)
結果集
從生成 SQL 字元串的所有 SQL 語句返回結果集
這個存儲過程就是用來執行字元創格式(拼接的)sql語句的
你也可以直接在其後寫語句
exec sp_sp_executesql 'select * from 某表'
效果和你在查詢分析器裡面直接寫
select * from 某表
一樣 都能執行 實際上她還有一種簡化方式
exec (字元串格式的sql語句)
如 exec ('select * from 某表')
第二個問題:
while中的1=1 其實沒別的意思 就是恆等
和其他語言的while(ture)一樣 就是個死循環 不過 只要在內部處理下 也就不再是死循環了 除非他一直都不break;跳出循環