Oracle CREATE TYPE 和 PL/SQL
Posted
技术标签:
【中文标题】Oracle CREATE TYPE 和 PL/SQL【英文标题】:Oracle CREATE TYPE and PL/SQL 【发布时间】:2011-11-07 20:58:46 【问题描述】:我们有一个这样声明的 Oracle 类型:
创建或替换类型 its_accountarray;
没有基本类型。然后在过程和包中使用此类型(以及在 Java 存储过程中作为数组描述符)。在过程/包中,它使用 extend 函数添加到数组中。
<declare section>
v_account latax.ITS_ACCOUNTARRAY := new ITS_accountArray();
...
BEGIN
...
...
v_account.extend(1);
在 Java 中,它被用作: oracle.sql.ARRAY ls_accountARRAY, ls_periodARRAY;
oracle.sql.ArrayDescriptor ad = ArrayDescriptor.createDescriptor(**"ITS_ACCOUNTARRAY"**, oconn);
ls_accountARRAY = new ARRAY(ad, oconn, arg_accounts);
ocs.setARRAY(2, ls_accountARRAY);
我很好奇这是如何工作的。即使名称中包含 Array,它也没有像我通常看到的那样定义为数组或表类型。它有效,但这是合法用法还是我应该明确声明该类型为某种数组类型?
谢谢
山姆
【问题讨论】:
更新: 我只是想为遇到这个问题的人纠正这个问题:这只是我使用的 Sqltools 版本中的一个显示问题。当我编辑该类型时,它实际上将源部分显示为CREATE OR REPLACE TYPE its_accountarray
这就是我想要的。正文部分“AS TABLE OF...”未显示;显然它在两者之间放置了很多空间,那个身体没有出现在视野中。正如我在下面提到的,SQL*Plus 确实显示正确。新版本的工具做得更好,仍然嵌入了很多空间,但至少在视图中。
【参考方案1】:
我试图重现你所说的正在发生的事情,但出现了错误:
CREATE OR REPLACE TYPE its_accountarray;
DECLARE
v its_accountarray := its_accountarray();
BEGIN
null;
END;
/
PLS-00311: the declaration of "ITS_ACCOUNTARRAY" is incomplete or malformed
因此,您可能正在查看错误的类型定义(例如,您在错误的架构中查看它),或者没有查看整个类型定义(例如,有一个提供实现的 TYPE BODY)。由于这看起来像是嵌套表类型,所以前者听起来更有可能。
【讨论】:
嗨,戴夫,感谢您这么快回复。 嗨,戴夫,我想我上次按 ENTER 太快了。你说的对!!该声明是不正确的。我想知道这是否是我使用的工具(SqlTools 1.5)中的错误。当我在 SQLTools 中打开类型时,它只显示了该部分并且没有正文!这就是为什么我如此困惑。我刚刚尝试在 sqlplus 中描述 ITS_ACCOUNTARRAY,它按预期显示:SQL> describe ITS_ACCOUNTARRAY ITS_ACCOUNTARRAY TABLE OF VARCHAR2(24)
我已经使用 SQLTools 几年了,这是第一次,它真的让我着迷。再次非常感谢。山姆以上是关于Oracle CREATE TYPE 和 PL/SQL的主要内容,如果未能解决你的问题,请参考以下文章
oracle PL/SQL里面, tnsnames.ora文件里面配置了之后, 在下拉列表框里面没有显示