参考:
 
create or replace procedure DynamicQuery(p_StrSQL in string) 
is 
v_CursorID INTEGER; 
v_SelectStmt VARCHAR2(500); 
v_Dummy INTEGER; 
v_ReturnRow INTEGER; 
v_MailID VARCHAR2(20); begin 
--打开游标 
v_CursorID:=DBMS_SQL.OPEN_CURSOR; --将传入的SQL文付给已经定义的变量 
v_SelectStmt:=p_StrSQL; --利用DBMS_SQL包的内置函数解析SQL文 
DBMS_SQL.PARSE(v_CursorID,v_SelectStmt,DBMS_SQL.V7); --定义需要输出的变量 
DBMS_SQL.DEFINE_COLUMN(v_CursorID,1,v_MailID,20); --执行SQL文,如果是DML语句,则返回处理的行数 
v_Dummy:=DBMS_SQL.EXECUTE(v_CursorID); loop 
--将匹配查询的行提取到缓冲区,每次一行,返回取到的行数,=0表示不再取到值 
v_ReturnRow:=DBMS_SQL.FETCH_ROWS(v_CursorID); 
if v_ReturnRow=0 then 
exit; 
end if; --将缓冲区中的数据提取到PL/SQL变量中 
DBMS_SQL.COLUMN_VALUE(v_CursorID,1,v_MailID); 
end loop; --关闭游标 
DBMS_SQL.CLOSE_CURSOR(v_CursorID); EXCEPTION 
when others then 
DBMS_SQL.CLOSE_CURSOR(v_CursorID); 
raise; end DynamicQuery;