2016-05-18 58 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)'而不需要解析任何东西。 –