如何在Oracle PL/SQL中填充我自己创建的数据类型的变量?
-
04-10-2019 - |
题
在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