oraclesqlloop
㈠ 請教大神,oracle資料庫循環語句怎麼寫
你想要的這幾個結果,都可以直接使用sql語句查出,無需循環。
Oracle循環實在PLSQL塊中編寫:關鍵字for XXX loop 循環體 end loop;
㈡ oracle sql 管道函數是什麼
oracle管道函數是一類特殊的函數,關鍵字PIPELINED表明這是一個oracle管道函數,oracle管道函數返回值類型必須為集合。
例子:
create or replace function f_pipeline_test
return MsgType
PIPELINED
as
begin
for i in 1 .. 10
loop
pipe row( 'Iteration ' || i || ' at ' || systimestamp );
dbms_lock.sleep(1);
end loop;
pipe row( 'All done!' );
return;
end;
/
㈢ 用oracle SQL 查詢結果集 用集循環 並用集的列做if條件 滿足條件後集的列批量插
declare
cursor my_cursors is select * from t1 where 1=1 --定義游標
my_cursor varchar2(40); --這個數據類型根據自己的情況修改。
begin
for my_cursor in my_cursors loop
if my_cursor.n1=1 then
---做你的循環里內容
end if;
end loop;
end
㈣ oracle存儲過程循環執行SQL語句
實現方式錯了,批量移動數據應該使用Cursor,而不是像分頁那樣每次都查詢。
每次都查詢可能會導致重復數據。
正確方式應該是打開一個Cursor,循環Cursor來插入,使用計數器來控制每次COMMIT的行數:
declare
TYPE R_CURSOR IS REF CURSOR;
i number;
a1_cursor R_CURSOR;
a1_row A1%ROWTYPE;
begin
open a1_cursor FOR
select ID, NAME from A1;
i := 0;
loop
fetch a1_cursor
into a1_row;
exit when a1_cursor%notfound;
INSERT INTO A2 VALUES a1_row;
i := i + 1;
if i >= 5 then
commit;
i := 0;
end if;
end loop;
close a1_cursor;
commit;
end;
㈤ Oracle游標sql語句代碼塊的優化
游標操作的優化:
-- 有一個表格,存儲的是用戶的名字,將 emp 表中所有的用戶名轉換成小寫,再寫入這個表格
create table ename_emp(
ename varchar2(50)
);
-- 下面這個游標的操作,需要 43s時間才能完成
declare
begin
for i in (select ename from emp_liebiao) loop
insert into ename_emp values(lower(i.ename));
commit;
end loop;
end;
-- 因為游標是以行為單位進行數據的操作的,所有游標的效率是比較慢的,而且游標需要消耗的內存也是比較多的,我們需要將游標以行進行操作的方式,修改成一次性操作所有數據的批量的方式。
批量操作在游標裡面 叫做 bulk collect
第一步,創建一個表類型
type 表類型的名字 is table of 表名.列名 %type;
變數名 表類型的名字;
第三步,創建一個游標,讀取某個查詢的結果
cursor 游標名字 is select 查詢語句 ;
第四步,打開游標
open 游標名字;
第五步,捕獲游標的數據,將內容給到表類型的變數進行保存
fetch 游標名字 bulk collect into 變數名字 ;
第六步,使用 forall 語句,對數據進行批量的操作
forall i in 變數 .first .. 變數 .last DML 語句操作 ;
第七步,關閉游標
close 游標名字 ;
declare
-- 創建表類型
type biao is table of emp_liebiao.ename%type;
b biao;
-- 創建游標
cursor m is select ename from emp_liebiao;
begin
-- 打開游標
open m;
-- 將游標的內容批量的給到變數
fetch m bulk collect into b;
-- 使用forall批量修改數據
forall i in b.first .. b.last insert into ename_emp values(lower(b(i)));
commit;
-- 關閉游標
close m;
end;
練習:批量修改用戶的編號,讓編號+工資等級+部門,形成一個新的編號,存入下面的表格中,使用 bulk collect 來實現。
2000以下是 C ,2000-3000是 B ,3000以上是 A ,
例如 SMITH , 新編號應該是 7369_C_20
create table empno_emp(
empno varchar2(50)
);
declare
type biao is table of emp_liebiao%rowtype;
b biao;
cursor m is select * from emp_liebiao;
begin
open m;
fetch m bulk collect into b;
forall i in b.first..b.last
insert into empno_emp values(
b(i).empno||'_'||decode(sign(b(i).sal-2000)+sign(b(i).sal-3000),-2,'C',2,'A','B')||'_'||b(i).deptno
);
commit;
close m;
end;
㈥ Oracle下如何用sql創建游標
For 循環游標
(1)定義游標
(2)定義游標變數
(3)使用for循環來使用這個游標
declare
--類型定義
cursorc_job
is
selectempno,ename,job,sal
fromemp
wherejob='MANAGER';
--定義一個游標變數v_cinfoc_emp%ROWTYPE,該類型為游標c_emp中的一行數據類型
c_rowc_job%rowtype;
begin
forc_rowinc_jobloop
dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);
endloop;
end;
Fetch游標
使用的時候必須要明確的打開和關閉
declare
--類型定義
cursorc_job
is
selectempno,ename,job,sal
fromemp
wherejob='MANAGER';
--定義一個游標變數
c_rowc_job%rowtype;
begin
openc_job;
loop
--提取一行數據到c_row
fetchc_jobintoc_row;
--判讀是否提取到值,沒取到值就退出
--取到值c_job%notfound是false
--取不到值c_job%notfound是true
exitwhenc_job%notfound;
dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);
endloop;
--關閉游標
closec_job;
end;