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&gt; describe ITS_ACCOUNTARRAY ITS_ACCOUNTARRAY TABLE OF VARCHAR2(24) 我已经使用 SQLTools 几年了,这是第一次,它真的让我着迷。再次非常感谢。山姆

以上是关于Oracle CREATE TYPE 和 PL/SQL的主要内容,如果未能解决你的问题,请参考以下文章

oracle函数

oracle存储过程

oracle PL/SQL里面, tnsnames.ora文件里面配置了之后, 在下拉列表框里面没有显示

oracle函数创建及调用

关于Oracle中job定时器(通过create_job创建的)配置示例

oracle存储过程