當前位置:首頁 » 編程語言 » oraclesqlloop

oraclesqlloop

發布時間: 2023-03-05 00:13:35

㈠ 請教大神,oracle資料庫循環語句怎麼寫

  1. 你想要的這幾個結果,都可以直接使用sql語句查出,無需循環。

  2. 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;
熱點內容
少兒編程徐州 發布:2024-05-06 01:20:42 瀏覽:460
sqlserver連接驅動 發布:2024-05-06 00:33:34 瀏覽:645
存儲開銷 發布:2024-05-06 00:13:38 瀏覽:953
伺服器怎麼盈利 發布:2024-05-05 23:56:16 瀏覽:941
java網站培訓學校 發布:2024-05-05 23:43:11 瀏覽:40
淘寶搜索演算法 發布:2024-05-05 23:37:07 瀏覽:998
sqlwhencasethen 發布:2024-05-05 23:27:51 瀏覽:641
模架編程軟體 發布:2024-05-05 23:26:54 瀏覽:483
存儲過程異常 發布:2024-05-05 23:24:03 瀏覽:399
winxp訪問不了win7 發布:2024-05-05 23:05:23 瀏覽:734