CREATE OR REPLACE PACKAGE GLOBALPKG
AS
TYPE RCT1 IS REF CURSOR;
IDENTITY INTEGER;
END;
/CREATE OR REPLACE FUNCTION monthnumber
(
time                       IN       VARCHAR2 DEFAULT NULL
)
RETURN GLOBALPKG.RCT1
IS
REFCURSOR  GLOBALPKG.RCT1;
BEGIN  
OPEN REFCURSOR FOR SELECT
 user_id,
 COUNT(s_id) as number
FROM  t_access_user,
 infotest 
WHERE  user_id  = s_creater
 AND SUBSTR(s_create_time, 0, 7)  = monthnumber.time
GROUP BY  user_id 
UNION ALL
 SELECT
 user_id,
 0 * NULL as number
FROM  t_access_user,
 infotest 
WHERE  NOT  user_id  = s_creater
 AND NOT  SUBSTR(s_create_time, 0, 7)  = monthnumber.time
GROUP BY  user_id 
 
;
RETURN REFCURSOR;END;
/

解决方案 »

  1.   

    非常感谢“ashzs((可以包含中文字符)) ”
    还有就是请问,我在oracle中如何判断某一个函数是否存在那??
      

  2.   

    你这种情况oracle里倒是可以类似的用函数实现,比较麻烦
    看它的功能可以用游标实现
    declare 
      time varchar2(10);
    Cursor cr is select user_id,count(s_id) as number  
    from t_access_user,infotest  
    where user_id = s_creater  
    and left(s_create_time,7) = time  
    group by  all user_id;
    begin
      ....
    end;-------------------------------------------
    你说的判断是否存在某个函数,可以用如下方法
    create or replace function IsExists
     (objType in varchar2, 
      objName in Varchar2,
      objValid in int default 1) 
    return integer is
      Result integer;
    begin
      select Decode(count(*),0,0,1) into Result
      from user_objects
       where object_type = upper(objType)
        and status = decode(objValid,1,'VALID',status)
         and object_name = upper(objName);
      return (Result);
    end IsExists;objectType: 对象类型FUNCTION,INDEX,JAVA CLASS,JAVA RESOURCE,LOB,PACKAGE,
                PACKAGE BODY,PROCEDURE,SEQUENCE,TABLE,TYPE,VIEW
    objectName: 对象名称 
    objectValid: 默认为1,表示对象存在并且编译正确才认为存在,
                 其它值 表示只判断对象存在情况,不考虑是否有编译错误 
    em: select isExists('function','isExists') from dual;
        select isExists('view','all_objects',2) from dual;
      

  3.   

    这个你就要在sqlplus下面试验一下了!最好还是看一下sql reference。
      

  4.   

    楼上的兄弟是校验用户开发的函数是否存在。我说的是pl/sql的内置函数。你可以选用。
      

  5.   

    如果你用PL/SQL Developer 的话,里面 右键菜单 Insert Template->SQL Functions 里面包含的pl/sql内置的函数差不多全了
      

  6.   

    用PL/SQL 这类问题就自动解决了!
      

  7.   

    请问"ashzs((可以包含中文字符)) "
    你写得创建函数的语句CREATE OR REPLACE FUNCTION monthnumber
    (
    time                       IN       VARCHAR2 DEFAULT NULL
    )
    RETURN GLOBALPKG.RCT1
    IS
    REFCURSOR  GLOBALPKG.RCT1;
    BEGIN  
    OPEN REFCURSOR FOR* SELECT
     user_id,
     COUNT(s_id) as number
    FROM  t_access_user,
     infotest 
    WHERE  user_id  = s_creater
     AND SUBSTR(s_create_time, 0, 7)  = monthnumber.time
    GROUP BY  user_id 
    UNION ALL
     SELECT
     user_id,
     0 * NULL as number
    FROM  t_access_user,
     infotest 
    WHERE  NOT  user_id  = s_creater
     AND NOT  SUBSTR(s_create_time, 0, 7)  = monthnumber.time
    GROUP BY  user_id 
     
    ;
    RETURN REFCURSOR;END;
    在创建时总是报出*的那一行编译过不去,请受累看一下是什么原因?
      

  8.   

    因为要的很急,还请各位oracle高手,多多帮忙呀!!
    帮帮小弟呀!
      

  9.   

    哦!才看见!其实你的问题出现在group by all这个问题的翻译上!
    因为你要看的是user_id和COUNT(s_id)!当user_id为null的时候,你想让COUNT(s_id)是什么值呢?
    另外!把你的错误提示贴上来,我看看。