第一章 InterSystems SQL简介

2021-03-01  本文已影响0人  Cache技术分享

第一章 InterSystems SQL简介

InterSystems SQL提供对InterSystems IRIS®Data Platform数据库中存储的数据的无懈可击的标准关系访问。

InterSystems SQL提供以下优势:

可以将InterSystems SQL用于多种目的,包括:

架构

InterSystems SQL的核心由以下组件组成:

特点

InterSystems SQL包括一整套标准的关系型功能。这些措施包括:

符合SQL-92

SQL-92标准在算术运算符优先级方面是不精确的;关于这一问题的假设因SQL实现而异。InterSystems SQL支持将系统配置为以下任一系统范围的SQL算术运算符优先级替代方案:

SQL运算符优先级的默认值取决于InterSystems IRIS版本。

InterSystems SQL支持完整的入门级SQL-92标准,但有以下例外:

拓展

其中一些扩展包括:

互操作性

JDBC

InterSystems IRIS包括一个符合标准的第4级JDBC客户机(全部是纯Java代码)。

InterSystems JDBC驱动程序提供以下特性:

可以将InterSystems JDBC与任何支持JDBC的工具、应用程序或开发环境一起使用。

ODBC

InterSystems SQL的c语言调用级接口是ODBC。与其他数据库产品不同,InterSystems ODBC驱动程序是一个本机驱动程序——它不是构建在任何其他专有接口之上的。

InterSystems ODBC驱动程序提供以下功能:

可以将InterSystems ODBC与支持ODBC的任何工具,应用程序或开发环境一起使用。

嵌入式SQL

在ObjectScript中,InterSystems SQL支持嵌入式SQL: 将SQL语句放置在方法(或其他代码)主体中的能力。使用嵌入式SQL,可以查询单个记录,或定义一个游标,然后使用该游标查询多个记录。嵌入式SQL已编译。默认情况下,它是在第一次执行(运行时)时进行编译的,而不是在包含它的例程进行编译时进行的。因此,在运行时检查SQLCODE错误很重要。 还可以与包含嵌入式SQL的ObjectScript例程同时编译嵌入式SQL。

与InterSystems IRIS的对象访问功能结合使用时,嵌入式SQL的功能非常强大。例如,以下方法查找具有给定Name值的记录的RowID:

/// w ##class(PHA.TEST.SQL).FindByName("姚鑫")
ClassMethod FindByName(fullname As %String)
{
    &sql(SELECT %ID INTO :id FROM Sample.Person WHERE Name = :fullname)

    IF SQLCODE < 0 {
        SET baderr="SQLCODE ERROR:"_SQLCODE_" "_%msg
        RETURN baderr 
    } ELSEIF SQLCODE = 100 {
        SET nodata="Query returns no data"
        RETURN nodata 
    }
    RETURN "RowID="_id
}
DHC-APP>w ##class(PHA.TEST.SQL).FindByName("姚鑫")
RowID=6

注意: 如果 Name 查处多条的话 id为查询的第一条数据

指定倒序,为最后一条。

&sql(SELECT %ID INTO :id FROM Sample.Person WHERE Name = :fullname order by ID desc)
DHC-APP>w ##class(PHA.TEST.SQL).FindByName("姚鑫")
RowID=14
image.png

动态SQL

作为其标准库的一部分,InterSystems IRIS提供了一个%SQL.Statement类,可以使用它来执行动态(即在运行时定义的)SQL语句。可以在ObjectScript方法中使用动态SQL。例如,下面的方法查询指定数量的21世纪出生的人。该查询选择1999年12月31日之后出生的所有人,按出生日期对所选记录进行排序,然后选择前x条记录:

/// w ##class(PHA.TEST.SQL).Born21stC("姚鑫")
ClassMethod Born21stC(x)
{
/// w ##class(PHA.TEST.SQL).Born21stC("1")
ClassMethod Born21stC(x)
{
  SET myquery=2
  SET myquery(1) = "SELECT TOP ? Name,%EXTERNAL(DOB) FROM Sample.Person "
  SET myquery(2) = "WHERE DOB > 58073 ORDER BY DOB"
  SET tStatement = ##class(%SQL.Statement).%New()
  SET qStatus = tStatement.%Prepare(.myquery)
  IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
  SET rset = tStatement.%Execute(x)
  DO rset.%Display()
  WRITE !,"End of data"
  q ""
}

DHC-APP>w ##class(PHA.TEST.SQL).Born21stC("2")
Name    Expression_2
Ingrahm,Susan N.        02/10/2001
Goldman,Will H. 09/22/2002
 
2 Rows(s) Affected
End of data

准备查询时,该查询的优化版本将存储为缓存查询。该缓存查询被执行用于查询的后续调用,从而避免了每次执行查询时重新优化查询的开销。

限制

请注意InterSystems SQL的以下限制:

NLS可用于为单个全局变量以及当前运行的进程中的局部变量指定特定国家区域设置行为的$ORDER行为。InterSystems SQL可以在任何国家语言环境中使用和良好地工作。然而,InterSystems SQL当前的一个限制是,对于任何特定进程,它引用的所有相关全局变量都必须使用与当前进程区域设置相同的国家区域设置。

上一篇 下一篇

猜你喜欢

热点阅读