批處理 動態(tài)sql
更新時間:2009年06月25日 16:12:41 作者:
批處理 動態(tài)sql
1.
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
--查詢所以行,放在集合里
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
語法:
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
語法:動態(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個部門加薪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個部門加薪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('無數(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.用一個值綁定綁定名稱相同的值.
把sql語句用begin end括起來就能實現(xiàn)
如:
execute immediate 'begin calc_stats(:x,:x,:y,:x,:y); end;' using a,b;
將A與X綁定,當(dāng)?shù)诙纬鰜聿煌Q時,與B綁定,以此類推
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
--查詢所以行,放在集合里
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
語法:
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
語法:動態(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個部門加薪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個部門加薪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('無數(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.用一個值綁定綁定名稱相同的值.
把sql語句用begin end括起來就能實現(xiàn)
如:
execute immediate 'begin calc_stats(:x,:x,:y,:x,:y); end;' using a,b;
將A與X綁定,當(dāng)?shù)诙纬鰜聿煌Q時,與B綁定,以此類推
相關(guān)文章
SQL Server判斷數(shù)據(jù)庫、表、列、視圖、存儲過程、函數(shù)是否存在總結(jié)
這篇文章主要介紹了SQL Server判斷數(shù)據(jù)庫、表、列、視圖、存儲過程、函數(shù)是否存在,本文是一篇總結(jié)篇,結(jié)合實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-05-05SQL Server Parameter Sniffing及其改進(jìn)方法
這篇文章主要介紹了SQL Server Parameter Sniffing及其改進(jìn)方法,需要的朋友可以參考下2017-06-06sqlserver中將varchar類型轉(zhuǎn)換為int型再進(jìn)行排序的方法
sql中把varchar類型轉(zhuǎn)換為int型然后進(jìn)行排序,如果我們數(shù)據(jù)庫的ID設(shè)置為varchar型的 在查詢的時候order by id的話2012-06-06SQL SERVER 2012新增函數(shù)之字符串函數(shù)FORMAT詳解
這篇文章主要給大家介紹了關(guān)于SQL SERVER 2012新增函數(shù)之字符串函數(shù)FORMAT的相關(guān)資料,文中通過實例介紹的非常詳細(xì),對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-03-03SQLServer XML數(shù)據(jù)的五種基本操作
SQLServer XML數(shù)據(jù)的五種基本操作語句2009-07-07SQL Server之SELECT INTO 和 INSERT INTO SELECT案例詳解
這篇文章主要介紹了SQL Server之SELECT INTO 和 INSERT INTO SELECT案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08