當前位置:首頁 » 編程語言 » insert動態sql

insert動態sql

發布時間: 2023-09-02 18:24:26

1. 請問sql中怎麼實現欄位的動態查詢

用動態sql即可實現。

如student表中有如下內容:

2. oracle筆記-動態SQL

孫告第 章 動態SQL

為何使用動態SQL

實現動態SQL有兩種方式 DBMS_SQL和本地動態SQL(EXECUTE IMMEIDATE)

主要從以下方面考慮使用哪種方式

是否知道涉及的列數和類型

DBMS_SQL包括了一個可以 描述 結果集的存儲過程(DBMS_SQL DESCRIBE_COLUMNS) 而本地動態SQL沒有

是否知道可能涉及的綁定變數數和類型

DBMS_SQL允許過程化的綁定語句的輸入 而本地動態SQL需要在編譯時確定

是否使用 數組化 操作(Array Processing)

DBMS_SQL允許 而本地動態SQL基本不可以 但可以用其他方式實現(對查詢可用FETCH BULK COLLECT INTO 對INSERT等 可用一個BEGIN … END塊中加循環實現)

是否在同一個會話中多次執行同一語句

DBMS_SQL可以分析一次執行多次 而本地動態SQL會在每次執行時進行軟分析

是否需要用REF CURSOR返回結果集

僅本地動態SQL可用REF CURSOR返回結果集

如何使用動態SQL

DBMS_SQL

調用OPEN_CURSOR獲得一個游標句柄

調用PARSE分析語句 一個游標句柄可以用於多條不同的已分析語句 但一個時間點僅一條有效

調用BIND_VARIABLE或BIND_ARRAY來提供語句的任何輸入

若是一個查詢(SELECT語句) 調用DIFINE_COLUMN或DEFINE_ARRAY來告知賣凱掘Oracle如何返回結果

調用EXECUTE執行語句

若是一個查中核詢 調用FETCH_ROWS來讀取數據 可以使用COLUMN_VALUE從SELECT列表根據位置獲得這些值

否則 若是一個PL/SQL塊或帶有RETURN子句的DML語句 可以調用VARIABLE_VALUE從塊中根據變數名獲得OUT值

調用CLOSE_CURSOR

注意這里對任何異常都應該處理 以關閉游標 防止泄露資源

本地動態SQL

EXECUTE IMMEDIATE 語句

[INTO {變數 變數 … 變數N | 記錄體}]

[USING [IN | OUT | IN OUT] 綁定變數 … 綁定變數N]

[{RETURNING | RETURN} INTO 輸出 [ … 輸出N]…]

注意本地動態SQL僅支持弱類型REF CURSOR 即對於REF CURSOR 不支持BULK COLLECT

最後說明

lishixin/Article/program/Oracle/201311/18948

3. PL/SQL開發中動態SQL的使用方法

內容摘要 在PL/SQL開發過程中 使用SQL PL/SQL可禪仔以實現大部份的需求 但是在某些特殊的情況下 在PL/SQL中使用標準的SQL語句或DML語句不能實現自己的需求 比如需要動態建表或某個不確定的操作需要動態正宏執行 這就需要使用動態SQL來實現 本文通過幾個實例來詳細的講解動態SQL的使用 本文適宜讀者范圍 Oracle初級 中級 系統環境 OS windows Professional (英文版)Oracle 正文 一般的PL/SQL程序設計中 在DML和事務控制的語句中可以直接使用SQL 但是DDL語句及系統控制語句卻不能在PL/SQL中直接使用 要想實現在PL/SQL中使用DDL語句及系統控制語句 可以通過使用動態SQL來實現 首先我們應該了解舉襲冊什麼是動態SQL 在Oracle資料庫開發PL/SQL塊中我們使用的SQL分為 靜態SQL語句和動態SQL語句 所謂靜態SQL指在PL/SQL塊中使用的SQL語句在編譯時是明確的 執行的是確定對象 而動態SQL是指在PL/SQL塊編譯時SQL語句是不確定的 如根據用戶輸入的參數的不同而執行不同的操作 編譯程序對動態語句部分不進行處理 只是在程序運行時動態地創建語句 對語句進行語法分析並執行該語句 Oracle中動態SQL可以通過本地動態SQL來執行 也可以通過DBMS_SQL包來執行 下面就這兩種情況分別進行說明 一 本地動態SQL 本地動態SQL是使用EXECUTE IMMEDIATE語句來實現的 本地動態SQL執行DDL語句 需求 根據用戶輸入的表名及欄位名等參數動態建表 create or replace procere proc_test(table_name in varchar 表名field in varchar 欄位名datatype in varchar 欄位類型field in varchar 欄位名datatype in varchar 欄位類型) asstr_sql varchar ( );beginstr_sql:= create table ||table_name|| ( ||field || ||datatype || ||field || ||datatype || ) ;execute immediate str_sql; 動態執行DDL語句exceptionwhen others thennull;end ;以上是編譯通過的存儲過程代碼 下面執行存儲過程動態建表 SQL> execute proc_test( dinya_test id number( ) not null name varchar ( ) );PL/SQL procere successfully pletedSQL> desc dinya_test;Name TypeNullable Default Comments ID NUMBER( )NAME VARCHAR ( ) YSQL>到這里 就實現了我們的需求 使用本地動態SQL根據用戶輸入的表名及欄位名 欄位類型等參數來實現動態執行DDL語句 本地動態SQL執行DML語句 需求 將用戶輸入的值插入到上例中建好的dinya_test表中 create or replace procere proc_insert(id in number 輸入序號name in varchar 輸入姓名) asstr_sql varchar ( );beginstr_sql:= insert into dinya_test values(: : ) ;execute immediate str_sql using id name; 動態執行插入操作exceptionwhen others thennull;end ;執行存儲過程 插入數據到測試表中 SQL> execute proc_insert( dinya );PL/SQL procere successfully pletedSQL> select * from dinya_test;IDNAME dinya在上例中 本地動態SQL執行DML語句時使用了using子句 按順序將輸入的值綁定到變數 如果需要輸出參數 可以在執行動態SQL的時候 使用RETURNING INTO 子句 如 declarep_id number:= ;v_count number;beginv_string:= select count(*) from table_name a where a id=:id ;execute immediate v_string into v_count using p_id;end ;更多的關於動態SQL中關於返回值及為輸出輸入綁定變數執行參數模式的問題 請讀者自行做測試 二 使用DBMS_SQL包 使用DBMS_SQL包實現動態SQL的步驟如下 A 先將要執行的SQL語句或一個語句塊放到一個字元串變數中 B 使用DBMS_SQL包的parse過程來分析該字元串 C 使用DBMS_SQL包的bind_variable過程來綁定變數 D 使用DBMS_SQL包的execute函數來執行語句 使用DBMS_SQL包執行DDL語句 需求 使用DBMS_SQL包根據用戶輸入的表名 欄位名及欄位類型建表 create or replace procere proc_dbms_sql(table_name in varchar 表名field_name in varchar 欄位名datatype in varchar 欄位類型field_name in varchar 欄位名datatype in varchar 欄位類型)asv_cursor number; 定義游標v_string varchar ( ); 定義字元串變數v_row number; 行數beginv_cursor:=dbms_sql open_cursor; 為處理打開游標v_string:= create table ||table_name|| ( ||field_name || ||datatype || ||field_name || ||datatype || ) ;dbms_sql parse(v_cursor v_string dbms_sql native); 分析語句v_row:=dbms_sql execute(v_cursor); 執行語句dbms_sql close_cursor(v_cursor); 關閉游標exceptionwhen others thendbms_sql close_cursor(v_cursor); 關閉游標raise;end;以上過程編譯通過後 執行過程創建表結構 SQL> execute proc_dbms_sql( dinya_test id number( ) not null name varchar ( ) );PL/SQL procere successfully pletedSQL> desc dinya_test ;Name TypeNullable Default Comments ID NUMBER( )NAME VARCHAR ( ) YSQL> 使用DBMS_SQL包執行DML語句 需求 使用DBMS_SQL包根據用戶輸入的值更新表中相對應的記錄 查看錶中已有記錄 SQL> select * from dinya_test ;ID NAME Oracle CSDN ERPSQL>建存儲過程 並編譯通過 create or replace procere proc_dbms_sql_update(id number name varchar )asv_cursor number; 定義游標v_string varchar ( ); 字元串變數v_row number; 行數beginv_cursor:=dbms_sql open_cursor; 為處理打開游標v_string:= update dinya_test a set a name=:p_name where a id=:p_id ;dbms_sql parse(v_cursor v_string dbms_sql native); 分析語句dbms_sql bind_variable(v_cursor :p_name name); 綁定變數dbms_sql bind_variable(v_cursor :p_id id); 綁定變數v_row:=dbms_sql execute(v_cursor); 執行動態SQLdbms_sql close_cursor(v_cursor); 關閉游標exceptionwhen others thendbms_sql close_cursor(v_cursor); 關閉游標raise;end;執行過程 根據用戶輸入的參數更新表中的數據 SQL> execute proc_dbms_sql_update( csdn_dinya );PL/SQL procere successfully pletedSQL> select * from dinya_test ;ID NAME Oracle csdn_dinya ERPSQL>執行過程後將第二條的name欄位的數據更新為新值csdn_dinya 這樣就完成了使用dbms_sql包來執行DML語句的功能 使用DBMS_SQL中 如果要執行的動態語句不是查詢語句 使用DBMS_SQL Execute或DBMS_SQL Variable_Value來執行 如果要執行動態語句是查詢語句 則要使用DBMS_SQL define_column定義輸出變數 然後使用DBMS_SQL Execute DBMS_SQL Fetch_Rows DBMS_SQL Column_Value及DBMS_SQL Variable_Value來執行查詢並得到結果 總結說明 在Oracle開發過程中 我們可以使用動態SQL來執行DDL語句 DML語句 事務控制語句及系統控制語句 但是需要注意的是 PL/SQL塊中使用動態SQL執行DDL語句的時候與別的不同 在DDL中使用綁定變數是非法的(bind_variable(v_cursor :p_name name)) 分析後不需要執行DBMS_SQL Bind_Variable 直接將輸入的變數加到字元串中即可 另外 DDL是在調用DBMS_SQL lishixin/Article/program/SQLServer/201311/22089

4. Mysql 動態sql foreach 使用案例

<delete id="deleteUser" parameterType="好卜橡list">
delete from user where id in
<foreach collection="list" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</delete>

<select id="findUserBySex" resultType="user">
select * from user where name in
<foreach collection="roleNoList" item="name" index="index" open="(" separator="," close=")弊辯">
#{roleNo}
</foreach>
</select>

<insert id="addUser" parameterType="user" >
insert into user(name,id,code) values
<foreach collection="list" item="item" separator=",">
(#{item.name},#{item.id},#{item.code})
</foreach>
</insert>

<update id="updateUser" parameterType="user">
update user set a = #{fptm},b=#{csof} where c in
<foreach collection="list" item="item"友旁 open="(" separator="," close=")">
#{item}
</foreach>
</update>

5. 動態SQL語句的insert into語法

你原來錯誤是
消息 8178,級別 16,狀態 1,第 1 行
參數化查詢 '( @a int ,@b varchar(80) ,@c int,@d varchar(80))insert into A (c' 需要參數 '@a',但未提供指兆握該參數。唯慶

declare @newid nvarchar(50)
select @newid=NEWID()
exec sp_executesql N'insert into A (col1,col2,col3,col4) values (@a,@b,@c,@d) ',N' @a int ,@b varchar(80) ,@c int,@d varchar(80)',0,'測猜帆試',0,@newid

在Sql Server 2008 R2已經成功插入.

熱點內容
易手遙控連接密碼是多少 發布:2025-02-03 22:44:26 瀏覽:165
sql安裝程序配置伺服器失敗 發布:2025-02-03 22:44:25 瀏覽:585
可以寫腳本的點擊器 發布:2025-02-03 22:44:22 瀏覽:611
c演算法代碼 發布:2025-02-03 22:42:20 瀏覽:861
腳本貓 發布:2025-02-03 22:36:30 瀏覽:136
qt軟體如何反編譯 發布:2025-02-03 22:36:27 瀏覽:21
linux串口數據接收 發布:2025-02-03 22:33:11 瀏覽:552
戰雙封腳本嗎 發布:2025-02-03 22:32:14 瀏覽:444
可用內存存儲 發布:2025-02-03 22:28:05 瀏覽:72
郵箱登錄需要伺服器地址是啥 發布:2025-02-03 22:27:27 瀏覽:547