使用動態SQL語句就可以解決了...............
   sqltxt:= 'select intareaid,strareacode,strareaname into is_a,is_b,is_c where ';
   sqltxt:= sqltxt||'zdname'||'condition'||'''qing''' ';
   execute immediate sqltxt ;
..............

解决方案 »

  1.   

    不好意思 修改一下
       sqltxt:= 'select intareaid,strareacode,strareaname into is_a,is_b,is_c  ';
       sqltxt:= sqltxt||' where '||zdname||condition||'''qing''' ;
       execute immediate sqltxt ;
      

  2.   

    谢谢 baojianjun(包子) ,但你这样返回的结果只是一条记录,但要实现返回一个结果集怎么办呢?
    我现在做的是定义一个包,用游标的形式返回。
      

  3.   

    使用一個臨時表吧
    create or replace table xxxx_temp(a [type],b [type], c [type]);sqltxt:= 'insert into xxxx_temp (a,b,c) select intareaid,strareacode,strareaname   ';
       sqltxt:= sqltxt||' where '||zdname||condition||'''qing''' ;
       execute immediate sqltxt ;
      

  4.   

    --example
    --我的一個 存儲過程中的一段代碼
    CREATE OR REPLACE PROCEDURE CM_PRO_EACH_LAYER
          (
           VAR_MON           IN VARCHAR2
          )
    AS 
           .............begin
    ..........................
           EXECUTE IMMEDIATE 'SET TRANSACTION USE ROLLBACK SEGMENT RB2';       OPEN CUR_LAYER;
           LOOP
                FETCH CUR_LAYER INTO IS_LAYER;
                EXIT WHEN CUR_LAYER%NOTFOUND;            IS_DETAIL := 'DETAIL_'||IS_LAYER||'L';            ERROR_:='非基板、委外、成型的原物料,制造費用,直接人工計算出錯!';            SQLTXT := 'UPDATE CM_EACH_LAYER_DETAIL A                            ';
                SQLTXT := SQLTXT||' SET    A.'||IS_DETAIL||'= (                     ';
                SQLTXT := SQLTXT||' SELECT SUM(B.TOTAL_USE_AMOUNT)                  ';
                SQLTXT := SQLTXT||' FROM   CM_PART_ST_MATERIAL_COST_SAVED B         ';
                SQLTXT := SQLTXT||' WHERE  B.MON_DATE= '''||VAR_MON||'''            ';
                SQLTXT := SQLTXT||' AND    B.ST_ID NOT IN (''RT'')                  ';
                SQLTXT := SQLTXT||' AND    B.COST_CODE NOT IN (''JB00'',''WGCOST'') ';
                SQLTXT1 := ' AND    SUBSTR(B.PART_ID,4,1)='''||IS_LAYER||'''        ';
                SQLTXT1 := SQLTXT1||' AND    B.ST_ID=A.ST_ID                        '; 
                SQLTXT1 := SQLTXT1||' AND    B.TYPE=A.COST_TYPE  )                  ';
                SQLTXT1 := SQLTXT1||' WHERE  A.MON_DATE='''||VAR_MON||'''           ';
                SQLTXT1 := SQLTXT1||' AND    A.ST_ID NOT IN (''JB_CT'',''WG_CT'',''RT'')  ';
                SQLTXT1 := SQLTXT1||' AND    A.COST_TYPE IN (''原物料'',''制造費用'',''直接人工'') ';            EXECUTE IMMEDIATE SQLTXT||SQLTXT1;            ERROR_:='沖型的原物料,制造費用,直接人工計算出錯!';            SQLTXT := 'UPDATE CM_EACH_LAYER_DETAIL A                            ';
                SQLTXT := SQLTXT||' SET    A.'||IS_DETAIL||'= (                     ';
                SQLTXT := SQLTXT||' SELECT SUM(B.TOTAL_USE_AMOUNT)                  ';
                SQLTXT := SQLTXT||' FROM   CM_PART_ST_MATERIAL_COST_SAVED B         ';
                SQLTXT := SQLTXT||' WHERE  B.MON_DATE = '''||VAR_MON||'''           ';
                SQLTXT := SQLTXT||' AND    B.ST_ID = ''RT''                         ';  
                SQLTXT := SQLTXT||' AND    B.COST_DES LIKE ''%沖型%''               ';
                SQLTXT1 := ' AND    SUBSTR(B.PART_ID,4,1)='''||IS_LAYER||'''        ';
                SQLTXT1 := SQLTXT1||' AND    B.TYPE=A.COST_TYPE  )                  ';
                SQLTXT1 := SQLTXT1||' WHERE  A.MON_DATE='''||VAR_MON||'''           ';
                SQLTXT1 := SQLTXT1||' AND    A.COST_CENTER = ''A34''                ';
                SQLTXT1 := SQLTXT1||' AND    A.COST_TYPE IN (''原物料'',''制造費用'',''直接人工'') ';            EXECUTE IMMEDIATE SQLTXT||SQLTXT1;
                ERROR_:='計算表面處理和成型方式綜合數據出錯';            OPEN CUR_SUR;
                LOOP
                     FETCH CUR_SUR INTO IS_SUR;
                     EXIT WHEN CUR_SUR%NOTFOUND;                 --求得去處本身所剩下的表面處理站別
                     IS_SURFACE := SUBSTR(IS_SUR,1,INSTR(IS_SUR,'+')-1);
                     ALL_SURFACE := '''HA'''||','||'''EG'''||','||'''GP'''||','||'''SF''' ;
                     IS_POS := INSTR(ALL_SURFACE,IS_SURFACE);
                     IS_LEN := LENGTH(ALL_SURFACE);
                     IS_ST :=  SUBSTR(ALL_SURFACE,1,IS_POS-1)||SUBSTR(ALL_SURFACE,IS_POS+5,IS_LEN);
                     IS_ST :=  SUBSTR(IS_ST,1,IS_LEN-5);                 --記錄相反的成型方式
                     SELECT DECODE(SUBSTR(IS_SUR,INSTR(IS_SUR,'+')+1,LENGTH(IS_SUR)),'CUT','成型沖型','成型切型')
                     INTO   IS_FLAG FROM DUAL ;                 SQLTXT := 'UPDATE CM_EACH_LAYER_DETAIL A SET A.'||IS_DETAIL||' = (  ';
                     SQLTXT := SQLTXT||' SELECT SUM(B.'||IS_DETAIL||')                   ';
                     SQLTXT := SQLTXT||' FROM   CM_EACH_LAYER_DETAIL B                   ';
                     SQLTXT := SQLTXT||' WHERE  B.MON_DATE = '''||VAR_MON||'''           ';
                     SQLTXT := SQLTXT||' AND    B.COST_TYPE = ''單位成本''               ';
                     SQLTXT := SQLTXT||' AND    B.DES <> '''||IS_FLAG||'''               ';
                     SQLTXT := SQLTXT||' AND    INSTR(B.COST_CENTER,''+'') = 0           ';
                     SQLTXT := SQLTXT||' AND    B.ST_ID NOT IN ('||IS_ST||')          )  ';
                     SQLTXT := SQLTXT||' WHERE  A.MON_DATE = '''||VAR_MON||'''           ';
                     SQLTXT := SQLTXT||' AND    A.COST_CENTER = '''||IS_SUR||'''         ';                 EXECUTE IMMEDIATE SQLTXT;            END LOOP;
                CLOSE CUR_SUR;       END LOOP;
           CLOSE CUR_LAYER;
    ..............................................
      

  5.   

    在存储过程中加入临时表,生成动态的SQL语句,把结果插入到临时表里,再用游标取回结果是可以,但复杂一点的SQL组就麻烦了,在SQL里加几个自己写的函数,那就更难处理动态SQL语句了,不知哪一位兄台有更好一点的处理方法?
    我现在的情况是这样的
    在一张报表里,按一定的条件查询出结果,我又要在结果里查询,其中的查询条件是这样的
    被查的字段名下拉框里选,操作符也是从下拉框里选,(>,<,=,<>,like),选定二项后,就在文本框里写结果,如 (日期=2005-01-01),日期和=分别是从二个下拉框里选中的,其中日期是报表的一个项.有哪一位兄台有好的方法处理我的第二次查询,申明一点,我第一次查询也是写存储过程的形式实现的,而且存储过程中调用了八个自己写的函数,所以说报表比较复杂!