日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用表中的数组数据类型

發布時間:2023/12/3 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用表中的数组数据类型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在這篇文章中,我想跟進我以前關于Oracle集合數據類型的文章 ,并且我將集中精力使用af:table組件中的oracle.jbo.domain.Array屬性。

因此,在我的數據庫中,我具有以下SQL類型:



create or replace type varchar2_array_type as table of varchar2(200)

我有下表:

create table testarray ( SomeField Number, ArrValue VARCHAR2_ARRAY_TYPE) nested table ArrValue store as arrvalue_tab return as value;

ADF BC模型中有一個基于testarray表的實體:

屬性Arrvalue的數據類型為oracle.jbo.domain.Array。

綁定容器中有一個相應的屬性綁定:

<attributeValues IterBinding="VTestarrayIterator" id="Arrvalue"><AttrNames><Item Value="Arrvalue"/></AttrNames></attributeValues>

顯示此屬性值的最簡單方法如下:

<af:table value="#{bindings.Arrvalue.inputValue.array}" var="row" id="t1"><af:column sortable="false" headerText="Array Values" id="c1"><af:inputText value="#{row}" id="ot3"/>???????????? </af:column> </af:table>

結果看起來非常不錯:

這種方法的唯一問題是該表不可更新。 它是只讀的。

EL表達式“#{bindings.Arrvalue.inputValue.array}”將調用方法oracle.jbo.domain.Array.getArray() ,該方法返回一個不變的Object []數組,并且對該數組的所有修改都將丟失。

如果我們需要能夠更新表中的數據,則必須執行以下操作:

  • 制作bindings.Arrvalue.inputValue.array的副本
  • 將此副本設置為表的值
  • 在“更新模型值”階段,將副本包裝回oracle.jbo.domain.Array,并將其放入Arrvalue.inputValue。
  • 因此,我們將制作一個副本并將其保留在請求范圍托管的bean中:

    private Object[] array = null;private Object[] createArray() {JUCtrlValueBinding dcb = getArrayCtrlBinding();if (dcb!=null){Array arr = (Array) dcb.getInputValue();if (arr!=null) {array = arr.getArray();}????????? }return array; }public void setArray(Object[] array) {this.array = array; }public Object[] getArray() {return (array == null ? createArray() : array); }private JUCtrlValueBinding getArrayCtrlBinding() {BindingContext bc = BindingContext.getCurrent();DCBindingContainer binding = (DCBindingContainer) bc.getCurrentBindingsEntry();return (JUCtrlValueBinding ) binding.findCtrlBinding("Arrvalue"); }

    當使用此副本作為表的值時,我們可以執行以下操作:

    <af:table value="#{TheBean.array}" var="row" id="t1"varStatus="status"><af:column sortable="false" headerText="Array Values" id="c1"><af:inputText value="#{TheBean.array[status.index]}" id="ot3"/>???????????? </af:column></af:table>

    請注意,我們不僅使用#{row}作為inputText的值。 這將不起作用,因為#{row}只會返回一個不變的String。 取而代之的是,我們使用了varStatus表屬性。 EL表達式#{TheBean.array [status.index]}使框架能夠在“更新模型值”階段調用相應的setter方法,因此表中所做的所有修改都將保存到TheBean.array中 。

    最后一步是在“更新模型值”階段將TheBean.array放回屬性值。 為此,我們可以使用偽造的不可見的inputText :

    <af:inputText value="#{TheBean.dummy}" visible="false" converter="EmptyConverter"id="it2"/>

    此輸入文本應放在頁面上表格的下方。 這種方法的優點在于,框架將嘗試在每個請求上更新inputText值。 因此,將表值保存到TheBean.array之后,將在更新模型值階段對每個請求調用setter方法TheBean.setDummy(String dummy) 。 現在,我們將把數組包裝到oracle.jbo.domain.Array中 ,然后放回Arrvalue.inputValue :

    public void setDummy(String dummy) {getArrayCtrlBinding().setInputValue(new Array(array));?? array = null; }

    此虛擬 inputText的秘密隱藏在EmptyConverter中:

    public class EmptyConverter implements Converter {public Object getAsObject(FacesContext facesContext,UIComponent uIComponent, String string) {return null;}public String getAsString(FacesContext facesContext,UIComponent uIComponent, Object object) {return null;} }

    它模擬已隨請求為此組件提交了空值。 另一方面, 偽獲取器總是返回一個非空值:

    public String getDummy() {return DUMMY;}

    因此,該框架別無選擇,只能在“更新模型值”階段調用setDummy方法。

    本文的示例應用程序需要JDeveloper 11.1.1.7。

    而已!

    翻譯自: https://www.javacodegeeks.com/2014/04/working-with-the-array-data-type-in-a-table.html

    總結

    以上是生活随笔為你收集整理的使用表中的数组数据类型的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。