Oracle Sql 循环

本文展示了两个 Oracle SQL 中的循环示例:一个简单的数字循环和一个从表中检索数据的循环。通过 DBMS_OUTPUT.PUT_LINE 进行输出展示。

Oracle Sql 循环

 

Declare 
Lcntr number; 
Begin 
FOR Lcntr IN 1..5
LOOP 
     DBMS_OUTPUT.PUT_LINE('Lcntr='||Lcntr);
END LOOP; 
end;

 

Begin 
FOR REC_INIT IN (select HZ_NAME from HZ) LOOP
    DBMS_OUTPUT.PUT_LINE(hz='||REC_INIT.ID);
END LOOP;

end;

 

<think> 我们正在讨论Oracle SQL中的循环。在Oracle PL/SQL中,我们可以使用循环结构来重复执行SQL语句。根据引用[1]和引用[2]中的例子,我们可以使用基本的循环结构,如FOR循环。 引用[1]中提供了一个示例,使用FOR循环插入1000条记录。引用[2]则提到了在T-SQL中定义语句块和IF条件,但Oracle中我们使用PL/SQL。 在Oracle数据库中,循环通常写在PL/SQL块中。常见的循环有: 1. 基本循环(LOOP ... END LOOP) 2. WHILE循环 3. FOR循环(数值FOR循环和游标FOR循环) 下面我将给出每种循环的示例,并说明使用方法。 ### 1. 基本循环(LOOP) 基本循环会无限循环直到遇到`EXIT`或`EXIT WHEN`语句退出。 示例:打印1到5的数字 ```plsql DECLARE i NUMBER := 1; BEGIN LOOP DBMS_OUTPUT.PUT_LINE(i); i := i + 1; EXIT WHEN i > 5; END LOOP; END; ``` ### 2. WHILE循环循环开始前检查条件。 示例:打印1到5的数字 ```plsql DECLARE i NUMBER := 1; BEGIN WHILE i <= 5 LOOP DBMS_OUTPUT.PUT_LINE(i); i := i + 1; END LOOP; END; ``` ### 3. FOR循环(数值FOR循环) 用于已知循环次数的情况。 示例:打印1到5的数字 ```plsql BEGIN FOR i IN 1..5 LOOP DBMS_OUTPUT.PUT_LINE(i); END LOOP; END; ``` ### 4. 游标FOR循环 用于遍历查询结果集。 示例:遍历员工表(emp)的所有员工姓名并打印 ```plsql BEGIN FOR rec IN (SELECT ename FROM emp) LOOP DBMS_OUTPUT.PUT_LINE(rec.ename); END LOOP; END; ``` ### 循环执行SQL语句 在循环执行SQL语句,如引用[1]中的示例,在循环中插入100条记录: ```plsql DECLARE i NUMBER; BEGIN FOR i IN 1..100 LOOP INSERT INTO AUSERTABLE(USERID, USERPID, USERNAME) VALUES('01'||TO_CHAR(i), '8', '武汉'); END LOOP; COMMIT; END; ``` ### 注意事项 - 在PL/SQL中,循环必须写在`DECLARE`、`BEGIN`、`END`块中。 - 使用`DBMS_OUTPUT.PUT_LINE`输出信息需要在客户端启用输出(如SQL*Plus中执行`SET SERVEROUTPUT ON`)。 - 在循环执行DML语句(如INSERT、UPDATE、DELETE)时,可以在循环结束后一次性提交(如上面的例子),也可以在循环内提交,但要注意频繁提交影响性能。 ### 性能考虑 当循环次数非常多时(如百万次),在循环中逐条执行SQL效率较低。此时,应考虑使用批量操作(BULK COLLECT和FORALL)来提高性能。引用[3]中提到了执行计划和性能调优,对于循环内的SQL语句,我们可以通过查看执行计划来优化[^3]。 ### 示例:批量插入(使用FORALL) ```plsql DECLARE TYPE t_id IS TABLE OF AUSERTABLE.USERID%TYPE; TYPE t_pid IS TABLE OF AUSERTABLE.USERPID%TYPE; TYPE t_name IS TABLE OF AUSERTABLE.USERNAME%TYPE; v_ids t_id := t_id(); v_pids t_pid := t_pid(); v_names t_name := t_name(); BEGIN FOR i IN 1..100 LOOP v_ids.EXTEND; v_pids.EXTEND; v_names.EXTEND; v_ids(i) := '01'||TO_CHAR(i); v_pids(i) := '8'; v_names(i) := '武汉'; END LOOP; FORALL i IN 1..v_ids.COUNT INSERT INTO AUSERTABLE(USERID, USERPID, USERNAME) VALUES(v_ids(i), v_pids(i), v_names(i)); COMMIT; END; ``` ### 相关问题 §§相关问题§§ 1. 如何在Oracle中调试PL/SQL循环? 2. 如何避免在循环执行SQL的性能问题? 3. 游标循环和显式游标的使用有什么不同? 4. 如何捕获循环中的异常并进行处理? 5. 在PL/SQL中,如何跳出多重循环? </think> ### Oracle SQL 循环的使用方法与示例 在 Oracle 中,循环主要通过 PL/SQL 实现(过程化 SQL 扩展),因为标准 SQL 本身不支持流程控制语句。以下是常见循环结构的详解: --- #### 1. **基本 LOOP 循环** ```plsql DECLARE i NUMBER := 1; BEGIN LOOP INSERT INTO AUSERTABLE(USERID, USERPID, USERNAME) VALUES('USER' || i, 'PWD' || i, 'User' || i); i := i + 1; EXIT WHEN i > 10; -- 退出条件 END LOOP; COMMIT; END; ``` **说明**: - `LOOP...END LOOP` 定义循环体 - `EXIT WHEN` 设置退出条件 - 适用于不确定循环次数的场景 --- #### 2. **FOR 循环**(最常用) ```plsql BEGIN FOR i IN 1..100 LOOP -- 循环100次 UPDATE employees SET salary = salary * 1.05 WHERE employee_id = i; END LOOP; COMMIT; END; ``` **说明**: - `i IN 1..100` 定义数字范围循环 - 自动声明计数器变量 `i` - 适合已知循环次数的操作[^1] --- #### 3. **WHILE 循环** ```plsql DECLARE counter NUMBER := 5; BEGIN WHILE counter > 0 LOOP DBMS_OUTPUT.PUT_LINE('Countdown: ' || counter); counter := counter - 1; END LOOP; END; ``` **说明**: - 先检查条件再执行 - 输出结果: ``` Countdown: 5 Countdown: 4 ... Countdown: 1 ``` --- #### 4. **游标 FOR 循环**(处理查询结果) ```plsql DECLARE CURSOR emp_cursor IS SELECT employee_id, last_name FROM employees; BEGIN FOR rec IN emp_cursor LOOP INSERT INTO audit_table VALUES(rec.employee_id, rec.last_name, SYSDATE); END LOOP; COMMIT; END; ``` **说明**: - 自动打开/关闭游标 - `rec` 存储当前行数据 - 避免手动处理游标状态[^2] --- ### 关键注意事项 1. **性能优化** - 批量操作优先:循环内单条 DML 效率低,建议用 `FORALL` 批量处理 - 示例对比: ```plsql -- 低效:单条插入 FOR i IN 1..1000 LOOP INSERT INTO table VALUES(...); END LOOP; -- 高效:批量插入 FORALL i IN 1..1000 INSERT INTO table VALUES(...); ``` 2. **事务控制** - 循环内避免频繁 COMMIT(影响性能) - 推荐在循环结束后一次性提交 3. **错误处理** ```plsql BEGIN FOR i IN 1..100 LOOP BEGIN -- 业务逻辑 EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error at index ' || i); END; END LOOP; END; ``` --- ### 应用场景示例 **生成测试数据**(引用[1]案例扩展): ```plsql BEGIN FOR i IN 1..1000 LOOP INSERT INTO AUSERTABLE(USERID, USERPID, USERNAME) VALUES( 'UID' || LPAD(i, 5, '0'), -- 生成UID00001格式 DBMS_RANDOM.STRING('A', 8), -- 8位随机密码 '城市' || MOD(i, 10) -- 循环分配城市 ); END LOOP; COMMIT; END; ``` > 📌 提示:实际开发中,循环操作应考虑执行计划优化。可通过 `EXPLAIN PLAN` 分析性能[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值