簡體   English   中英

如何在包的Oracle where子句中輕松使用集合?

[英]How can I easily use a collection in an Oracle where clause in a package?

據我了解,除非在數據庫級別定義了集合,否則無法在where子句中使用集合。 我對圍繞模式的隨機類型定義有明顯的不滿。 這是宗教性的事情,所以不要試圖勸阻我。

包裝中包含的類型很酷,因為它們很容易找到並且與手頭的工作有關。 說了這么多,我有一個包,它定義了一個看起來像這樣的結構(當前是一個表類型集合);

  TYPE WORD_LIST_ROW IS RECORD(
    WORD VARCHAR(255));
  TYPE WORD_LIST IS TABLE OF WORD_LIST_ROW;

程序包中有一個例程,用於實例化並填充其實例。 能夠使用實例化的對象或where子句中的某些模擬對象將很有用。

因此,作為一個聰明的(或我認為如此)的程序員,我說了為什么不創建一個流水線函數來從我所做的集合中創建一個表,它看起來像;

  FUNCTION WORD_LIST_TABLE(IN_WORD_LIST WORD_LIST) RETURN WORD_LIST PIPELINED
  AS
    OUT_WORD_LIST WORD_LIST := WORD_LIST();
  BEGIN
    FOR I IN 1 .. IN_WORD_LIST.COUNT
    LOOP
      PIPE ROW(IN_WORD_LIST(I));
    END LOOP;
    RETURN;
  END WORD_LIST_TABLE;

然后,在另一個例程中,我調用構建集合的函數,最后使用流水線函數,該函數使用集合作為游標的where子句中的輸入。

有點像

cursor xyz
is 
    select * from x-stuff where fieldA in (select word from table(word_list_table(temp_word_list));

在游標的循環中,我得到一個oracle錯誤ora-21700對象不存在或被標記為刪除。

有沒有簡單的方法來構建可在Oracle where子句中使用的oracle對象? 基本上我想做的是;

select * from whatever where fielda in myobject;

解決方案很簡單-使用CREATE TYPE語句在架構級別聲明CREATE TYPE ,您將能夠在PL / SQL塊的SQL語句中使用集合。

如果在PL / SQL包中聲明了TYPE ,則不能在PL / SQL塊中的查詢中使用它。

此外,必須記住,從Oracle 11.2開始,查詢中只能使用varray和嵌套表類型集合,並且不能在查詢中使用關聯數組。在12c中,您沒有這些限制。

有關更多參考,請訪問Oracle Docs

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM