select servid into aa from tablea a where a.id='111';
aa查出来是'222'select * from tableb b where b.id=aa; --执行报错
若select * from tableb b where b.id=‘222’;--执行成功请问要如何实现
select * from tableb b where b.id=aa;
要分开写,不要写在一个语句内实现,譬如下面这样
select * from tableb b where b.id in (select servid from tablea a where a.id='111')

解决方案 »

  1.   

    select servid into aa from tablea a where a.id='111';
    select * from tableb b where b.id=aa; --执行报错
    这两个语句,只能出现在 过程 、函数中 或匿名块中。第二个语句,你查询完以后,要做什么 操作呢 ?
      

  2.   

    select servid into aa from tablea a where a.id='111'; 这个是举例,这样执行没问题
    select * from tableb b where b.id=aa; --执行报错 ,目前要根据aa的值做查询,aa是变量就无法实现,aa是‘111’就可以执行
      

  3.   

    这个需要动态sql吧。可以这样,第二个查询的结果可以用游标逐行处理
    DECLARE
        AA        TABLEA.SERVID%TYPE;
        V_SQLSTMT VARCHAR2(300);
    BEGIN
        SELECT SERVID INTO AA FROM TABLEA A WHERE A.ID = '111';    V_SQLSTMT := 'SELECT * FROM tableb b WHERE b.id=:aa';
        EXECUTE IMMEDIATE V_SQLSTMT
            USING AA;
    END;
      

  4.   

    oracle的存储过程不能用select 返回结果集的吧?oracle的存储过程不是只能用select into吗= =
    或者用游标遍历来输出所有的结果集4L用动态SQL语句可以编译成功但是并不会输出任何结果,只是会提示过程已成功完成,想输出结果还是得用游标。
      

  5.   

    而且要注意,execute immediate只能处理单行查询,多行查询只能用游标。但是在execute immediate 加上bulk collect into的话可以批量绑定来处理多行查询。
      

  6.   

    我们注意到,能过在sp_executesql这个存储过程中执行@sql参数,并重新定义@count参数,并使用@sql之外的参数@count进行输出,就能很好的处理参数传入的问题。