表名作为参数的动态游标
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