Как вызвать функцию Oracle, которая имеет SYS_REFCURSOR в качестве параметра OUT

create or replace
FUNCTION test_fun (
p_ref_cur               OUT SYS_REFCURSOR,
p_a_code            IN  NUMBER                                  DEFAULT 0,
p_category          IN  package.category%TYPE           DEFAULT NULL,
p_name              IN  package.name%TYPE           DEFAULT NULL,
p_display_name      IN  package.display_name%TYPE   DEFAULT NULL,
p_rowid             IN  package."rowid"%TYPE                DEFAULT NULL,
p_flg               IN  package.flg%TYPE                DEFAULT '1',
p_mod_dat           IN  package.mod_dat%TYPE            DEFAULT SYSTIMESTAMP,
p_mod_usr           IN  package.mod_usr%TYPE            DEFAULT NULL
)
RETURN NUMBER
AS

Как вызвать эту функцию в оракуле, который имеет SYS_REFCURSOR в качестве параметра OUT?

Обновление: **test_fun** будет вызываться из другой функции, скажем, caller(), где полная функция, которая должна быть выполнена, будет взята из базы данных и выполнена с использованием немедленной команды execute. .

SELECT command into cmd from data_table where id=p_id;
execute immediate (cmd);

Значение cmd будет похоже на

test_fun(v_cv1,0, 'pp', 'np123', 'np', NULL, 1, NULL, 'testuser');

ПРИМЕЧАНИЕ. У нас есть контроль над выполнением функции caller() и cmd, но нет контроля над test_fun()

Буду признателен за любую оказанную помощь.


person james007    schedule 27.11.2012    source источник
comment
Есть ли какая-то конкретная причина, по которой вы не объявляете курсор как IN OUT?   -  person Frank Schmitt    schedule 27.11.2012
comment
Вот так вот. У меня нет никакого контроля над этим.   -  person james007    schedule 27.11.2012
comment
Какой клиент SQL вы используете? Обработка курсоров ref очень зависит от клиента.   -  person a_horse_with_no_name    schedule 27.11.2012


Ответы (2)


Просто объявите переменную типа SYS_REFCURSOR в вызывающем блоке и вызовите свою функцию, например. из SQL/Плюс:

 set autoprint on;
 var cur refcursor;

 declare
      FUNCTION test_fun (
        p_ref_cur               OUT SYS_REFCURSOR)
      RETURN NUMBER is
      begin
        open p_ref_cur for select * from dual;
        return 1;
      end;

 begin
     dbms_output.put_line(test_fun(:cur));
 end;
 /
person Frank Schmitt    schedule 27.11.2012

Эта процедура сделала волшебство

  PROCEDURE executecmd(cmd_in IN VARCHAR2)
          AS
          v_cv1 SYS_REFCURSOR;
          BEGIN
                 dbms_output.put_line('Executing cmd: '|| cmd);

                 execute immediate 'declare
                    result number;
                   BEGIN
                    result:='||cmd_in||';'||
                   'END;'
                   USING v_cv1;
          END;
person james007    schedule 28.11.2012