Курсор Ref с Немедленным выполнением

Я хочу получить результаты в ref_cursor, но не могу этого сделать.

Пожалуйста, предложите мне, как получить результаты в ref_cursor, используя немедленное выполнение

CREATE OR REPLACE PROCEDURE TEST_PROC_QT ( p_name IN VARCHAR2,
                                           p_result_set OUT sys_refcursor ) IS

  v_sql VARCHAR2(4000);

BEGIN

   v_sql := '';
   v_sql := 'SELECT * FROM USERS WHERE 1=1 ';

   IF p_name is not null THEN
     v_sql := v_sql || ' AND login_id = :v_name';
   ELSE
     v_sql := v_sql || ' AND ((1=1) or :v_name is null)';
   END IF;

   Dbms_output.put_line(v_sql);

   EXECUTE IMMEDIATE v_sql

   --OPEN p_result_set for v_sql
   --INTO p_result_set using p_name;  

END;

person Naveen Chakravarthy    schedule 23.06.2011    source источник
comment
Совершенно не связанный с этим, но лучший способ написания запроса (без немедленного выполнения): «SELECT * FROM USERS WHERE login_ID = nvl(:v_name, login_id)»   -  person Thomas Jones-Low    schedule 24.06.2011
comment
@Thomas Jones-Low: это не сработает, если у вас есть индекс в этом столбце.   -  person Robotronx    schedule 10.02.2017


Ответы (2)


Только что:

OPEN p_result_set for v_sql using p_name;  
person Tony Andrews    schedule 23.06.2011

  1. Например, вам нужно создать тип, чтобы выбранные вами данные возвращались. Представьте, что это ваша таблица пользователей user(id number, name varchar2), ваш тип должен выглядеть так:

    create type users_type as object (id number, name varchar2);
    
  2. Создайте таблицу типов, чтобы сохранить объект, созданный выше.

    create type users_table_object as table of users_type;
    
  3. создайте процедуру:

    create the procedure test(
    cv_1  OUT SYS_REFCURSOR
    ....
    )
    as
    users_table_object;
    v_query VARCHAR2(2000);  
    
    begin
    v_query := N'select users_type(id, name) from users ';
    
    execute immediate
    bulk collect into users_table_object;
    
    open cv_1 for table(users_table_object)     
    
person carlos da silva    schedule 25.07.2012