动态游标(例如表名作为参数)以及动态SQL分析

本文深入探讨了如何使用动态SQL来处理表名作为参数的游标,详细阐述了动态游标的实现原理及其在实际应用中的价值,同时分析了动态SQL在数据库操作中的优势和潜在风险。
摘要由CSDN通过智能技术生成

表名作为参数的动态游标

DECLARE
   v_table_name VARCHAR2(30) := 'CUX_MES_WIP_BARCODE_MAP';
   --l_rec        SYS_REFCURSOR;
   TYPE t_data IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
   TYPE t_cur IS REF CURSOR;
   l_data       t_data;
   l_rec        t_cur;
   l_cur        VARCHAR2(4000);
   v_fm_barcode VARCHAR2(30) := 'cxy-p-001';
   v_to_barcode VARCHAR2(30) := 'cxy-p-002';
   v_barcode    VARCHAR2(30);
BEGIN

   l_cur := 'select barcode from ' || v_table_name || ' where barcode >= ' ||
            ''''||v_fm_barcode||'''' || ' and barcode <= ' ||
            ''''||v_to_barcode || '''';
   dbms_output.put_line(l_cur);
   OPEN l_rec FOR l_cur;
   LOOP
      EXIT WHEN l_rec%NOTFOUND;
      FETCH l_rec BULK COLLECT
         INTO l_data;
      FOR i IN 1 .. l_data.count LOOP
      
         dbms_output.put_line(l_data(i));
      END LOOP;
   
   END LOOP;
END;

动态SQL

/*
 1.什么是动态SQL?
 动态SQL是指在运行PL/SQL块时动态输入SQL语句。在PL/SQL块中只能执行DDL(create、alter、drop)、DCL
 (grant、revoke)或比较灵活的SQL语句(如select子句不带where条件);
 动态SQL的性能不如静态SQL,但是比较灵活;
 在PL/SQL块中编写动态SQL语句时需要将SQL语句存放到字符串变量中而且SQL语句可以包含占位符(以冒号开始);
 

2.动态SQL的语法
 2.1 使用execute immediate语句
 可以处理多数动态SQL操作如:DDL语句(create、alter、drop)、DML语句(insert、update、delete)、DCL(grant、revoke)
 以及单行的select子句;但是不能处理多行查询语句。
 

2.2 使用open...for,fetch和close语句
 
在游标中使用。
 

2.3 使用批量动态SQL语句
 
*/
 
---------------------------------------------------------------
 ***************************************************************
 1. 使用execute immediate
 
---------------------------------------------------------------
 1.1 使用execute immediate处理DDL语句
 ---------------------------------------------------------------
 

--案例01:使用execute immediate处理DDL语句--create
 
declare
 create_table  varchar2(200);
 begin
 create_table:='create table ' ||'&table_name' ||'(sid int, sno int)';
 execute  immediate create_table  ;
 end;
 
 
 

--案例02:使用execute immediate处理DDL语句---alter
 
declare
 alter_table  varchar2(200);
 begin
 alter_table:='alter table &target_table_name modify &column_name varchar2(10)';
 execute  immediate alter_table  ;
 end;
 
 
 
 
 
--案例03:使用execute immediate处理DDL语句---drop
 

declare
 drop_table  varchar2(200);
 begin
 drop_table:='drop table ' ||'&target_table_name';
 execute  immediate drop_table  ;
 end;
 
 
 
--案例04:使用execute immediate处理DDL语句--drop table
 
create or replace procedure drop_table (table_name varchar2)
 is 
sql_sta varchar2(200);
 begin
 sql_sta:='drop table ' ||table_name;
 execute immediate sql_sta;
 end;
 

--调用方法:
 exec drop_table('accp');
 
 
 
--案例05:使用execute immediate处理DDL语句--create+select
 declare
 select_sta varchar2(200);
 emp_rec emp%rowtype;
 begin
 execute immediate
 'create table sodi(sid int, sno int)';
 select_sta:='select * from emp where empno=:id';
 execute  immediate select_sta  into emp_rec using &1;   /*使用占位符时,这个占位符是在引号内使用的*/
 end;
 
 
 

---------------------------------------------------------
 1.2 使用execute immediate处理DCL语句
 ----------------------------------------------------------
 
 
 
--案例01:使用execute immediate处理DCL语句--grant
 
create or replace procedure grant_priv(priv varchar2, username varchar2)
 is
 priv_stat varchar2(200);
 begin
 priv_stat:=' grant '|| priv 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值