2013-03-12 41 views
1

我是PL/SQL的新手,我在使用Oracle中的自定義表類型創建視圖時遇到問題。這些都是創建的類型:Oracle,帶聯合子查詢的cast和multiset

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子句。 在這裏有我的看法創建語句(有一些微妙的變化,使其simplier):

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? 在此先感謝

+0

什麼是g_control?表或其他類型?創建示例數據,例如表,數據... – Art 2013-03-12 15:07:32

+2

如果您是PL/SQL對象的新手,那麼最糟糕的地方就是開始。即使是強化的PL/SQL從業者也會發現它們粗糙。從另一種語言如sJava帶來面向對象的經驗並沒有幫助;事實上,這可能會讓事情變得更加困難,因爲Oracle OO的實施非常特殊。 – APC 2013-03-12 16:06:20

+0

另外,有了代碼,請確保你已經發布了整個源代碼。您的樣本目前不完整。 – APC 2013-03-12 16:08:40

回答

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)) 

Thanks to MichaelS at Oracle forums

其他一些建議:

  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,目前沒有關於此錯誤的文檔。
+0

由於時間限制,我不得不實施解決方案。最後,我爲包含UNION的第二部分的多重集的select子句添加了一個新元素。我不知道,但對我們的要求似乎沒有問題。 – 2013-03-22 11:43:19