简体   繁体   中英

A large number of cursors , one pipelined function

I have code like this:

CREATE OR REPLACE TYPE person_typ AS OBJECT (ssn NUMBER(9), 
name VARCHAR2(30), address VARCHAR2(100));

CREATE OR REPLACE TYPE t_tab AS TABLE OF person_typ;

CREATE OR REPLACE FUNCTION my_pipe(p_in VARCHAR2) RETURN t_tab PIPELINED IS
     rec person_typ;

     CURSOR cur1 IS
          SELECT ssn, name, address FROM /* ... complex query */

     CURSOR cur2 IS
          SELECT ssn, name, address FROM /* ... complex query */

     CURSOR cur3 IS
          SELECT ssn, name, address FROM /* ... complex query */

     CURSOR cur4 IS
          SELECT ssn, name, address FROM /* ... complex query */

     CURSOR cur5 IS
          SELECT ssn, name, address FROM /* ... complex query */
BEGIN
    FOR cur IN cur1 LOOP
        rec := r_inc(cur.ssn, cur.name, cur.address);
        PIPE ROW(rec);
    END LOOP; 

    FOR cur IN cur2 LOOP
        rec := r_inc(cur.ssn, cur.name, cur.address);
        PIPE ROW(rec);
    END LOOP; 

    FOR cur IN cur3 LOOP
        rec := r_inc(cur.ssn, cur.name, cur.address);
        PIPE ROW(rec);
    END LOOP; 

    FOR cur IN cur4 LOOP
        rec := r_inc(cur.ssn, cur.name, cur.address);
        PIPE ROW(rec);
    END LOOP; 

    FOR cur IN cur5 LOOP
        rec := r_inc(cur.ssn, cur.name, cur.address);
        PIPE ROW(rec);
    END LOOP; 
END;

My problem is that my pipelined function is oogly - I have to have five cursors (this is independent of me), but I dont want to have five for loops. I would prefer have only one loop and one PIPE ROW(rec) statement ... is any way to concatenate result into one collection and then iter them?

Hmmm, how about using union all and only one cursor?

 CURSOR cur1 IS
      SELECT ssn, name, address FROM /* ... complex query */
      UNION ALL
      SELECT ssn, name, address FROM /* ... complex query */
      UNION ALL
      SELECT ssn, name, address FROM /* ... complex query */
      UNION ALL
      SELECT ssn, name, address FROM /* ... complex query */
      UNION ALL
      SELECT ssn, name, address FROM /* ... complex query */

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM