SYS_REFCURSOR为OUT参数

时间:2012-11-22 17:58:29

标签: oracle procedure sys-refcursor

我的表格包含(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(序列)

1 个答案:

答案 0 :(得分:4)

如果您需要更多信息,可以尝试这样的事情。

为唯一编号

创建序列
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