批處理 動(dòng)態(tài)sql
DECLARE
TYPE ref_cursor_type IS ref CURSOR;
v_mycursor ref_cursor_type;
TYPE id_list IS TABLE OF integer;
TYPE name_list IS TABLE OF varchar2(30);
v_tabid id_list:=id_list();
v_tabname name_list:=name_list();
sql_str varchar2(200);
BEGIN
--查詢(xún)所以行,放在集合里
sql_str:='select empno,ename from emp';
sql_str:=sql_str||' order by empno desc';
execute immediate sql_str BULK COLLECT INTO v_tabid,v_tabname;
FOR c IN v_tabid.first..v_tabid.last LOOP
dbms_output.put_line('empno為'||v_tabid(c)||' 記錄的NAME為'||v_tabname(c));
END LOOP;
dbms_output.put_line('---------------------------------');
--更新(返回更新后的值)
sql_str:='update emp set empno=1+empno,ename=''a'' where rownum=1 RETURNING empno,ename into :1,:2 ';
execute immediate sql_str RETURNING BULK COLLECT INTO v_tabid, v_tabname;
FOR c IN v_tabid.first..v_tabid.last LOOP
dbms_output.put_line('empno為'||v_tabid(c)||' 記錄的NAME為'||v_tabname(c));
END LOOP;
dbms_output.put_line('---------------------------------');
--刪除(返回被刪除的行)
sql_str:='delete from emp where rownum<=2 RETURNING empno,ename into :1,:2 ';
execute immediate sql_str RETURNING BULK COLLECT INTO v_tabid, v_tabname;
FOR c IN v_tabid.first..v_tabid.last LOOP
dbms_output.put_line('empno為'||v_tabid(c)||' 記錄的NAME為'||v_tabname(c));
END LOOP;
dbms_output.put_line('---------------------------------');
--插入(返回插入的行)
sql_str:='insert into emp(empno,ename) values(1,''abc'') RETURNING empno,ename into :1,:2 ';
execute immediate sql_str RETURNING BULK COLLECT INTO v_tabid, v_tabname;
FOR c IN v_tabid.first..v_tabid.last LOOP
dbms_output.put_line('empno為'||v_tabid(c)||' 記錄的NAME為'||v_tabname(c));
END LOOP;
dbms_output.put_line('---------------------------------');
/* 批fetch
語(yǔ)法:
fetch dynamic_cursor
bulk collect into define_variable[,define_variable...]
*/
sql_str:='select empno,ename from emp';
sql_str:=sql_str||' order by empno desc';
OPEN v_mycursor FOR sql_str;
--取
FETCH v_mycursor BULK COLLECT INTO v_tabid,v_tabname;
--關(guān)
CLOSE v_mycursor;
--輸
FOR c IN v_tabid.first..v_tabid.last LOOP
dbms_output.put_line('empno為'||v_tabid(c)||' 記錄的NAME為'||v_tabname(c));
END LOOP;
dbms_output.put_line('---------------------------------');
END;
2.-------
forall
DECLARE
/*批forall
語(yǔ)法:動(dòng)態(tài)字符串必須為insert/update/delete,不能為select
forall index in lower..upper
execute immediate dynamic_string
using bind |bind(index)[,bind |bind(index)...]
[{returning|return} bulk collect into bind_argument[,bind_argument...]];
*/
TYPE sal_list IS TABLE OF number(8,2);
TYPE name_list IS TABLE OF varchar2(30);
TYPE dept_list IS VARRAY(15) OF integer;
v_depts dept_list:=dept_list(10,20,30,40,50,60,70,80);
v_tabsal sal_list:=sal_list();
v_tabname name_list:=name_list();
sql_str varchar2(200);
BEGIN
sql_str:='update emp set sal=sal*:arg1 where DEPTNO=:arg2';
sql_str:=sql_str||' returning ename,sal into :arg3,:arg4';
--給前面4個(gè)部門(mén)加薪10%,并返回結(jié)果到集合.
FORALL j IN 1..4
execute immediate sql_str
using 1.10,v_depts(j)
RETURNING BULK COLLECT INTO v_tabname,v_tabsal;
--顯示結(jié)果
FOR j IN v_tabname.first..v_tabname.last LOOP
dbms_output.put_line('雇員'||v_tabname(j)
||' 的薪水被提到'||v_tabsal(j));
END LOOP;
dbms_output.put_line('---------------------------------');
--給后面4個(gè)部門(mén)加薪20%,并返回結(jié)果到集合.
FORALL j IN 5..8
execute immediate sql_str
using 1.20,v_depts(j)
RETURNING BULK COLLECT INTO v_tabname,v_tabsal;
--顯示結(jié)果(用notfound判斷是否有結(jié)果集)
IF SQL%NOTFOUND THEN
dbms_output.put_line('無(wú)數(shù)據(jù)更新');
ELSE
FOR j IN v_tabname.first..v_tabname.last LOOP
dbms_output.put_line('雇員'||v_tabname(j)
||' 的薪水被提到'||v_tabsal(j));
END LOOP;
END IF;
END;
3.用一個(gè)值綁定綁定名稱(chēng)相同的值.
把sql語(yǔ)句用begin end括起來(lái)就能實(shí)現(xiàn)
如:
execute immediate 'begin calc_stats(:x,:x,:y,:x,:y); end;' using a,b;
將A與X綁定,當(dāng)?shù)诙纬鰜?lái)不同名稱(chēng)時(shí),與B綁定,以此類(lèi)推
- 基于Oracle的高性能動(dòng)態(tài)SQL程序開(kāi)發(fā)
- 為什么ASP中執(zhí)行動(dòng)態(tài)SQL總報(bào)錯(cuò)誤信息?提示語(yǔ)句語(yǔ)法錯(cuò)誤
- 動(dòng)態(tài)SQL語(yǔ)句使用心得
- sqlserver 支持定位當(dāng)前頁(yè),自定義排序的分頁(yè)SQL(拒絕動(dòng)態(tài)SQL)
- 編程經(jīng)驗(yàn)點(diǎn)滴 動(dòng)態(tài)SQL的拼接技巧
- oracle中動(dòng)態(tài)SQL使用詳細(xì)介紹
- mysql存儲(chǔ)過(guò)程 在動(dòng)態(tài)SQL內(nèi)獲取返回值的方法詳解
- MySQL 存儲(chǔ)過(guò)程中執(zhí)行動(dòng)態(tài)SQL語(yǔ)句的方法
- mybatis的動(dòng)態(tài)sql詳解(精)
相關(guān)文章
詳解在SQLPlus中實(shí)現(xiàn)上下鍵翻查歷史命令的功能
這篇文章主要介紹了在SQLPlus中實(shí)現(xiàn)上下鍵翻查歷史命令的功能,這里介紹使用readline和rlwrap實(shí)現(xiàn)這個(gè)功能的方法,需要的朋友可以參考下2022-03-03
SQL Server 開(kāi)窗函數(shù) Over()代替游標(biāo)的使用詳解
這篇文章主要介紹了SQL Server 開(kāi)窗函數(shù) Over()代替游標(biāo)的使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
SQLSERVER Pager store procedure分頁(yè)存儲(chǔ)過(guò)程
SQL SERVER(2005)以上版本可用,相對(duì)應(yīng)的頁(yè)面邏輯中寫(xiě)的對(duì)應(yīng)調(diào)用該存儲(chǔ)過(guò)程的方法2010-06-06
Replace關(guān)鍵字的妙用查詢(xún)是否包含某個(gè)特定字符串
Replace關(guān)鍵字主要是用來(lái)將字符串中的某個(gè)字符替換成別的字符,今天要為大家介紹下使用它來(lái)查詢(xún)是否包含某個(gè)特定字符串,示例代碼如下,感興趣的朋友可以參考下2013-08-08
sql server實(shí)現(xiàn)在多個(gè)數(shù)據(jù)庫(kù)間快速查詢(xún)某個(gè)表信息的方法
這篇文章主要介紹了sql server實(shí)現(xiàn)在多個(gè)數(shù)據(jù)庫(kù)間快速查詢(xún)某個(gè)表信息的方法,結(jié)合實(shí)例形式分析了SQL Server多個(gè)數(shù)據(jù)庫(kù)查詢(xún)的相關(guān)操作技巧,代碼備有詳盡的注釋,需要的朋友可以參考下2017-03-03
uniqueidentifier轉(zhuǎn)換成varchar數(shù)據(jù)類(lèi)型的sql語(yǔ)句
uniqueidentifier轉(zhuǎn)換成varchar數(shù)據(jù)類(lèi)型的sql語(yǔ)句,需要的朋友可以參考下。2011-09-09
sql自動(dòng)增長(zhǎng)標(biāo)識(shí)導(dǎo)致導(dǎo)入數(shù)據(jù)問(wèn)題的解決方法
對(duì)于一個(gè)設(shè)了自動(dòng)增長(zhǎng)標(biāo)識(shí)的數(shù)據(jù)表來(lái)說(shuō),它的字段的值是由數(shù)據(jù)庫(kù)自動(dòng)設(shè)置的;這在導(dǎo)數(shù)據(jù)時(shí)很麻煩2012-11-11
sqlserver substring函數(shù)使用方法小結(jié)
在操作sqlserver時(shí)候用到了substring函數(shù),特整理一些實(shí)例,需要的朋友可以參考下。2009-12-12

