使用 Postgres DB 从 Libreoffice Basic 访问 SQL 数组元素

问题描述 投票:0回答:0

这是讨论的跟进:

从 Libreoffice Basic 访问 SQL 数组元素

我有几乎相同的问题。我正在按照上面提到的代码进行操作,但出现错误。这是我所做的:

  1. 表格是:
CREATE TABLE temp.table2
(
  names character varying[],
  names2 text[]
);
insert into temp.table2(names, names2) values (ARRAY['a','b','c','d','e'], ARRAY['a','b','c','d','e']);

insert into temp.table2(names, names2) values (ARRAY['1','2','3','4','5'], ARRAY['1','2','3','4','5']);

insert into temp.table2(names, names2) values (ARRAY['e','d','c','b','a'], ARRAY['e','d','c','b','a']);
  1. LO 基础:
Sub Main
    If isnull(ThisDatabaseDocument.currentcontroller.activeconnection) Then
        ThisDatabaseDocument.currentcontroller.connect("root", "root")
    End if
    pgCon=ThisDatabaseDocument.currentcontroller.activeconnection
    stmt = pgCon.createStatement()
    
    rs = stmt.executeQuery("select names,names2 from temp.table2")
    rs2 = rs.getMetadata()
    While rs.Next
        dar = rs.getString(1).getArray(Null)
    Wend 
End Sub

在线

dar = rs.getString(1).getArray(Null)

错误出现:

BASIC runtime error.
Object variable not set.

看来我做的一切都是正确的;但是,我得到一个错误。

然而,这不是我的目标。我想按以下方式使用 XArray:

  1. 这是我的 pgSQL 代码:
    create or replace function temp.f_iu7YttW(dname text[]) returns void as $$
    declare
    counter integer = 1;
    begin
        while counter<=50 loop
            insert into temp.table1(name) values(dname[counter]);
            counter=counter+1;
        end loop;
    end; $$ language plpgsql;

  1. 这是我的基本代码:
Sub Main
Dim stmt As Object
Dim rs As Object
Dim sql As String
Dim a As Variant
Dim x As Long
    If isnull(ThisDatabaseDocument.currentcontroller.activeconnection) Then
        ThisDatabaseDocument.currentcontroller.connect("root", "root")
    End if
    pgCon=ThisDatabaseDocument.currentcontroller.activeconnection
    executeDDLPg("drop function if exists temp.f_iu7YttW(text[])")
    myDict= getScriptForgeDictionary()
    x=0
    a= Array(x & "")
    SF_Array.Append(a)
    For x = 1 To 50
        a=SF_Array.Append(a,x & "")
    Next x
    max = ubound(a)
    sql ="drop function if exists temp.f_iu7YttW(text[]);" & _
    "create or replace function temp.f_iu7YttW(dname text[]) returns void as $$ " & _
    "declare "  & _
    "counter integer = 1; "  & _
    "begin "  & _
    "   while counter<" & max & " loop "  & _
    "       insert into temp.table1(name) values(dname[counter]); "  & _
    "       counter=counter+1; "  & _
    "   end loop; "  & _
    "end; $$ language plpgsql;" ' & _
    executeDDLPg(sql)
    sql="select temp.f_iu7YttW(?);\n" ' & _
    stmt = pgCon.prepareStatement(sql)
    
    stmt.setString(1,a)
    stmt.executeUpdate()
    stmt.clearParameters()
    closeDbObject(stmt)
    executeDDLPg("drop function temp.f_iu7YttW(text[])")
End Sub

此代码无效。如果我将

stmt.setString(1,a)
替换为
stmt.setArray(1,a)
然后 LO crashes.

arrays postgresql stored-procedures libreoffice basic
© www.soinside.com 2019 - 2024. All rights reserved.