RT,类似这样ID   C1   C2   C3   C4
A   null  1    1   null
B    2    2    2    2
C    3    3    3    3通过查找ID为A的记录得到信息:C1和C4为空,C2和C3不为空,且得到记录A中C2和C3的值
然后查找剩余记录B和C的C2、C3列的值,再和A中的C2、C3比较游标可以得到记录,但不知对列怎么处理?
新手,多谢!

解决方案 »

  1.   

    declare
        --声明变量
        v_c2 c2%表.type;
        v_c3 c3%表.type;
    begin
    --取ID为A的c2,c3值
    select c2,c3 into v_c2,v_c3  from 表 where id='A';
    --通过游标循环取除ID为A的其它值
    for c in (select * from 表 where id != 'A' ) loop
        --比较
        if c.c2 > v_c2 and c.c3>v_c3 then
             --符合条件的操作
        end if;
    end loop;
       
    end;
      

  2.   

    --取非空列的数据集
    SQL> CREATE OR REPLACE PROCEDURE p_test(i_tablename VARCHAR2,
      2                                     o           OUT SYS_REFCURSOR) AUTHID CURRENT_USER IS
      3    v_cnt        PLS_INTEGER;
      4    v_notnullcol VARCHAR2(2000);
      5    v_sql        VARCHAR2(200);
      6  BEGIN
      7    FOR c IN (SELECT t.COLUMN_NAME
      8                FROM user_tab_columns t
      9               WHERE t.table_name = upper(i_tablename)) LOOP
     10      v_sql := 'select count(*) from ' || i_tablename || ' where ' ||
     11               c.column_name || ' is null';
     12      EXECUTE IMMEDIATE v_sql
     13        INTO v_cnt;
     14      IF v_cnt = 0 THEN
     15        v_notnullcol := v_notnullcol || ',' || c.column_name;
     16      END IF;
     17    END LOOP;
     18    v_notnullcol := ltrim(v_notnullcol, ',');
     19    OPEN o FOR 'select ' || v_notnullcol || ' from ' || i_tablename;
     20  END;
     21  /过程已创建。SQL> select * from b;SERIALNO             CONTENT
    -------------------- ------------------------------
    11                   22
    中国SQL> var o refcursor;
    SQL> exec p_test('b',:o);PL/SQL 过程已成功完成。SQL> print o;SERIALNO
    --------------------
    11
    中国SQL> 
      

  3.   

    多谢,我按照我的需求实现了,SHJ_SP_WD表中STANDARD记录着各column的标准值,其中有些是null。我要做的就是取出不是null的。CREATE OR REPLACE PROCEDURE stnd(o OUT SYS_REFCURSOR) AUTHID CURRENT_USER IS
        v_cnt PLS_INTEGER;
        v_notnullcol VARCHAR2(2000);
        v_sql VARCHAR2(200);
      BEGIN
        FOR c IN (SELECT t.column_name
                    FROM user_tab_columns t
                   WHERE t.table_name = 'SHJ_SP_WD')
    LOOP
    IF c.column_name='ID' OR c.column_name='DAT' OR c.column_name='LOC_ID' OR c.column_name='TYPE' THEN
    GOTO nextloop;
    END IF;
    v_sql := 'select ' || c.column_name || ' from SHJ_SP_WD where ID=''STANDARD''';
    EXECUTE IMMEDIATE v_sql
    INTO v_cnt;
    IF v_cnt IS NOT NULL THEN
    v_notnullcol := v_notnullcol || ',' || c.column_name;
    END IF;
    <<nextloop>>
    null;
        END LOOP;
        v_notnullcol := ltrim(v_notnullcol, ',');
        OPEN o FOR 'select ' || v_notnullcol || ' from SHJ_SP_WD where ID=''STANDARD''';
      END;