1

我是 PL/SQL 的新手,在 Oracle 中使用自定义表类型创建视图时遇到问题。这些是创建的类型:

create or replace
TYPE "Control" AS OBJECT ("Date" nvarchar2(10), "R" number(7,3), "Limit(7,3);
create or replace TYPE Controls AS TABLE OF "Control";

CREATE OR REPLACE TYPE Result_typ AUTHID CURRENT_USER AS OBJECT (
  "Program" varchar(10),
  "ID_User" nvarchar2(25),
  "Controls" Controls,
 )

在 DB 中,我们有两种不同类型的控件(c_control、g_control)存储在不同的表中,公共字段很少。我正在尝试创建一个视图,选择所有不同的控件,尽管它们的类型不同,所以我使用 UNION 子句。这是我的视图创建语句(进行了一些细微的更改以使其更简单):

CREATE OR REPLACE VIEW "all_controls" OF Result_typ 
with object IDENTIFIER ("ID_User") 
as SELECT 'MYAPP' as Program, 
u.user_id as "ID_User", 
CAST(MULTISET(
     select to_char(control_date,'yyyy-mm-dd') as "Date", 
  r as "R", 
     limit as "Limit"
     from g_control
     where control_date between to_date('20130310','yyyymmdd') 
     and to_date('20130313','yyyymmdd')
  UNION
     select to_char(control_date,'yyyy-mm-dd') as "Date", 
 r as "R", 
 limit as "Limit",
 from control
 where and control_date between to_date('20130310','yyyymmdd') 
     and to_date('20130313','yyyymmdd')
) AS Controls) 
FROM user u
WHERE u.user_name like 'Scott';

从 SQL Developer 执行语句时,返回值为“SQL 错误:没有更多数据可从套接字读取”。在 MULTISET 中执行 UNION 是否有任何问题?如何选择 UNION 结果作为 MULTISET?提前致谢

4

1 回答 1

3
SELECT
    CAST(MULTISET(
            select '2013-01-01' a, 1 b, 1 c from dual union all
            select '2013-01-01', 1, 1 from dual
    ) AS Controls) 
FROM dual;

ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 7292
Session ID: 201 Serial number: 4479

添加一个额外的内联视图似乎可以解决它:

SELECT
    CAST(MULTISET(
        select * from
        (
            select '2013-01-01' a, 1 b, 1 c from dual union all
            select '2013-01-01', 1, 1 from dual
        )
    ) AS Controls) 
FROM dual;

CONTROLS(Control('2013-01-01', 1, 1), Control('2013-01-01', 1, 1))

感谢 Oracle 论坛上的 MichaelS

其他一些建议:

  1. 避免引用标识符。它使对象更难使用。
  2. 避免将日期存储为字符串。 特别是如果您使用对象类型。字符串类型的对象关系数据很奇怪。
  3. 如果没有功能,AUTHID CURRENT_USER 将无济于事。
  4. 更好的缩进有助于我们更容易理解问题
  5. 始终包含完整的错误消息
  6. 完整的模式定义会有所帮助。
  7. 您的示例中有很多语法错误。
  8. 正如@APC 提到的,Oracle 的对象关系特性非常困难。如果可能,您应该重新考虑使用它。您可能应该首先关注常规关系技术。
  9. 这里还是有一些bug。检查警报日志,您会看到类似ORA-07445: exception encountered: core dump [qcsfsqacn()+105] [ACCESS_VIOLATION] [ADDR:0x4] [PC:0x12286C1] [UNABLE_TO_READ] []. 如果此解决方法还不够,您需要联系 Oracle 支持以了解此错误。我已经在 My Oracle Support 上进行了检查,目前没有关于此错误的文档。
于 2013-03-12T18:29:50.557 回答