java 连接orcale (使用for循环,循环次数不可以超过299)一

本文展示了一个使用Java进行Oracle数据库操作的例子,通过批量插入数据的方式揭示了Oracle中关于打开游标数量限制的问题。该例子中尝试连续插入299条记录到数据库,当尝试插入更多记录时,会触发Oracle的打开游标数量限制错误。
package connect.orcale;


import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
  
public class linkTest2 { 
    public static void main(String[] args) throws SQLException { 
        Connection conn = null; 
        PreparedStatement stmt = null; 
        ResultSet rs = null; 
        try { 
            Class.forName("oracle.jdbc.driver.OracleDriver"); 
            conn = DriverManager.getConnection( 
                    "jdbc:oracle:thin:@localhost:1521:orcl", "scott", "Admin518"); // "scott", "Admin518"分别为用户名和密码
            for(int i=1 ;i<=299;i++){//i不可以大于或等等于300
            stmt = conn.prepareStatement("insert into USERT values(id.nextval,'ctl')"); 
				stmt.executeUpdate();
			}
           
        } catch (ClassNotFoundException e) { 
            e.printStackTrace(); 
        } catch (SQLException e) { 
            e.printStackTrace(); 
        } 
        finally
        { 
            if(rs!= null) rs.close(); 
            if(stmt!= null) stmt.close(); 
            if(conn != null) conn.close(); 
        } 
    } 
}
/*当for'循环中的i>=300时会出现下面的错误
 * java.sql.SQLException: ORA-00604: 递归 SQL 级别 1 出现错误
ORA-01000: 超出打开游标的最大数
ORA-00604: 递归 SQL 级别 1 出现错误
ORA-01000: 超出打开游标的最大数
ORA-01000: 超出打开游标的最大数

	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
	at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)
	at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:216)
	at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:955)
	at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1168)
	at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3316)
	at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3400)
	at connect.orcale.linkTest2.main(linkTest2.java:21)
Exception in thread "main" java.sql.SQLException: ORA-02002: 写入审计线索时出错
ORA-00604: 递归 SQL 级别 1 出现错误
ORA-01000: 超出打开游标的最大数

	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:283)
	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:278)
	at oracle.jdbc.driver.T4C7Ocommoncall.receive(T4C7Ocommoncall.java:141)
	at oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:464)
	at oracle.jdbc.driver.PhysicalConnection.close(PhysicalConnection.java:1184)
	at connect.orcale.linkTest2.main(linkTest2.java:33)

 * */

Oracle数据库中,有多种类型的for循环,下面分别介绍它们的使用方法: ### 简单的数值型FOR循环 这种循环用于在个指定的数值范围内进行迭代。语法格式如下: ```sql FOR index_variable IN [REVERSE] lower_bound..upper_bound LOOP -- 循环体代码 END LOOP; ``` 其中,`index_variable` 是循环索引变量,`lower_bound` 是下限,`upper_bound` 是上限。`REVERSE` 关键字可选,如果使用则表示从上限到下限进行递减迭代。 示例代码: ```sql DECLARE BEGIN FOR i IN 1..5 LOOP DBMS_OUTPUT.PUT_LINE('当前数字是: ' || i); END LOOP; END; ``` 在这个示例中,循环从1迭代到5,每次迭代都会输出当前的数字。 ### 游标FOR循环 游标FOR循环用于遍历游标中的所有记录。语法格式如下: ```sql FOR record_variable IN cursor_name LOOP -- 循环体代码,使用 record_variable 访问记录的字段 END LOOP; ``` 其中,`record_variable` 是个隐式声明的记录变量,`cursor_name` 是游标的名称。 示例代码: ```sql DECLARE CURSOR emp_cursor IS SELECT employee_id, first_name, last_name FROM employees; BEGIN FOR emp_rec IN emp_cursor LOOP DBMS_OUTPUT.PUT_LINE('员工ID: ' || emp_rec.employee_id || ', 姓名: ' || emp_rec.first_name || ' ' || emp_rec.last_name); END LOOP; END; ``` 在这个示例中,游标 `emp_cursor` 从 `employees` 表中选取员工信息,循环遍历游标中的每条记录并输出员工的ID和姓名。 ### 嵌套FOR循环 可以在FOR循环内部嵌套另FOR循环,以实现更复杂的逻辑。 示例代码: ```sql DECLARE BEGIN FOR i IN 1..3 LOOP FOR j IN 1..2 LOOP DBMS_OUTPUT.PUT_LINE('外层循环变量 i = ' || i || ', 内层循环变量 j = ' || j); END LOOP; END LOOP; END; ``` 在这个示例中,外层循环从1到3迭代,对于外层循环的每次迭代,内层循环从1到2迭代,每次迭代都会输出当前的外层和内层循环变量的值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值