错误提示如下: Compilation errors for PROCEDURE HU_CLINIC.P_GET_OPERATES Error: PLS-00103: Encountered the symbol ")" when expecting one of the following: 
      
          <an identifier> <a double-quoted delimited-identifier> 
          current 
Line: 1 
Text: create or replace procedure P_GET_OPERATES() is Error: PLS-00103: Encountered the symbol "CREATE" when expecting one of the following: 
      
          begin case declare exit for goto if loop mod null pragma 
          raise return select update while with <an identifier> 
          <a double-quoted delimited-identifier> <a bind variable> < < 
          close current delete fetch lock insert open rollback 
          savepoint set sql execute commit forall merge pipe 
Line: 9 
Text: CREATE TEMPORARY TABLE OPERATE_USERS Error: Hint: Comparison with NULL in 'P_GET_OPERATES' 
Line: 28 
Text: if (v_maxid!='') 
写了一个游标,创建一个临时表,返回数据集, 
存储过程如下 
create or replace procedure P_GET_OPERATES() is 
v_code varchar2(50); 
v_name varchar2(50); 
v_srm varchar2(50); 
v_maxid varchar2(50); 
v_count number(10); 
BEGIN CREATE TEMPORARY TABLE OPERATE_USERS 
( CODE VARCHAR(20) NULL; 
NAME VARCHAR(50) NULL; 
SPM VARCHAR(50) NULL; 

ON COMMIT  ROWS ; 
  
  DECLARE cursor users_cursor is 
                select code,name,srm 
                from hu_pub. hts_workers 
          BEGIN 
          open users_cursor; 
            loop 
                  fetch users_cursor into v_code,v_name,v_srm; 
                  
                    Select max(ID) as id From HU_PUB.HVS_USERS 
                          into v_maxid 
                          Where Type = 0 and UserCode = V_CODE; 
                    
                    if (v_maxid!='') 
                    THEN                  
                            ------------------查权限------------------------------------                    
                            select count(*) as count 
                                    into v_count 
                                    from HU_PUB.HVS_USERRIGHTS A 
                                    inner join  ( 
                                                select * 
                                                      from HU_PUB.HVS_USERS 
                                                      start with ID = v_maxid 
                                                      connect by prior PARENTID = ID) B ON (A.ID=B.ID) 
                                    where rightscode in (8001,8002,8003) 
                            
                            ----如果具有权限,将用户名加到结果列表---------- 
                            IF (v_count>0) 
                            THEN 
                                insert into OPERATE_USERS(code,name) values(V_CODE,V_NAME,V_SRM); 
                                COMMIT; 
                            END IF; 
                            -------------------------------------------------- 
                      END IF; 
                                              
                    END; 
                                            
                  SELECT 
                  
                  exit when users_cursor%notfound; 
            end loop; 
          END;  
        close users_cursor; 
        
        SELECT * FROM OPERATE_USERS; 
        DROP TABLE OPERATE_USERS; 
end P_GET_OPERATES; 

解决方案 »

  1.   

    ?http://topic.csdn.net/u/20090911/12/b05687cb-9ba4-44b5-bfbc-b9dfcdd475c6.html?39496楼不是回了么
      

  2.   

    1.DML语句不能写在procedure中;包括trunc,create,drop,alert之类。
    2.cursor申明应该在begin外;
    3.判断是否为空不能用!='',应该是is not null;
    4.select一定要有Into承接结果和我不一致的地方就是你要改的
      

  3.   

    还有其他一些小错误,比如建表语句是错的,columns之间不能用;而是,
      

  4.   

    SELECT * FROM OPERATE_USERS; 
            DROP TABLE OPERATE_USERS; 
    这两句都不能直接放在过程里
    你想如何返回数据集呢?
    执行完过程,再SELECT * FROM OPERATE_USERS; 
    不就好了
    或者在过程里用dbms_output.put_line()一行一行打印出来
    还有临时表不能这么删除
      

  5.   

    存储过程里面的DDL,需要写成动态的,用execute immediate执行
    execute immediate ' CREATE TEMPORARY TABLE OPERATE_USERS 
    ( CODE VARCHAR(20) NULL; 
    NAME VARCHAR(50) NULL; 
    SPM VARCHAR(50) NULL; 

    ON COMMIT  ROWS ';