在 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 中将游标数据提取到数组中的主要内容,如果未能解决你的问题,请参考以下文章