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有错,不知道应该怎么来写这句程序。

解决方案 »

  1.   

    内层用动态sql的execute immediate v_sql using rec.a,rec.b,rec.c。
      

  2.   

    --使用动态SQL
    execute immediate 'select '||rec.a||' from '||rec.b||' where '||rec.c;
      

  3.   

    用这种拼的方式也可以。
    用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;
    /
      

  4.   

    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;
    /
      

  5.   

    str := 'select '||  rec.a  ||'  from ' ||rec.b||' where ' rec.c;
    execute immediate  str;
      

  6.   

    谢谢各位了。现在我想要的select语句已经有了。我想把这些语句执行的结果插入到一张表中。这个没办法实现。
      

  7.   


    execute immediate 'insert into *** select语句';
    不就完了?