我如何创建引用表列数据类型的Oracle类型?

11

我正在尝试使用以下代码定义一个type

CREATE OR REPLACE TYPE MY_TYPE AS OBJECT (
    app_id        some_table_name.app_id%type
);

如果我运行这个,就会出现错误。

Error(4,32): PLS-00201: identifier 'some_table_name.app_id' must be declared

这个有什么问题吗?


1
更多细节请参考Oracle论坛。我想这是有道理的,但对我来说似乎是一种直觉上想要做到最佳实践的东西。 - wmorrison365
2个回答

24
由于%type是PL/SQL语法,而不是SQL语言支持的语法,所以它有问题。现在我们使用PL/SQL来定义类型(尤其是成员函数、构造函数等),但是类型本身是SQL对象,因此遵循SQL规则。这意味着我们必须使用明确的数据类型声明类型属性。
我同意这很遗憾,如果我们可以像这样在类型声明中引用表列就会非常方便。不幸的是,Oracle在过去几个版本中对其TYPE实现的更改速度放缓了,因此我认为短期内不太可能发生改变。
我真正希望看到的是Oracle支持这种语法:
CREATE OR REPLACE TYPE MY_TYPE AS OBJECT 
      (     one_row        some_table_name.%rowtype ); 

为接口创建动态对象:这会多酷呀!


%type 是 PL/SQL 语法 - 这是我漏掉的重要部分。谢谢。 - AppleGrew
1
+1,这是一种遗憾,它会使针对这种“类型”进行编码更加灵活。 - Ollie
1
他们必须像在视图和包中一样跟踪依赖项;考虑到Oracle的类型实现有多么糟糕,我会把它归类为“永远不会发生”。 - Adam Musch

4

在数据库中声明类型时,不能使用some_table_name.app_id%type,就像你不能这样做一样:

create table emp (empno number,
                  deptno dept.deptnp%type, -- NOT ALLOWED
                 );

您必须使用内置类型,例如NUMBER、VARCHAR2(10),或者用户自定义类型,例如mytype


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接