NAT配置详解
2010-04-11 19:19
155 查看
本地动态SQL
1.执行非查询语句和PL/SQL块
2.执行查询
类似于游标变量,查询也是使用OPEN FOR语句执行的。它们的区别是包含查询的串可以是PL/SQL变量,而非文字。与其他任何变量一样,也可以从得到的游标变量中提取数据。对于绑定,就像EXECUTE IMMEDIATE一样,USING子句是可用的。
3.成批绑定:
PL/SQL语句块中的SQL语句被发送到SQL引擎中进行执行。SQL引擎可以依次把数据发送回PL/SQL引擎(作为查询的结果)。在许多情况下,在数据库中将要插入或更新的数据首先放到一个PL/SQL集合中,然后该集合使用FOR循环进行迭代计算,并把信息发送到SQL引擎。对于该集合中的每一行,都将产生一个PL/SQL和SQL之间的上下文开关。
Oracle8i及更高版本允许你把一个集合里的所有行在一次操作中都传递到SQL引擎中,删除到只剩一个上下文开关,这叫做成批绑定,它使用FORALL语句来完成,下面是一个例子:
BULK COLLECT子句可用作SELECT INTO,FETCH INTO,RETURNING INTO子句的一部分,并将从查询中把行检索到所指示的集合中。
注:FORALL可以用于集合类型以及INSERT,UPDATE,DELETE 语句中,而BULK COLLECT子句用于取数据
1.执行非查询语句和PL/SQL块
DECLARE v_SQLString VARCHAR2(200); v_PLSQLBlock VARCHAR2(200); v_Count2 NUMBER; BEGIN EXECUTE IMMEDIATE 'create table tmp_table (col1 varchar2(10),col2 varchar2(10))'; --DDL语句最后不能加分号 FOR v_Count IN 1 .. 10 LOOP v_Count2 := v_Count + 1; v_SQLString := 'insert into tmp_table (col1,col2) values (:var_test,:var_test2)'; --DML语句最后不能加分号 EXECUTE IMMEDIATE v_SQLString USING v_Count, v_Count2; END LOOP; v_PLSQLBlock := 'begin for v_rec in (select * from tmp_table) loop dbms_output.put_line(v_rec.col1||' || ''',''' || '||v_rec.col2); end loop; end;'; --PL/SQL块最后需要加分号 EXECUTE IMMEDIATE v_PLSQLBlock; EXECUTE IMMEDIATE 'drop table tmp_table'; END; /
2.执行查询
类似于游标变量,查询也是使用OPEN FOR语句执行的。它们的区别是包含查询的串可以是PL/SQL变量,而非文字。与其他任何变量一样,也可以从得到的游标变量中提取数据。对于绑定,就像EXECUTE IMMEDIATE一样,USING子句是可用的。
DECLARE v_Emp emp%ROWTYPE; v_empno NUMBER; v_SQLQuery VARCHAR2(500); BEGIN v_empno:=7369; v_SQLQuery:='select * from emp where empno=:eno'; EXECUTE IMMEDIATE v_SQLQuery INTO v_Emp USING v_empno; dbms_output.put_line(v_Emp.ename); EXCEPTION WHEN no_data_found THEN dbms_output.put_line('no_data_found...'); END; /
3.成批绑定:
PL/SQL语句块中的SQL语句被发送到SQL引擎中进行执行。SQL引擎可以依次把数据发送回PL/SQL引擎(作为查询的结果)。在许多情况下,在数据库中将要插入或更新的数据首先放到一个PL/SQL集合中,然后该集合使用FOR循环进行迭代计算,并把信息发送到SQL引擎。对于该集合中的每一行,都将产生一个PL/SQL和SQL之间的上下文开关。
Oracle8i及更高版本允许你把一个集合里的所有行在一次操作中都传递到SQL引擎中,删除到只剩一个上下文开关,这叫做成批绑定,它使用FORALL语句来完成,下面是一个例子:
DECLARE TYPE t_Numbers IS TABLE OF tmp_table.num_col%TYPE INDEX BY BINARY_INTEGER; TYPE t_Strings IS TABLE OF tmp_table.char_col%TYPE INDEX BY BINARY_INTEGER; v_Numbers t_Numbers; v_Strings t_Strings; v_NumErrors NUMBER; BEGIN DELETE FROM tmp_table; FOR v_Count IN 1 .. 10 LOOP v_Numbers(v_Count) := v_Count; v_Strings(v_Count) := '1234567890'; END LOOP; FORALL v_Count IN 1 .. 10 INSERT INTO tmp_table VALUES (v_Numbers(v_Count), v_Strings(v_Count)); --Add an extra character to v_Strings(6). v_Strings(6) := v_Strings(6) || 'a'; --This bulk update will fail on the sixth row,and continue processing. FORALL v_Count IN 1 .. 10 SAVE EXCEPTIONS UPDATE tmp_table SET char_col = char_col || v_Strings(v_Count) WHERE num_col = v_Numbers(v_Count); COMMIT; EXCEPTION WHEN OTHERS THEN dbms_output.put_line('Got exception: ' || SQLERRM); --Print out any errors. v_NumErrors := SQL%BULK_EXCEPTIONS.COUNT; dbms_output.put_line('Number of errors during processing: ' || v_NumErrors); FOR v_Count IN 1 .. v_NumErrors LOOP dbms_output.put_line('Error ' || v_Count || ' , iteration ' || SQL%BULK_EXCEPTIONS(v_Count) .ERROR_INDEX || ' is: ' || SQLERRM(0 - SQL%BULK_EXCEPTIONS(v_Count) .ERROR_CODE)); END LOOP; COMMIT; END; / SQL> Got exception: ORA-24381: 数组 DML 出错 Number of errors during processing: 1 Error 1 , iteration 6 is: ORA-12899: 列 的值太大 (实际值: , 最大值: ) PL/SQL procedure successfully completed
BULK COLLECT子句可用作SELECT INTO,FETCH INTO,RETURNING INTO子句的一部分,并将从查询中把行检索到所指示的集合中。
注:FORALL可以用于集合类型以及INSERT,UPDATE,DELETE 语句中,而BULK COLLECT子句用于取数据
相关文章推荐
- 思科路由器NAT配置详解
- LVS的2种模式,DR/NAT详解和具体配置
- 思科路由器NAT配置详解
- Cisco——NAT详解及经典配置
- 思科路由器NAT配置详解(转)
- Vmware虚拟机NAT配置静态IP详解
- vmware虚拟机NAT配置静态IP教程详解
- 虚拟机网络配置详解(NAT、桥接、Hostonly)
- NAT技术详解及配置实例
- LVS- NAT,DR模型详解及配置
- NAT配置详解
- 华为NAT基本配置实例详解
- 大型企业网络配置系列课程详解(七) --NAT的配置与相关概念的理解
- VMware WorkStation11的三种网络连接方式详解与NAT模式下静态IP配置(Ubuntu12.04版本)
- Linux 中LVS NAT 配置步骤的详解
- 虚拟机网络配置(NAT、桥接、Hostonly)详解
- NAT配置详解
- Cisco系列路由器NAT配置详解介绍