在特定情况下我无法弄清楚错误的含义,扩展坞并没有节省太多。
我在 PLSQLDeveloper 的 SQL 窗口中执行查询:
SELECT *
FROM TABLE(pkg_products.get_products(i_var => 'some argument'));
该查询返回三个对象类型的对象。该对象有一个字段 field1,它也是对象类型(包含字段 innerField1、...、innerFieldN)。同时,在PLSQLDeveloper中,内部对象的每个字段也显示在一行中。此外,其中一个内部字段是类型的集合:
create or replace type t_StringList as table of varchar2(32767 char)
也就是说,查询的结果将如下所示:
| field0 | field1.innerField1 | field1.innerField2 | field2 |
-------------------------------------------------------------------
| 3 | 'Hello,' | <Collection> | 12312 |
| 13 | 'World' | <Collection> | 3213 |
| 11 | '!' | <Collection> | 323 |
即,显示三行。我想看看集合的内容(在有集合的单元格中,请求执行后,它只是说<Collection>)。我单击单元格值旁边的三个点:
之后,我希望在新窗口中看到集合的内容(字符串列表)。但是,标题中提到的错误却出现了:
同时,在内容上,又像是普通的短句。如果您执行 PLSQL 块,您可以看到它们:
declare
c t_StringList;
begin
c := pkg_products.get_products(i_var => 'some argument')(3).field1.innerField2;
for i in 1..c.count loop
dbms_output.put_line(c(i));
end loop;
end;
在控制台中,我们将看到相当预期的值:
Ожидаемое_значение_1
Ожидаемое_значение_2
Ожидаемое_значение_3
问题:错误的性质是什么,是否可以通过某种方式解决/规避?


事实是限制是用符号语义选择的
VARCHAR2 (32767 CHAR),即最大值。多字节编码中的字符数可以是FLOOR(32767/4) = 8191.PL/SQL 文档对此进行了说明:
在将 PL/SQL 字符类型转换为其相应的 SQL 类型时会检查此限制,编译器不会考虑该类型的实体实际包含多少字符。
您可以指定最大值。长度以字节为单位,然后它将起作用(在 db<>fiddle 上):