使用 .net sdk 和 sql 查询 Universe 数据库时如何获取页面
How to do fetch pages when querying universe database using .net sdk and sql
我正在使用他们的 .net 驱动程序连接到 Universe 数据库(来自 Rocket 软件)。我想根据每页的用户请求按需获取数据,即分页。我们可以使用其他数据库(偏移获取),但 universe db 似乎不支持它。它不识别关键字偏移量,例如
SELECT NAME, AGE FROM CONTACTS WHERE AGE > 25 offset 5 sample 5
不起作用。我不认识那些关键字,也没有好的文档:-(
注意:虽然传统上是多值数据库,但我用的这个并没有使用多值类型,而是规范化了结构。
这当然是这个平台的缺点之一。我过去曾使用类似于以下子例程的方法来解决这个问题。为了简洁起见,我不得不删除了一堆东西,但是这个编译所以它必须完全没有错误,对吧?
注意事项:您需要在每个要使用的文件中包含 @SELECT DICT 项,其中包含您想要 return.
的所有列
多值有点棘手。我已经将使用它的数据展平,所以我没有 运行 进入那个问题,但这不会做 UNNEST。
此外,您可能想添加一个值,说明总共有多少条记录,并可能计算出某种令牌传递和列表保存,以减少每次 运行 时执行查询的次数,但是比手头的基本问题要深入得多。
SUBROUTINE SQLSelectWithOffset(TableName,UVWithClause,Starting,Offset)
***********************************************************************
* PROGRAM ID: SQLSelectWithOffset
*
* PROGRAM TITLE: SQLSelectWithOffset
*
* DESCRIPTION: Universe doesn't support sql commands using starting and offset
* which makes life hard when you want all of a file
* but you choke on the size. Tokens allow for the selectlist to be saved
* TableName = UV FIle to select on. If this is blank program will return the number of records remaining
* UVWithClause = Your critera, WITH or BY criteria you want in a sort select.
* Starting = Holds you place in line
* Offest = How many records to return
************************************************************************
$INCLUDE UNIVERSE.INCLUDE ODBC.H
RETURN.LIST = ""
IF Starting = "" or Starting < 1 THEN
Starting = 1
END
GOSUB GET.MASTER.LIST
FOR X=Starting TO Offset
ID = EXTRACT(FULL.LIST,X,0,0)
IF ID = "" THEN CONTINUE
RETURN.LIST<-1> = ID
NEXT X
SELECT RETURN.LIST TO 9
SQLSTMT ="SELECT * FROM ":TableName:" SLIST 9"
ST=SQLExecDirect(@HSTMT, SQLSTMT)
RETURN
GET.MASTER.LIST:
STMT = "SSELECT ":TableName
IF UVWithClause NE "" THEN
STMT := " ":UVWithClause
END
EXECUTE "CLEARSELECT"
EXECUTE STMT
READLIST FULL.LIST ELSE FULL.LIST = ""
RETURN
END
祝你好运,请永远使用此信息!
我正在使用他们的 .net 驱动程序连接到 Universe 数据库(来自 Rocket 软件)。我想根据每页的用户请求按需获取数据,即分页。我们可以使用其他数据库(偏移获取),但 universe db 似乎不支持它。它不识别关键字偏移量,例如
SELECT NAME, AGE FROM CONTACTS WHERE AGE > 25 offset 5 sample 5
不起作用。我不认识那些关键字,也没有好的文档:-(
注意:虽然传统上是多值数据库,但我用的这个并没有使用多值类型,而是规范化了结构。
这当然是这个平台的缺点之一。我过去曾使用类似于以下子例程的方法来解决这个问题。为了简洁起见,我不得不删除了一堆东西,但是这个编译所以它必须完全没有错误,对吧?
注意事项:您需要在每个要使用的文件中包含 @SELECT DICT 项,其中包含您想要 return.
的所有列多值有点棘手。我已经将使用它的数据展平,所以我没有 运行 进入那个问题,但这不会做 UNNEST。
此外,您可能想添加一个值,说明总共有多少条记录,并可能计算出某种令牌传递和列表保存,以减少每次 运行 时执行查询的次数,但是比手头的基本问题要深入得多。
SUBROUTINE SQLSelectWithOffset(TableName,UVWithClause,Starting,Offset)
***********************************************************************
* PROGRAM ID: SQLSelectWithOffset
*
* PROGRAM TITLE: SQLSelectWithOffset
*
* DESCRIPTION: Universe doesn't support sql commands using starting and offset
* which makes life hard when you want all of a file
* but you choke on the size. Tokens allow for the selectlist to be saved
* TableName = UV FIle to select on. If this is blank program will return the number of records remaining
* UVWithClause = Your critera, WITH or BY criteria you want in a sort select.
* Starting = Holds you place in line
* Offest = How many records to return
************************************************************************
$INCLUDE UNIVERSE.INCLUDE ODBC.H
RETURN.LIST = ""
IF Starting = "" or Starting < 1 THEN
Starting = 1
END
GOSUB GET.MASTER.LIST
FOR X=Starting TO Offset
ID = EXTRACT(FULL.LIST,X,0,0)
IF ID = "" THEN CONTINUE
RETURN.LIST<-1> = ID
NEXT X
SELECT RETURN.LIST TO 9
SQLSTMT ="SELECT * FROM ":TableName:" SLIST 9"
ST=SQLExecDirect(@HSTMT, SQLSTMT)
RETURN
GET.MASTER.LIST:
STMT = "SSELECT ":TableName
IF UVWithClause NE "" THEN
STMT := " ":UVWithClause
END
EXECUTE "CLEARSELECT"
EXECUTE STMT
READLIST FULL.LIST ELSE FULL.LIST = ""
RETURN
END
祝你好运,请永远使用此信息!