查询结果是表名,如何再次进行查询
例如:
SQL:select c.cls_tabspace || '.' || c.cls_tabname
          from mw_sys.mwt_om_cls c
         where c.cls_id = 'F288816B-A10E-4961-91B9-BF3D6B4153E3'
的查询结果是一个表名,想实现查询该表名对应的表记录;但是直接引用没有效果,请教该如何引用查询。
select *
  from (select c.cls_tabspace || '.' || c.cls_tabname
          from mw_sys.mwt_om_cls c
         where c.cls_id = 'F288816B-A10E-4961-91B9-BF3D6B4153E3') s

解决方案 »

  1.   

    一个sql语句做不到要不分两步
    要不就用过程
      

  2.   

    能不能说具体点?因为这个表的查询结果我要做完insert语句的数据源,不需要用函数或者存储过程吗?先谢了
      

  3.   

    只能想到动态sql,直接用sql语句够呛.
      

  4.   

    SQL> select * from (select 'emp' from dual);'EM
    ---
    emp
    一句真不行。学习了
      

  5.   

    DECLARE
      V_TAB_NAME VARCHAR2(30);
      V_SQL      VARCHAR2(2000);
    BEGIN  SELECT C.CLS_TABSPACE || '.' || C.CLS_TABNAME
        INTO V_TAB_NAME
        FROM MW_SYS.MWT_OM_CLS C
       WHERE C.CLS_ID = 'F288816B-A10E-4961-91B9-BF3D6B4153E3';  V_SQL := 'insert into tab_b select * from :1';
      EXECUTE IMMEDIATE V_SQL
        USING V_TAB_NAME;
    END;用动态语句吧,一句SQL不行的,因为DB无法解析一个不确定的“表名”
      

  6.   

    自己解决了,创建个函数就行了。
    create or replace function mw_app.get_global_id(in_obj_id in varchar,
                                                    in_cls_id in varchar)
      return varchar2 is
      out_global_id varchar2(20);
      c_sql         varchar2(500);
      tab_name      varchar2(100);
    begin
      select tab
        into tab_name
        from (select c.cls_tabschema || '.' || c.cls_tabname tab
                from mw_sys.mwt_om_cls c
               where c.cls_id = in_cls_id);
      c_sql := 'select GLOBAL_ID from ' || tab_name ||
               ' tab where tab.obj_id = ''' || in_obj_id || '''';
      execute immediate c_sql
        into out_global_id;
      return out_global_id;
    end;
      

  7.   

    呵呵,其实前面都说了,用动态SQL就可以了,你用函数还是过程都行的。不过自己解决就行了