如何遍历未知类型的sys_refcursor?

时间:2014-12-01 12:17:46

标签: sql oracle plsql

让我们定义一个函数

create or replace function GET_SOME_CURSOR(X number) return sys_refcursor is
  R sys_refcursor;
begin
  open R for
    select * from MY_TABLE T where T.RATING = X;
  return R;
end;

假设我们不知道MY_TABLE列的名称(除了RATING之外)。 请告诉我如何解决以下任务。也许它看起来毫无意义,但我希望你的解决方案 将向我展示我需要了解的PL / SQL的一些方面。

编写一个循环中的函数(对于x = 1到10)从GET_SOME_CURSOR(x)获取另一个refcursor 如果在refcursor结果集中不存在名为TITLE的列,则返回NULL, 否则查找结果集中的所有行,其中包含子字符串' ABC'在TITLE列中 放入一个数组(或任何你想要的)并返回这个数组。

1 个答案:

答案 0 :(得分:2)

这个应该提供所需的信息

DECLARE
    r SYS_REFCURSOR;

    cur INTEGER;
    col_tab DBMS_SQL.DESC_TAB;
    col_cnt INTEGER;

BEGIN
    OPEN r FOR 
    select * from MY_TABLE T where T.RATING = X;

    cur := DBMS_SQL.TO_CURSOR_NUMBER(rc);
    DBMS_SQL.DESCRIBE_COLUMNS(cur, col_cnt, col_tab);
    FOR i IN 1..col_cnt LOOP
        DBMS_OUTPUT.PUT_LINE('Column '||i||': '||col_tab(i).col_name 
            ||' Data type is: '||col_tab(i).col_type );
    END LOOP;
    CLOSE r;
END;

col_type号码转换为您通过此查询获得的可读数据类型字符串:

SELECT text
FROM all_source
WHERE owner = 'SYS' 
    AND NAME = 'DBMS_TYPES' 
    AND TYPE = 'PACKAGE' 
    AND REGEXP_LIKE(text, 'TYPECODE');