(
ProgramId VARCHAR2,
FileId int,
PCursor out DATATYPE.MYCURSOR
)
 AS
BEGIN
    open PCursor for
     SELECT
A.PROGRAM_ID,
        B.FILEID 
from TABLE1 A 
   INNER JOIN TABLE2 B on A.PROGRAM_ID=B.PROGRAM_ID
where 1=1 ;
     IF ProgramId <> "" then
            AND A.PROGRAM_ID = ProgramId 
  end IF;
   if FileId <> "" then
    AND B.FILEID  = FileId 
   end if;
END这样写编译错误,应该怎么修改呢?

解决方案 »

  1.   

    create or replace PROCEDURE 名字( 
    ProgramId VARCHAR2, 
    FileId int, 
    PCursor out DATATYPE.MYCURSOR 

    AS 
    BEGIN 
        IF ProgramId is not null then 
           open PCursor for 
        SELECT A.PROGRAM_ID,B.FILEID 
    from TABLE1 A 
      INNER JOIN TABLE2 B on A.PROGRAM_ID=B.PROGRAM_ID 
    where 1=1 AND A.PROGRAM_ID = ProgramId ;
    end IF; 
      if FileId is not null and  then 
        open PCursor for 
        SELECT A.PROGRAM_ID,B.FILEID 
    from TABLE1 A 
      INNER JOIN TABLE2 B on A.PROGRAM_ID=B.PROGRAM_ID 
    where 1=1 AND B.FILEID  = FileId ;
      end if; 
    END ;
      

  2.   

    上面多写了个and
    create or replace PROCEDURE 名字( 
    ProgramId VARCHAR2, 
    FileId int, 
    PCursor out DATATYPE.MYCURSOR 

    AS 
    BEGIN 
        IF ProgramId is not null then 
           open PCursor for 
        SELECT A.PROGRAM_ID,B.FILEID 
    from TABLE1 A 
      INNER JOIN TABLE2 B on A.PROGRAM_ID=B.PROGRAM_ID 
    where 1=1 AND A.PROGRAM_ID = ProgramId ;
    end IF; 
      if FileId is not null then 
        open PCursor for 
        SELECT A.PROGRAM_ID,B.FILEID 
    from TABLE1 A 
      INNER JOIN TABLE2 B on A.PROGRAM_ID=B.PROGRAM_ID 
    where 1=1 AND B.FILEID  = FileId ;
      end if; 
    END ;
      

  3.   

    那是不是还要写一段
    IF ProgramId is not null and FileId is not null then 
    ......
    end if; 
      

  4.   

    IF ProgramId is null and FileId is null then
    ......
    end if; 还有
      

  5.   

    lz可以看看动态sql相关知识
      

  6.   

    比如:
    http://tech.sina.com.cn/s/2004-10-22/1410445174.shtml
      

  7.   

    用動態的,where條件後面的可以動態變化,最後再執行動態的語句.
      

  8.   

    case when 去拼接串,形如:
    SQL> select 1 from dual where 1=(case when 1>0 then 1 else 2 end);         1
    ----------
             1SQL> select 1 from dual where 1=(case when 1>2 then 1 else 2 end);未选定行SQL>
      

  9.   


    CREATE OR REPLACE PROCEDURE XXXX( 
    ProgramId VARCHAR2, 
    FileId int, 
    PCursor out DATATYPE.MYCURSOR 

    AS 
    V_SQL := 'SELECT A.PROGRAM_ID, B.FILEID FROM TABLE1 A INNER JOIN TABLE2 B ON A.PROGRAM_ID = B.PROGRAM_ID WHERE 1=1 AND ';
    BEGIN
    IF ProgramId IS NULL THEN
    V_SQL := V_SQL||'B.PROGRAM_ID = '||ProgramId;
    ELSE IF FileId IS NOT NULL THEN
    V_SQL := V_SQL||'B.FILEID = '||FILEID
    END IF;
    OPEN PCURSOR FOR V_SQL;

    --EXCEPTION
    --
    END;
      

  10.   

    帮ls的改进了下,ls的如果变量都为空会报错
    CREATE OR REPLACE PROCEDURE XXXX( 
    ProgramId VARCHAR2, 
    FileId int, 
    PCursor out DATATYPE.MYCURSOR 

    AS 
    V_SQL := 'SELECT A.PROGRAM_ID, B.FILEID FROM TABLE1 A INNER JOIN TABLE2 B ON A.PROGRAM_ID = B.PROGRAM_ID WHERE 1=1';
    BEGIN
        IF ProgramId IS NULL THEN
            V_SQL := V_SQL||' AND B.PROGRAM_ID = '||ProgramId;
        ELSE IF FileId IS NOT NULL THEN
            V_SQL := V_SQL||' AND B.FILEID = '||FILEID
        END IF;
        OPEN PCURSOR FOR V_SQL;
        
    --EXCEPTION
        --
    END;
      

  11.   

        IF ProgramId IS NOT NULL THEN
            V_SQL := V_SQL||' AND B.PROGRAM_ID = '||ProgramId;
        ELSE IF FileId IS NOT NULL THEN
            V_SQL := V_SQL||' AND B.FILEID = '||FILEID
        END IF;
    不是应该这样吗?
      

  12.   

        IF ProgramId IS NOT NULL THEN
            V_SQL := V_SQL||' AND B.PROGRAM_ID = '||ProgramId;
        END IF; 
        IF FileId IS NOT NULL THEN
            V_SQL := V_SQL||' AND B.FILEID = '||FILEID
        END IF;