SYS_REFCURSOR как параметр OUT

У меня есть таблица, содержащая (username-primarykey,password,age,gender);

нужно создать процедуру типа procedure(username in varchar,s_cursor out sys_refcursor);

процедура должна принять username и вернуть строку (where username=in parameter) в качестве курсора.

Правило: Курсор должен и должен иметь уникальную последовательность no вместе с записью, которую он дает. пример:(unique no(sequence),username ,password,age,gender)

Каждый раз процедура должна возвращать одну запись вместе с uniqueno(sequence)


person shiva tatikonda    schedule 22.11.2012    source источник
comment
Как далеко вы зашли?   -  person Matthew Strawbridge    schedule 22.11.2012
comment
@MatthewStrawbridge я могу читать, но не могу сохранить в курсоре уникальный (порядковый) номер.   -  person shiva tatikonda    schedule 23.11.2012
comment
Вы хотите, чтобы разные числа каждый раз, когда вы читаете запись? Что это за правило?   -  person APC    schedule 23.11.2012
comment
каждый раз, когда запись, которая извлекается из таблицы, должна быть сохранена в курсоре с уникальным номером, т.е. порядковым номером.   -  person shiva tatikonda    schedule 23.11.2012


Ответы (1)


Вы можете попробовать что-то вроде этого, если вам нужна дополнительная информация, вы должны предоставить более подробную информацию.

Создайте последовательность для уникального номера.

CREATE SEQUENCE emp_seq
  MINVALUE 1
  MAXVALUE 999999999999999999999999999
  START WITH 1
  INCREMENT BY 1
  CACHE 20;

Создайте процедуру, которая возвращает sys_refcursor в качестве параметра OUT и emp_id в качестве параметра IN.

    CREATE OR REPLACE PROCEDURE get_employee_details (user_id 
                                                      YOURTABLE.USERNAME%TYPE,
                                               emp_cursor   OUT SYS_REFCURSOR)
    AS
    BEGIN
       OPEN emp_cursor FOR
          SELECT emp_seq.NEXTVAL,
                 USERNAME,
                 PASSWORD,
                 AGE,
                 GENDER
            FROM YOURTABLE
           WHERE USERNAME = user_id;
   EXCEPTION
   WHEN NO_DATA_FOUND
   THEN
      DBMS_OUTPUT.put_line ('<your message>' || SQLERRM);
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.put_line ('<your message>' || SQLERRM);
    END get_employee_details;
    /

И выполнить процедуру из sqlplus

variable usercur refcursor;

DECLARE

user_id  YOURTABLE.USERNAME%TYPE;

BEGIN
user_id := 'JON';
get_employees(user_id,:usercur);

END;
/

print usercur

Обновление 1

Я предполагаю, что вы вызываете свою процедуру из sqlplus или из Toad, тогда вы можете выполнить свою процедуру как

variable dcursor refcursor;

DECLARE


p_arrival  DEFAULT_DETAILS.ARRIVALCOUNTRY%TYPE;

BEGIN
p_arrival := '123';
PROCEDURE_SAMPLE(p_arrival,:dcursor);

END;
/

print dcursor

Обновление 2

Чтобы выполнить процедуру из SQL Developer, выполните следующие действия.

var usercur refcursor
exec procedure_sample('AU',:usercur)
print usercur
person Jacob    schedule 22.11.2012