CREATE OR REPLACE FUNCTION F_GetRootForExport( FID IN varchar2)RETURN INTis CID varchar2(64);
 FID_TEMP varchar2(64);
BEGIN 
FID_TEMP := FID  WHILE EXISTS(SELECT 1 FROM BMS_BOM_EXPORT WHERE item_code_d=FID) LOOP           CID:=FID
        
        SELECT item_code into FID FROM BMS_BOM_EXPORT WHERE item_code_d=CID
     IF FID_TEMP=FID
   then
         RETURN 1
        end if
    END LOOP;    RETURN 2END;
上面是我写的一个函数,总是报错,语法上估计有问题,新手,请指教。

解决方案 »

  1.   

    ..怎么一个断句的分号都没有。比如
    CID:=FID;
    return 1;
    return 2;
      

  2.   

    嗯 我都加了分号,又提示exists只能在sql语句中使用,这个是sql server的函数,我新手,对Oracle不了解 不好意思,这个exists在Oracle中用什么样的类似功能能代替呢
      

  3.   

    有些地方要加‘;’
    你的return 1放在了循环的里面,这样可能会存在多个值,那返回的时候会出错的
      

  4.   

    return 1 时是遇到符合条件的就返回,while就不继续运行下去了,不知道我这样理解是否正确?
      

  5.   

    嗯,不能用exists,还有传入参数不能赋值
    这样试试
    CREATE OR REPLACE FUNCTION F_GetRootForExport( FID IN varchar2) RETURN INT is CID varchar2(64); 
    FID_TEMP varchar2(64);
    fid_temp2 varchar2(64); 
    v_count number;
    BEGIN 
    FID_TEMP := FID    LOOP 
        SELECT count(1) into v_count FROM BMS_BOM_EXPORT WHERE item_code_d=FID;
      
        exit when v_count=0;        CID:=FID ;
            
            SELECT item_code into fid_temp2 FROM BMS_BOM_EXPORT WHERE item_code_d=CID ;
        IF FID_TEMP=fid_temp2 
      then 
            RETURN 1 ;
            end if ;
        END LOOP;     RETURN 2 ;END; 
      

  6.   

    哦 非常感谢你的答疑,公司要的东西催的比较紧,我没时间看书了,你给的这个还会报错,我用的PL/SQL
      

  7.   

    begin下面的第一句,分号忘记加了
      

  8.   

     GOOD,非常感谢,解决了一个在我看来很难得题目
      

  9.   

    还有一个参数要改下,可能会有死循环
    你这个cid好像没有用啊,你自己整理下逻辑
    CREATE OR REPLACE FUNCTION F_GetRootForExport( FID IN varchar2) RETURN INT is CID varchar2(64); 
    FID_TEMP varchar2(64);
    fid_temp2 varchar2(64); 
    v_count number;
    BEGIN 
    FID_TEMP := FID ;
    fid_temp2:= fid;   LOOP 
        SELECT count(1) into v_count FROM BMS_BOM_EXPORT WHERE item_code_d=fid_temp2;
      
        exit when v_count=0;        CID:=FID ;
            
            SELECT item_code into fid_temp2 FROM BMS_BOM_EXPORT WHERE item_code_d=CID ;
        IF FID_TEMP=fid_temp2 
      then 
            RETURN 1 ;
            end if ;
        END LOOP;     RETURN 2 ;END; 
      

  10.   

    CID:=FID 可能也要改成cid:=fid_temp2
      

  11.   

    CREATE OR REPLACE FUNCTION F_GetRootForExport( FID IN varchar2) 
    RETURN INT 
    is 
    --CID varchar2(64);
    FID_TEMP varchar2(64);
    fid_temp2 varchar2(64); 
    v_count number;
    BEGIN 
    FID_TEMP := FID ;
    FID_TEMP2 := FID ;
       LOOP 
        SELECT count(1) into v_count FROM BMS_BOM_EXPORT WHERE item_code_d=fid_temp2;
        exit when v_count=0;
            SELECT item_code into fid_temp2 FROM BMS_BOM_EXPORT WHERE item_code_d=fid_temp2;
        IF FID_TEMP=fid_temp2 THEN 
            RETURN 1 ;
            end if ;
        END LOOP; 
        RETURN 2;
    END; --不用在用一个CID来传值了!