一下一存储过程:
create or replace procedure P_SYS_GetButtonListByOBJ(v_aspID VARCHAR2,v_userID VARCHAR2,v_objID INTEGER) is
      v_optList   VARCHAR(100);
      v_optListTemp   VARCHAR(100);
     v_qxList    VARCHAR(1000) ;
      v_groupID VARCHAR(20);
      v_idd INTEGER ;       ---对应的操作编号
      v_size INTEGER ;     ----剩下操作的长度
      v_rowcount integer;
     CURSOR qxList_cursor IS
         SELECT vcQxList 
        FROM TB_SYS_QUANXIAN 
           WHERE nObjID=v_objID AND vcAspID=v_aspID AND userID IN (SELECT vcGroupCode FROM  TB_SYS_USER_GROUP   WHERE  vcUserID = v_userID AND vcAspID=v_aspID ) ;/* 获取用户的可用操作*/

begin
      SELECT  vcOptList INTO v_optListTemp
       FROM TB_SYS_OBJECT 
       WHERE nObjID=v_objID; /* 获取功能的可用操作*/
      execute immediate 'CREATE GLOBAL TEMPORARY TABLE Tab( nOptID number) ON COMMIT delete ROWS';
      OPEN  qxList_cursor ;
      FETCH  qxList_cursor into v_qxList;
      while qxList_cursor%Found loop
               v_optList:= v_optListTemp;
               v_idd:= 1 ;
               v_size:= LENGTH(v_optList);
               WHILE v_size>0 loop
                       if (Substr(v_optList,1,1)='1'AND Substr(v_qxList,1,1)='1') then  
                              execute immediate'SELECT COUNT(*)  FROM Tab WHERE nOptID=idd'INTO v_rowcount;
                              if (v_rowcount<=0) then
                                     execute immediate'INSERT into Tab(nOptID) VALUES(idd)';
                              end if;
                       end if;
                       v_idd:=v_idd+1;
                     v_size:=v_size-1;
                       v_optList:=Substr(v_optList,-1);
                       v_qxList:=SubStr(v_qxList,-1);
               end loop;
               fetch qxList_cursor into v_qxList;
               
      end loop;
      close qxList_cursor;
      execute immediate'SELECT a.nOptID,a.vcOptName,a.vcTitle,a.vcInIMG,a.vcOutIMG 
                        FROM  TB_SYS_OPERATOR a, Tab b 
                          WHERE a.nOptID=b.nOptID ORDER BY a.nOptID';
  execute immediate'DROP TABLE Tab' ;
end P_SYS_GetButtonListByOBJ;
在测试时出错,好像时临时表操作的问题,我刚接触ORACLE,哪位大侠帮我指出下

解决方案 »

  1.   

    找到这句execute immediate'SELECT COUNT(*)  FROM Tab WHERE nOptID=idd'INTO v_rowcount;有错,我改成这样 execute immediate' SELECT COUNT(*) FROM Tab WHERE nOptID='||v_idd INTO v_rowcount;后这个问题跳过了,但现在执行到这句 时又报错了:execute immediate'INSERT into Tab(nOptID) VALUES(v_idd)'
      

  2.   

    改为SELECT COUNT(*) intov_rowcount FROM Tab WHERE nOptID=idd
      

  3.   

    execute immediate'INSERT into Tab(nOptID) VALUES(:v_idd)' using v_idd
    动态执行SQL,应使用绑定变量
    或者
    execute immediate'INSERT into Tab(nOptID) VALUES('||v_idd||')'
      

  4.   

    上面的问题我改好了,但最后那条:
    execute immediate'SELECT a.nOptID,a.vcOptName,a.vcTitle,a.vcInIMG,a.vcOutIMG 
                            FROM  TB_SYS_OPERATOR a, Tab b 
                              WHERE a.nOptID=b.nOptID ORDER BY a.nOptID';
    在存储过程中返回记录集我不知道怎么写?
      

  5.   

    定义一个返回游标,比如cur,然后open cur for select ..........