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

TABLE of VARCHAR2(200)

我想在存储过程(本地定义,而不是为DB中的实际表)中具有此类型的变量,并用数据填充。

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

SELECT column_value currVal FROM table(pMyPassedParameter)

但是,我想要的是在PL/SQL代码本身中填充它,并使用插入语句填充。

有人知道这个语法吗?

编辑:我应该澄清:我的源数据以VARCHAR2参数传递到存储过程:分隔符(如逗号)划界字符串。我已经在划界字符串中迭代以获取每个单独的值 - 我想将每个值插入我的类型中,以便将其视为其余逻辑的表。

有帮助吗?

解决方案

“我想在PL/SQL代码本身中填写它,并使用插入语句填充”

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

declare
    l_array your_nested_table_type;
begin
    select col1
    bulk collect into l_array
    from t72;
end;
/

如果结果集返回了很多记录,则在循环中使用限制子句是一个好主意。这是因为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类型,但是如果 TOK_TBL 改为在PL/SQL软件包中声明。

其他提示

您不会提及您创建的类型是SQL类型或PL/SQL类型。它们在PL/SQL中类似地使用,因此我假设您创建了具有这样的命令的SQL类型:

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

Type created

这是一个嵌套桌。找出 如何在PL/SQL中操纵收集 例如,它在文档中:

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top