2016-05-18 62 views
0

我有一個包含程序數據的postgresql數據庫。在Libreoffice Calc中,我有基本的宏與postgresql數據庫進行交互,並使用Calc作爲用戶客戶端。其中一個postgresql表有一個數組,我不能直接從Basic索引到該數組。從Libreoffice Basic訪問SQL數組元素

下面是表設置,如圖pgAdmin的:

sq_num integer, 
    year_start integer, 
    id serial NOT NULL, 
    "roleArray" text[] 

說我想選擇roleArray [50]。我所有的嘗試都是通過傳遞整個數組的基本結果。我當然可以自己拆分數組並獲取我之後的元素,但是我使用SQL數組來幫助自動化這些東西。

我的基本代碼使用Libreoffice Base文件連接到postgresql數據庫。將基礎文件,我不能創建一個查詢,將選擇一個單獨的元素,而不是返回整個數組,除非我選擇按鈕「運行SQL命令直接」,並運行此查詢:

SELECT "roleArray"['50'] FROM myTableThatHasArrays 

然後我得到的元素按照預期從每個記錄中獲得50個

我相信有一個錯誤報告描述了這一點,其中基本命令解析器無法處理索引數組。我的問題是克服這個問題的最好方法是什麼?

最好的方案是能夠直接從Basic中索引SQL數組中的元素。

+0

如果沒有答案,解決此問題的權宜辦法是接受整個數組。它將作爲csv字符串收到,並在最後帶有大括號。解決方案是分開大括號,然後分割逗號,然後索引你想要的元素。然而,這是一個解決方法,而不是我希望使用的答案。 – Smith

+0

歡迎來到StackOverflow!什麼是您嘗試的基本代碼? –

+0

另一件要提及的事情:不要讓pgAdmin將您的表名放在引號中。如果你不用小寫字母輸入列名,它會顯示它。 – Smith

回答

0

這聽起來像你使用XRow.getString,它(明智地)檢索數組作爲一個單一的大字符串。相反,請使用XRow.getArray,然後使用XArray.getArray。這裏是一個工作示例:

sSQL = "SELECT id, ""roleArray""[2] FROM mytablethathasarrays;" 
oResult = oStatement.executeQuery(sSQL) 
s = "" 
Do While oResult.next() 
    sql_array = oResult.getArray(2) 
    basic_array = sql_array.getArray(Null) 
    s = s & oResult.getInt(1) & " " & basic_array(1) & CHR$(10) 
Loop 
MsgBox s 
+0

啊,我忘了.getArray。但是,我認爲oResult從查詢中捕獲了完整的數組,而不僅僅是元素[2]。 XRow方法確定如何解釋訪問行中的數據,但是這是在SQL查詢中的值填充行之後。我認爲這是查詢通過Base時索引被剝離。在服務器上的SQL終端上調用的查詢將返回元素2.在具有「直接命令」模式的Base SQL終端上進行的查詢將返回元素2.上面從Basic調用的代碼將返回完整數組。 – Smith

+0

它獲取數組,但是然後'basic_array(1)'得到一個特定的元素。所以這段代碼完成了你的要求,對吧?你可以簡單地說'basic_array(50)'而不需要解析任何東西。 –