如何在函数中使用 Pl/SQL 集合

Posted

技术标签:

【中文标题】如何在函数中使用 Pl/SQL 集合【英文标题】:How to use Pl/SQL Collection within a Function 【发布时间】:2015-01-23 08:50:39 【问题描述】:

对于作业,建议使用集合。简单地说,我需要将一个字符串分成几个子字符串,将这些字符串的顺序颠倒并将它们放在一起。

省略了实际代码,因为它在声明部分崩溃。 不断收到错误:stringlist1 不是过程或未定义 因此,出于某种原因,我尝试分配给 stringlist1 的类型没有这样做。 你们知道为什么会这样吗?如果这无法解决,除了为集合中的每一行创建一个变量之外,还有什么巧妙的解决方法?

我尝试过的事情:

* 事先在“创建类型”语句中创建我自己的类型 * 在函数之前的匿名块中创建类型 * 在函数的声明部分中创建一个 varchar 集合 * 下面使用的 dbms 包 * 重命名它 * 尝试启动类似 stringlist1 dbms_utility.name_array 的类型 := dbms_utility.name_array();
Create or replace FUNCTION TEST (p_number varchar2)
RETURN varchar2
IS
stringlist1 dbms_utility.name_array;
stringlist2 dbms_utility.name_array;
BEGIN
stringlist1('test');
stringlist2('test');
dbms.output.put_line(stringlist1(1));
return stringlist1(1);
END;

【问题讨论】:

【参考方案1】:

字符串可以像stringlist1(1) := 'test';一样添加到数组中

所以你的代码会在更正后编译

CREATE OR REPLACE FUNCTION TEST (p_number VARCHAR2)
   RETURN VARCHAR2
IS
   stringlist1   DBMS_UTILITY.name_array;
   stringlist2   DBMS_UTILITY.name_array;
BEGIN
   stringlist1(1) := 'test';
   stringlist2(1) :=  'test';
   dbms_output.put_line (stringlist1 (1));
   RETURN stringlist1 (1);
END;

PS:包名不是dmbs.output,正确的是dbms_output

【讨论】:

我已经预料到这是我的一些愚蠢的疏忽,非常感谢,它奏效了!

以上是关于如何在函数中使用 Pl/SQL 集合的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle 中调试 PL/SQL 集合的值?

获取 PL/SQL 集合中特定元素的键或索引?

如何在 Oracle PL/SQL 函数中使用变量

如何在 pl/sql 函数中的变量中存储多行?

使用 BULK 集合将 SQL 代码重写为 PL/SQL

如何使用存储过程创建随机函数? PL/SQL