在 PL/SQL 中将游标数据提取到数组中

Posted

技术标签:

【中文标题】在 PL/SQL 中将游标数据提取到数组中【英文标题】:Fetching cursor data into array in PL/SQL 【发布时间】:2016-03-22 22:06:22 【问题描述】:

我在一个练习中遇到了一个问题:我有一个包含通常列的表,而另一列是另一个表,如下所示:

   CREATE OR REPLACE TYPE list_firstnames AS TABLE OF VARCHAR2(10); 

然后我创建下表:

   CREATE TABLE persons (last_name VARCHAR2(10), first_name list_firstnames)
   NESTED TABLE first_name STORE AS lista; 

我插入:

INSERT INTO persons VALUES('Stewart', list_firstnames('John', 'Jack'));
INSERT INTO persons VALUES('Bauer', list_firstnames('Helen', 'Audrey'));
INSERT INTO persons VALUES('Obrian', list_firstnames('Mike', 'Logan'));

我想制作一个游标来获取人员的所有姓氏和名字,然后我想将所有这些人放在一个数组中。在此之后,我想计算包含“n”字母的名字。

首先,我想知道如何将光标中的所有信息放入一个数组中。我试试这个:

DECLARE 
      CURSOR firstnames_students IS
      select last_name,COLUMN_VALUE as "FIRSTNAME" from persons p,         TABLE(p.last_name) p2;
      v_lastname VARCHAR(50);
      v_firstname VARCHAR(50);
      v_I NUMBER := 1;
      v_count NUMBER := 0;
      v_contor INTEGER := 0;
      TYPE MyTab IS TABLE OF persons%ROWTYPE INDEX BY VARCHAR2(20);
      std MyTab;
 BEGIN
     OPEN firstnames_students;
     LOOP
        FETCH firstnames_students INTO v_lastname, v_firstname;
        EXIT WHEN firstnames_students%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(v_lastname || ' ' || v_firstname);
     END LOOP;
        --select * INTO std FROM firstnames_students; 
     CLOSE firstnames_students;
  END; 

【问题讨论】:

【参考方案1】:
SET SERVEROUTPUT ON;
DECLARE 
  CURSOR students IS
    SELECT * FROM persons;

  v_row   PERSONS%ROWTYPE;
  v_names SYS.ODCIVARCHAR2LIST := SYS.ODCIVARCHAR2LIST();
  v_count INT := 0;
 BEGIN
  OPEN students;
  LOOP
    FETCH students INTO v_row;
    EXIT WHEN students%NOTFOUND;
    v_names.EXTEND;
    v_names(v_names.COUNT) := v_row.last_name;
    FOR i IN 1 .. v_row.first_name.COUNT LOOP
      v_names.EXTEND;
      v_names(v_names.COUNT) := v_row.first_name(i);
    END LOOP;
  END LOOP;
  CLOSE students;

  FOR i IN 1 .. v_names.COUNT LOOP
    IF INSTR( v_names(i), 'n' ) > 0 THEN
      v_count := v_count + 1;
      DBMS_OUTPUT.PUT_LINE( v_names(i) );
    END IF;
  END LOOP;
  DBMS_OUTPUT.PUT_LINE( v_count );
END;

输出

John
Helen
Obrian
Logan
4

【讨论】:

是的,但我怎么能只计算名字呢?在此您计算包含“n”字母的姓氏和名字。输出应为:输出:单词数为:3 --(John, Hellen, Logan) 这些名字中包含“n”的全名是:Stewart John Bauer Hellen Obrian Logan。 您可以通过不将姓氏放入数组来解决它。(或者您甚至不需要数组,只需在游标循环中进行计数。)

以上是关于在 PL/SQL 中将游标数据提取到数组中的主要内容,如果未能解决你的问题,请参考以下文章

带有游标的 pl/sql 可变数组

PL/SQL 游标:将计数提取为整数,语法错误?

Pl/Sql 在for循环中打开游标

PL/SQL - 如何在 IN 子句中使用数组

将数组发送到 PL/SQL 过程

orcale 之 PL/SQL的游标