Search code examples
oracle-databaseplsqlnested-table

OCI doc says Cursor and Nested table have the same bind type SQLT_RSET but they don't


http://docs.oracle.com/cd/B14117_01/appdev.101/b10779/oci05bnd.htm#422771

section PL/SQL REF CURSORs and Nested Tables in OCI

says SQLT_RSET is passed for the dty parameter.

If I use SQLT_RSET for the return value of a function that returns a table and pass a statement handle's address for the OCI parameter data pointer, I expected that the statement handle will be instantiated as a result of executing the function on which I can further perform fetch, similar to a cursor. But it throws exception PLS-00382: expression is of wrong type ORA-06550: line 2, column 3. Is the above documentation wrong?

From the OCI header file I see that for varray and nested table it mentions to use SQLT_NCO. I could find no example in the OCI documentation on how to pass or receive as return value a nested value when using SQLT_NCO.

Please help before I shoot myself.


Solution

  • If you examine examples closer, you can see that nested table used in conjunction with cursor() function. E.g.

    static const text *nst_tab = (text *)
           "SELECT last_name, CURSOR(SELECT department_name, location_id \
            FROM  departments)  FROM employees WHERE last_name = 'FORD'";
    

    where key part for your question is

    CURSOR(SELECT department_name, location_id FROM  departments)
    

    where departments is a nested table.
    So if you need to use nested table as a cursor you need to select from it and convert to cursor type.

    In case of PL/SQL collection variable, if her record's type defined on database schema level you can cast it to a table and afterward select from it to get a cursor:

    declare
      vMyTable TMyTableType;
      vCursor  sys_refcursor;
    begin
      -- populate table with values ...
    
      open vCursor for (
        select * from table(vMyTable);
      );
    
      :OutCursorParameter := vCursor;
    end;