如何在Oracle PL/SQL中填充我自己创建的数据类型的变量?

如何在Oracle PL/SQL中填充我自己创建的数据类型的变量?,oracle,stored-procedures,plsql,tokenize,user-defined-types,Oracle,Stored Procedures,Plsql,Tokenize,User Defined Types,在Oracle中,我创建了一种数据类型: TABLE of VARCHAR2(200) 我希望在存储过程中有一个这种类型的变量(在本地定义,而不是作为数据库中的实际表),并用数据填充它 一些在线示例显示了如果我的类型被填充并作为参数传递给存储过程,我将如何使用它: SELECT column_value currVal FROM table(pMyPassedParameter) 然而,我想要的是在PL/SQL代码本身期间用INSERT语句填充它 有人知道这个的语法吗 编辑:我应该澄清一下:

在Oracle中,我创建了一种数据类型:

TABLE of VARCHAR2(200)
我希望在存储过程中有一个这种类型的变量(在本地定义,而不是作为数据库中的实际表),并用数据填充它

一些在线示例显示了如果我的类型被填充并作为参数传递给存储过程,我将如何使用它:

SELECT column_value currVal FROM table(pMyPassedParameter)
然而,我想要的是在PL/SQL代码本身期间用INSERT语句填充它

有人知道这个的语法吗


编辑:我应该澄清一下:我的源数据是作为传递给存储过程的VARCHAR2参数输入的:分隔符(如逗号)分隔字符串。我已经在遍历分隔字符串以获取每个单独的值-我想将每个值插入到我的类型中,这样我就可以将它作为一个表来处理其余的逻辑。

您没有提到您创建的类型是SQL类型还是PL/SQL类型。它们在Pl/SQL中的用法类似,因此我假设您使用如下命令创建了一个SQL类型:

SQL> CREATE TYPE tab_varchar IS TABLE of VARCHAR2(200);
  2  /

Type created
这是一个嵌套表。请在文档中查找,例如:

SQL> DECLARE
  2     lt tab_varchar;
  3  BEGIN
  4     /* initialization */
  5     lt := tab_varchar('a', 'b', 'c');
  6     /* adding elements */
  7     lt.extend(1);
  8     lt(4) := 'd';
  9     FOR i IN lt.FIRST .. lt.LAST LOOP
 10        dbms_output.put_line('lt(' || i || ')=' || lt(i));
 11     END LOOP;
 12  END;
 13  /

lt(1)=a
lt(2)=b
lt(3)=c
lt(4)=d
“我想要的是在PL/SQL期间填充它 代码本身,使用INSERT语句“

这就像填充任何其他PL/SQL变量一样:我们必须在中使用。仅因为我们要填充多行,所以需要使用批量收集语法

declare
    l_array your_nested_table_type;
begin
    select col1
    bulk collect into l_array
    from t72;
end;
/
如果结果集返回大量记录,最好在循环中使用LIMIT子句。这是因为PL/SQL集合——就像其他所有PL/SQL变量一样——保存在会话内存中。所以我们不希望阵列变得太大,否则它可能会破坏PGA

编辑

“我对问题进行了编辑以澄清 特别是我想要的”

标记字符串是一个完全不同的问题。我以前在两个SO线程中发布过解决方案。如果您使用的是9i或更早版本,请使用。否则使用(实际上这会将字符串拆分为数字标记,但转换为字符非常容易)

编辑2

“我只想能够使用 键入“内部”(在存储的 过程)通过向其添加值。是 这是我可以用第一个做的 链接?”

当然。为什么不呢

SQL> declare
  2      local_array tok_tbl;
  3  begin
  4      local_array := parser.my_parse('Keith Pellig,Peter Wakeman,Ted Bentley,Eleanor Stevens');
  5      local_array.extend();
  6      local_array(5) := 'Reese Verrick';
  7      for i in local_array.first()..local_array.last()
  8      loop
  9          dbms_output.put_line(local_array(i));
 10      end loop;
 11  end;
 12  /
Keith Pellig
Peter Wakeman
Ted Bentley
Eleanor Stevens
Reese Verrick

PL/SQL procedure successfully completed.

SQL>

在这里,我重新使用了我的SQL类型,但是如果在PL/SQL包中声明
TOK#TBL
,它也会工作得很好。

APC,谢谢,我编辑了这个问题来明确我想要什么。APC,标记化解决方案对我来说是有问题的,因为所有东西都是从C#调用的,我没有使用ODP。(几天前我问了另一个问题:)对于这个场景,我只想通过向类型中添加值来使用“内部”(在存储过程中)类型。这是我可以做的第一个链接吗?感谢第二次编辑,现在没有时间转换代码,但稍后会尝试。