日期:2014-05-17  浏览次数:20734 次

游标的使用问题
x表中有3列a,b,c,分别存放着列名,表明,过滤条件。
我现在在存储过程中用第一个游标rec取出这3列的值,然后想用第二个游标rec2存放select rec.a from rec.b where rec.c的值,但是现在select rec.a from rec.b where rec.c有错,不知道应该怎么来写这句程序。

------解决方案--------------------
用这种拼的方式也可以。
用using的那种我这每代码了,假设这里的begin、end之间是内层:

create or replace procedure P_VARCHAR2_LST_DYMANTIC(
i_name varchar2, --输入参数,要查询的name中包含的字符串
o_t_varchar OUT t_varchar, --输出参数,为定义的不定长varchar2数组
o_n_ret OUT number --输出参数,正常结束,则输出0,否则抛出异常
)
is
v_cur sys_refcursor; --定义一个游标变量
v_name T_VarcharArray.name%TYPE; --定义一个与T_VarcharArray表的name字段一样的类型的变量
v_sql varchar2(1000); --定义需要动态执行的sql语句
begin
--组织动态sql
--注意,在oracle的字符串常量中,两个''表示一个',即在'前再加一个'表示转义,与java中需要\来转义一样。
--单个的'需要如此,其他的特殊字符未做研究。另外,||表示连接两个常量字符串。
v_sql := 'select name from T_VarcharArray where name like ''%'||i_name||'%''';

--首先初始化一个空的字符串数组对象,此时o_t_varchar.COUNT=0;
o_t_varchar :=t_varchar();
--打开游标
open v_cur for v_sql;
loop
--把只有一个字段name的游标fetch到变量。
--如果是整个table的所有列,可以用%ROWTYPE来定义v_rec,接下来的系列中可能会用到,请注意。
fetch v_cur into v_name;
exit when v_cur%NOTFOUND; --这句紧接fetch,表示如果游标中没有值了,则退出该循环。
o_t_varchar.EXTEND; --数组扩展长度,第一次loop时,COUNT=1,以后依次+1;
o_t_varchar(o_t_varchar.COUNT):=v_name; --把v_name赋值给输出数组的最后一个元素。
end loop;

--千万千万记得打开了的游标要关闭。除非你返回一个游标作为存储过程的输出参数或函数的输出值
close v_cur;
 
o_n_ret :=0;
exception when others then
raise;
end;
/
------解决方案--------------------
SQL code
create or replace procedure p_test is
begin
  for rec in (select a,b,c from x) loop
    execute immediate 'select '||rec.a||' from '||rec.b||' where '||rec.c;
  end loop;
end;
/

------解决方案--------------------
str := 'select '|| rec.a ||' from ' ||rec.b||' where ' rec.c;
execute immediate str;