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比较游标可以得到记录,但不知对列怎么处理?
新手,多谢!
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比较游标可以得到记录,但不知对列怎么处理?
新手,多谢!
--声明变量
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;
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>
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;