2

我正在使用他们的 .net 驱动程序连接到一个宇宙数据库(来自火箭软件)。我想根据每页的用户请求按需获取数据,即进行分页。对于我们可以使用的其他数据库(偏移提取),但 Universe db 似乎不支持它。它不识别关键字偏移量,类似的东西 SELECT NAME, AGE FROM CONTACTS WHERE AGE > 25 offset 5 sample 5不起作用。我不认识这些关键字,也没有好的文档:-(

注意:虽然它传统上是一个多值数据库,但我使用的不是多值类型,而是结构被规范化。

4

1 回答 1

2

这当然是这个平台的缺点之一。我过去曾使用类似于以下子例程的方法来解决此问题。为简洁起见,我不得不删除一堆东西,但是它可以编译,所以它必须完全没有错误,对吧?

注意事项:您需要在要使用它的每个文件中包含 @SELECT DICT 项目,其中包含要返回的所有列。

多值有点棘手。我已经扁平化了我使用它的数据,所以我没有遇到这个问题,但这不会做 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

祝你好运,请只使用此信息!

于 2017-05-18T18:24:43.247 回答