2013-04-25 81 views
0

我必须生成PL/SQL块,其中输入一个整数,其中n(1≤n≤100),并显示男性和女性的最流行名称。如果输入的数字超出该范围,将显示无效输入。我创建了一个名为流行名称的表格,其中有100个最受欢迎的男性和女性名字。我正在努力与我的FOR循环,并得到它与用户输入工作。我的代码如下:获取PL/SQL游标for循环以使用输入变量?

ACCEPT p_1 prompt 'please enter an integer between 1 and 100' 

DECLARE 
    CURSOR name_cur IS 
      SELECT rank, male_given_name, female_given_name 
      FROM   popular_names 
      ORDER BY rank; 

     v_nrank   popular_names.rank%TYPE := &p_1; 
     v_nmale   popular_names.male_given_name%TYPE; 
     v_nfemale  popular_names.female_given_name%TYPE; 



BEGIN 
     OPEN name_cur; 
     FETCH name_cur INTO v_nrank, v_nmale, v_nfemale; 

     IF name_cur%FOUND THEN 
     DBMS_OUTPUT.PUT_LINE('Rank  Male Given Name  Female Given Name'); 
     DBMS_OUTPUT.PUT_LINE('----------------------------------------------'); 


     FOR i IN 1..v_nrank LOOP 
      DBMS_OUTPUT.PUT_LINE((RPAD(v_nrank, 18) || ' ' || 
       (RPAD(v_nmale, 18) || ' ' || v_nfemale))); 
       FETCH name_cur INTO v_nrank, v_nmale, v_nfemale; 
       EXIT WHEN name_cur%NOTFOUND; 
     END LOOP; 


     ELSE 
      DBMS_OUTPUT.PUT_LINE('Invalid number!'); 
     END IF; 

     CLOSE name_cur; 
END; 
+0

因此,如果用户输入一个10,则会显示男性和女性的名称1-10。 – DaBulls33 2013-04-25 18:20:30

回答

1

不需要光标。或者在你的光标中使用类似的查询。您可以使用Rownum伪列代替Row_Number()函数:

SELECT * FROM 
(
SELECT deptno 
     , empno 
     , ename 
     , Row_Number() OVER (ORDER BY empno) AS row_seq -- can order/partition by any field 
     -- , Rownum AS row_seq 
    FROM scott.emp 
) 
WHERE row_seq BETWEEN 1 AND 10 -- any integer as in your example -- 
/


DECLARE 
    CURSOR e_cur 
    IS 
    SELECT * FROM 
    (
    SELECT deptno 
    , empno 
    , ename 
    , Row_Number() OVER (ORDER BY empno) AS row_seq --'AS' is for clarity-not required 
    --, Rownum AS row_seq 
    FROM scott.emp 
    ) 
    WHERE row_seq BETWEEN 1 AND 10 -- any integer, can use variable like &num -- 
    ORDER BY row_seq; 

    v_deptno scott.dept.deptno%TYPE; 
    v_emp_no scott.emp.empno%TYPE; 
    v_name scott.emp.ename%TYPE; 
    v_rank NUMBER; 
BEGIN 
    OPEN e_cur; 
    LOOP 
    FETCH e_cur INTO v_deptno, v_emp_no, v_name, v_rank; 
    EXIT WHEN e_cur%NOTFOUND; 
     dbms_output.put_line(v_rank||chr(9)||v_deptno||chr(9)||v_emp_no||chr(9)||v_name); 
    END LOOP; 
CLOSE e_cur; 
END; 
/
+0

我需要使用光标:/ – DaBulls33 2013-04-25 18:32:40

+0

请参阅更新。 – Art 2013-04-25 18:47:53