1 关注者 · 494 帖子

SQL 是在关系数据库中存储、操作和检索数据的标准语言。

文章 姚 鑫 · 十一月 16, 2021 4m read

第七十八章 SQL命令 TUNE TABLE

基于代表性数据调优表。

大纲

TUNE TABLE tablename [ tune_options ]

参数

  • tablename - 要调优的现有表的名称。 表名可以是限定的(schema.table),也可以是非限定的(table)。 非限定表名接受默认模式名。
  • - 可选—如果指定,一个或多个选项,以任意顺序指定,由空格分隔。 这些tune_options不区分大小写。

描述

TUNE TABLE命令根据表中当前的数据对现有表进行调优。 该数据应该代表表完全填充时所期望的数据。

根据代表性数据计算和设置表的块大小、选择性和范围大小。 通常,设置一个或多个这些值,并清除所有使用这个持久类(表)的缓存查询,以便查询将使用这些新值。 但是,如果TUNE TABLE没有更改这些值(例如,自上次对该表运行以来数据没有更改),则缓存查询不会被清除,该表的类定义也不会被标记为需要重新编译。

更新SQL表定义(因此需要特权来更改表定义)。 通常,还会更新相应的持久类定义。 这允许查询优化器使用调优后的值,而不需要进行类编译。 但是,如果部署了类,那么TUNE TABLE只更新SQL表定义; 查询优化器间接使用表定义中的调优值。

如果成功,它将设置为0

0
0 148
文章 姚 鑫 · 十一月 15, 2021 6m read

第七十七章 SQL命令 TRUNCATE TABLE

从表中删除所有数据并重置计数器。

大纲

TRUNCATE TABLE [restriction] tablename

参数

  • restriction - 可选—以下限制关键字中的一个或多个,用空格隔开:%NOCHECK%NOLOCK
  • - 要从中删除所有行的表。 还可以指定一个可更新视图,通过该视图可以删除表中的所有行。 表名(或视图名)可以是限定的()或非限定的(table)。 使用模式搜索路径(如果提供的话)或默认模式名将非限定名称匹配到其模式。

描述

TRUNCATE TABLE命令从表中删除所有行,并重置所有表计数器。 可以直接截断表,也可以通过视图截断表。 通过视图截断表会受到删除要求和限制,如中所述。

重置用于生成字段、IDENTITY字段和()字段连续整数值的内部计数器。 IRIS为插入到表后的表中的第一行中的这些字段赋值为1。 对表的所有行执行操作不会重置这些内部计数器。

重置用于在数据插入到流字段时生成流字段值的内部计数器。 对表的所有行执行DELETE操作不会重置此内部计数器。

总是将本地变量设置为; 它没有将设置为删除的行数。

不会重置计数器。

TRUNCATE TABLE禁止提取基表触发器,否则在处理期间提取基表触发器。 因为执行的是带有行为的删除,用户必须被授予权限(使用

0
0 157
文章 姚 鑫 · 十一月 14, 2021 8m read

第七十六章 SQL命令 TOP

指定返回多少行的SELECT子句。

大纲

SELECT  [DISTINCT clause] 
  [TOP {[((]int[))] | ALL}]
  select-item{,select-item}

参数

  • int - 限制返回到指定整数的行数。 int参数可以是一个正整数、一个动态SQL输入参数()或一个解析为正整数的嵌入式主机变量()。在动态SQL中,int值可以选择用单括号或双括号括起来(双括号是首选语法); 这些括号禁止在相应的缓存查询中对int值进行文字替换。
  • ALL - 仅在子查询或语句中有意义。 它用于在这些情况下支持使用ORDER BY子句,满足在子查询或CREATE 中使用的查询中子句必须与子句配对的要求。 不限制返回的行数。

描述

可选的子句出现在关键字和可选的DISTINCT子句之后,以及第一个选择项之前。

关键字用于动态SQL和基于指针的嵌入式SQL。 在非游标嵌入式SQL中,关键字的唯一有意义的用法是。 任何其他(其中int是任何非零整数)都是有效的,但没有意义,因为非游标嵌入式SQL中的总是最多返回一行数据。

语句的子句将返回的行数限制为int中指定的行数。 如果没有指定子句,则默认显示满足条件的所有行。 如果指定了子句,则显示的行数或行数要么为

0
0 237
文章 姚 鑫 · 十一月 13, 2021 11m read

第七十五章 SQL命令 START TRANSACTION

开始一个事务。

大纲

START TRANSACTION [%COMMITMODE commitmode]

START TRANSACTION [transactionmodes]

参数

  • commitmode - 可选-指定在当前进程中如何向数据库提交将来的事务。 取值包括EXPLICITIMPLICIT和。 默认是维护现有的提交模式; 进程的初始提交模式默认值是。
  • - 可选—指定事务的隔离模式和访问模式。 可以将隔离模式、访问模式或这两种模式的值指定为逗号分隔的列表。隔离模式的有效值为, ISOLATION LEVEL READ UNCOMMITTED, . 默认 .访问模式的有效值为和。 注意,只有隔离级别与读写模式兼容。

描述

START TRANSACTION语句启动一个事务。 立即启动一个事务,而不管当前的提交模式设置如何。 无论当前的提交模式设置如何,以开始的事务必须通过发出显式或来结束。

是可选的。

  • 如果流程只查询数据(语句),可以使用来建立隔离级别。 不需要。
  • 如果进程正在修改数据,那么是否需要通过发出来显式地开始事务,这取决于进程的当前提交模式设置(也称为AutoCommit设置)。 如果当前进程的提交模式是隐式的或显式的,则发出是可选的。 如果忽略,则在调用修改数据操作(、或
0
0 191
文章 姚 鑫 · 十一月 12, 2021 9m read

第七十四章 SQL命令 SET TRANSACTION

设置事务的参数。

大纲

SET TRANSACTION [%COMMITMODE commitmode]

SET TRANSACTION [transactionmodes]

参数

  • %COMMITMODE commitmode - 可选-指定向数据库提交事务的方式。 取值包括EXPLICITIMPLICIT和。 默认为。
  • - 可选—指定事务的隔离模式和访问模式。 可以将隔离模式、访问模式或这两种模式的值指定为逗号分隔的列表。隔离模式的有效值为, ISOLATION LEVEL READ UNCOMMITTED, and 。 默认为。 访问模式的有效值为。 注意,只有隔离级别与读写模式兼容。

描述

SET TRANSACTION语句为当前进程设置控制SQL事务的参数。 这些参数在下一个事务开始时生效,并在当前进程持续期间或直到显式重置为止。 它们不会在事务结束时自动重置为默认值。

单个语句可用于设置提交模式参数或事务模式参数,但不能同时设置两者。

可以使用命令设置相同的参数,该命令既可以设置参数,也可以开始一个新事务。 也可以使用方法调用设置参数。

SET TRANSACTION不会开始一个事务,因此不会增加事务级别计数器。

SET TRANSACTION可以在动态SQL(包括)和嵌入式SQL中使用。

0
0 113
文章 姚 鑫 · 十一月 11, 2021 8m read

第七十三章 SQL命令 SET OPTION

设置执行选项。

大纲

SET OPTION option_keyword = value

描述

SET OPTION语句用于设置执行选项,如编译模式、SQL配置设置和控制日期、时间和数字约定的区域设置。 每个语句只能设置一个关键字选项。

支持以下选项:

  • `AUTO_PARALLEL_THRESHOLD
  • COMPILEMODE
  • `DEFAULT_SCHEMA``
  • EXACT_DISTINCT
  • LOCK_ESCALATION_THRESHOLD

可以在动态SQL(包括SQL Shell)和嵌入式SQL中使用。

为了SQL兼容性,IRIS会解析其他参数(这里没有文档),但不执行任何操作。

因为的准备和执行速度很快,而且通常只运行一次,所以不会在、或动态SQL中为创建缓存查询。

IRIS支持下列选项:

选项被设置为一个整数n,用于确定当启用自动并行处理时是否应该对查询应用并行处理。 由于与并行处理相关的性能成本,因此需要为并行处理的优势确定一个阈值。 越高,SQL查询使用并行处理执行的可能性就越低。 默认为。 这是一个系统范围的设置。 值n大致对应于所访问的映射中发生并行处理所需的最小元组数量。

当自动并行被禁用时,选项没有作用。

0
0 141
文章 Muhammad Waseem · 十月 16, 2021 2m read

在本文中,我將演示以下內容:

  • 使用自定義實用程序函數從數據庫更新 ReferencesRange(OBX:7) 針對 ObservationIdentifier(OBX:3.1)[TestCode]
  • 根據數據庫實用程序函數中的 ObservationIdentifier(OBX:3.1)[TestCode] 和 ObservationValue(OBX:5)[Result] 更新異常標誌 (OBX:8)
  • 基於異常標誌的路由消息 (OBX:8)

以下是主要和轉換後的 HL7 2.5 ORU_R01 消息:

第 1 步:首先,我們需要在數據庫中保存參考範圍,為此我使用了 TestRanges 持久類:
第 2 步:我們需要創建一個自定義函數來獲取引用範圍,為此我在實用程序類中創建了 GetReferenceRange() ClassMethod 函數。 請注意這個類應該是來自 EnsRule.FunctionSet 的擴展
 

我們需要創建另一個函數來設置異常標誌,為此我在實用程序類中創建了 SetAbnormalFlag() ClassMethod 函數

第 3 步:現在我們將在數據轉換 (UpdateReferenceRangesDTL) 中使用這些函數。

1
0 265
文章 姚 鑫 · 十一月 10, 2021 6m read

第七十二章 SQL命令 SELECT(四)

WHERE子句

WHERE子句限定或取消查询选择中的特定行。 符合条件的行是那些条件表达式为真的行。 条件表达式是逻辑测试(谓词)的列表,可以通过ANDOR逻辑操作符链接这些测试(谓词)。 这些谓词可以使用一元逻辑操作符进行反转。

SQL谓词可分为以下几类:

  • Comparison 谓词
  • BETWEEN 谓词
  • LIKE 谓词
  • 谓词
  • 谓词
  • EXISTS 谓词
  • 谓词
  • 谓词

条件表达式不能包含聚合函数。 如果希望使用聚合函数返回的值指定选择条件,请使用子句。

子句可以使用=(内部连接)符号连接操作符指定两个表之间的显式连接。

WHERE子句可以使用箭头语法(- >)操作符在基表和来自另一个表的字段之间指定隐式连接。

GROUP BY子句

子句接受查询的结果行,并根据一个或多个数据库列将它们分成单独的组。 当将与GROUP BY结合使用时,将为字段的每个不同值检索一行。 子句在概念上类似于 IRIS扩展,但是操作整个查询,而允许在子填充上选择聚合,而不限制整个查询填充。 例如:

这个查询为每个不同的返回一行。

HAVING 子句

子句类似于对组进行操作的WHERE子句。 它通常与子句或关键字一起使用。 子句限定或取消查询选择中的特定行。 符合条件的行是那些条件表达式为真的行。

0
0 146
文章 姚 鑫 · 十一月 9, 2021 8m read

第七十一章 SQL命令 SELECT(三)

列别名

指定SELECT-ITEM时,可以使用AS关键字指定列名的别名:

SELECT Name AS PersonName, DOB AS BirthDate, ...

列别名在结果集中显示为列标题。指定列别名是可选的;始终提供默认值。列别名以指定的字母大小写显示;但是,当在ORDER BY子句中引用时,它不区分大小写。C别名必须是有效的标识符。C别名可以是分隔的标识符。使用带分隔符的标识符允许列别名包含空格、其他标点符号或作为保留名称。例如,。

As关键字不是必需的,但使查询文本更易于阅读。因此,以下也是有效的语法:

SELECT Name PersonName, DOB BirthDate, ...

SQL不执行列别名的惟一性检查。 字段列和列别名可能具有相同的名称(尽管不可取),或者两个列别名相同。 当子句引用此类非惟一列别名时,可能会导致错误。 列别名与所有SQL标识符一样,不区分大小写。

其他SELECT子句中列别名的使用由查询语义处理顺序控制。 可以通过子句中的列别名引用列。 不能在选择列表中的另一个选择项、子句、子句、子句或子句中引用列别名。 不能在操作的子句或子句中引用列别名。 但是,可以使用子查询使列别名可用来供其他这些其他子句使用。

字段列别名

选择项字段名不区分大小写。

0
0 272
文章 姚 鑫 · 十一月 8, 2021 9m read

第七十章 SQL命令 SELECT(二)

select-item

这是所有SELECT语句的必选元素。 通常,选择项指的是FROM子句中指定的表中的一个字段。 选择项由下列一个或多个项组成,多个项之间用逗号分隔:

  • 列名(字段名),带或不带表名别名:
SELECT Name,Age FROM Sample.Person

字段名不区分大小写。 但是,结果集中与字段关联的标签使用表定义中指定的SqlFieldName的字母大小写,而不是选择项中指定的字母大小写。

包含一个或多个下划线的字段名引用嵌入的串行对象属性。 例如,对于字段名,表包含一个引用字段Home,该字段引用定义属性的嵌入式串行对象。 对于字段名,该表包含一个引用字段,该字段引用嵌入式串行对象属性,该属性引用定义属性的嵌套嵌入式串行对象。 如果选择一个引用字段,如或,则以数据类型格式接收串行对象中所有属性的值。

要显示(记录),可以使用%ID伪字段变量别名,该别名显示,而不管它被分配的名称是什么。 默认情况下,的名称是,但如果存在用户定义的名为的字段, IRIS可能会重命名它。 默认情况下,是一个隐藏字段。

字段上的返回打开的对象的(对象引用):

SELECT Name,Picture FROM Sample.Employee WHERE Picture IS NOT NULL

0
0 184
文章 姚 鑫 · 十一月 7, 2021 10m read

第六十九章 SQL命令 SELECT(一)

从数据库中的一个或多个表中检索行。

大纲

[(] SELECT [%keyword]
    [DISTINCT [BY (item {,item2})] | ALL] 
    [TOP {int | ALL}]
    select-item {,select-item, ...}
    [INTO host-variable-list]
    [FROM [optimize-option] table-ref [[AS] t-alias]
      {,table-ref [[AS] t-alias]} ]
    [WHERE condition-expression [{AND | OR condition-expression] ]
    [GROUP BY scalar-expression]
    [HAVING condition-expression [{AND | OR condition-expression] ]
    [ORDER BY item-order-list [ASC | DESC] ]
[)]

select-item ::= 
  [t-alias.]*   |
  [t-alias.]scalar-expression [[AS] c-alias]
0
0 345
文章 姚 鑫 · 十一月 6, 2021 4m read

第六十八章 SQL命令 SAVEPOINT

在事务中标记一个点。

大纲

SAVEPOINT pointname

参数

  • pointname - 保存点的名称,指定为标识符。

描述

SAVEPOINT语句标记事务中的一个点。建立保存点使能够执行事务回滚到保存点,撤消在此期间完成的所有工作并释放在此期间获得的所有锁。在长期运行的事务或具有内部控制结构的事务中,通常希望能够回滚事务的一部分,而不撤消在事务期间提交的所有工作。

保存点的建立会递增$TLEVEL事务级别计数器。回滚到保存点会将事务级别计数器递减到紧接在保存点之前的值。可以在一个事务内建立最多255个保存点。超过这个保存点数量会导致致命错误,这是在SQL执行期间捕获的 异常。终端提示符将当前事务级别显示为提示符的前缀,其中是介于和之间的整数,表示当前$TLEVEL计数。

每个保存点都与一个保存点名称相关联,这是一个唯一的标识符。保存点名称不区分大小写。保存点名称可以是分隔的标识符。

  • 如果指定的保存点没有点名,或者指定的点名不是有效的标识符或SQL保留字,则会发出运行时SQLCODE-301错误。
  • 如果指定点名称以“SYS”开头的保存点,则会发出运行时错误。这些保存点名称是保留的。

保存点名称不区分大小写;因此resetpt,和是相同的点名。

0
0 148
文章 姚 鑫 · 十一月 5, 2021 4m read

第六十七章 SQL命令 ROLLBACK

回滚事务。

大纲

ROLLBACK [WORK]

ROLLBACK TO SAVEPOINT pointname

参数

  • pointname - 作为标识符指定的现有保存点的名称。

描述

ROLLBACK语句将回滚事务,撤消已执行但未提交的工作,减少$TLEVEL事务级别计数器,并释放锁。 ROLLBACK用于将数据库恢复到以前的一致状态。

  • ROLLBACK回滚当前事务期间完成的所有工作,将$TLEVEL事务级别计数器重置为0,并释放所有锁。 这会将数据库恢复到事务开始之前的状态。 和是等价的语句; 这两个版本都支持兼容性。
  • 将回滚自指定保存点以来已完成的所有工作,并按未完成的保存点的数量递减事务级别计数器。 当所有保存点都被回滚或提交,并且事务级别计数器重置为零时,事务就完成了。 如果指定的保存点不存在,或者已经回滚,将发出错误并回滚整个当前事务。

回滚到SAVEPOINT必须指定一个点名。 如果不这样做,将导致错误。

如果事务操作未能成功完成,则会发出错误。

不回滚

操作不影响以下项目:

  • 回滚不会减少默认类的计数器。 是由$INCREMENT(或)自动生成的,它维护一个独立于事务的计数。
  • 回滚不会逆转缓存查询的创建、修改或清除。 这些操作不被视为事务的一部分。
  • 在事务中发生的操作或调优表操作可以创建并运行临时例程。
0
0 338
文章 姚 鑫 · 十一月 4, 2021 9m read

第六十六章 SQL命令 REVOKE

从用户或角色中删除特权。

大纲

REVOKE admin-privilege FROM grantee 

REVOKE role FROM grantee 

REVOKE [GRANT OPTION FOR] object-privilege
       ON object-list FROM grantee [CASCADE | RESTRICT] [AS grantor] 

REVOKE [GRANT OPTION FOR] SELECT ON CUBE[S] object-list  FROM grantee 

REVOKE column-privilege (column-list) 
      ON table FROM grantee  [CASCADE | RESTRICT]

参数

  • admin-privilege - 管理员级特权或以前授予要撤销的管理员级特权的以逗号分隔的列表。 可用的syspriv选项包括16个对象定义权限和个数据修改权限。
0
0 137
文章 姚 鑫 · 十一月 3, 2021 2m read

第六十五章 SQL命令 PURGE CACHED QUERIES

删除一个或多个缓存查询。

大纲

PURGE [CACHED] QUERIES

PURGE [CACHED] QUERIES BY AGE n

PURGE [CACHED] QUERIES BY TABLE table-name

PURGE [CACHED] QUERIES BY NAME class-name [, class-name]

参数

  • n - 自上次使用缓存查询以来的整数天数,指定为带引号的字符串。
  • table-name - 存在缓存查询的现有表的名称。 表名可以是限定的(schema.table),也可以是非限定的(table)。 非限定表名接受默认模式名。
  • - 缓存的查询类名称或以逗号分隔的缓存查询类名称列表。 缓存的查询类名是区分大小写的。

描述

命令删除指定范围内定义的缓存查询:

  • 清除当前名称空间中的所有缓存查询。
  • PURGE CACHED QUERIES BY AGE n清除当前名称空间中最近n天内未使用(准备)的所有缓存查询。 指定n值为0将清除当前名称空间中的所有缓存查询。
  • PURGE CACHED QUERIES BY TABLE TABLE -name清除引用指定表的所有缓存查询。 如果查询引用了几个表,则会生成一个缓存查询,并为每个表列出一个查询。 对这些表中的任何一个发出
0
0 204
文章 姚 鑫 · 十一月 2, 2021 5m read

第六十四章 SQL命令 ORDER BY(二)

示例

下面的示例按照RowID的反向顺序对记录进行排序:

SELECT %ID,Name
FROM Sample.Person
ORDER BY %ID DESC

下面两个示例展示了在ORDER BY子句中指定排序列的不同方法。 下面两个查询是等价的; 第一种方法使用列名作为排序项,第二种方法使用列号(选择项列表中项目的序号):

SELECT Name,Age,Home_State
FROM Sample.Person
ORDER BY Home_State,Age DESC
SELECT Name,Age,Home_State
FROM Sample.Person
ORDER BY 3,2 DESC

下面的示例按包含IRIS列表数据的字段进行排序。 因为IRIS列表是一个以格式化字符开始的编码字符串,所以本例使用$LISTTOSTRING来按实际字段数据值排序,而不是按列表元素编码:

SELECT Name,FavoriteColors
FROM Sample.Person
WHERE FavoriteColors IS NOT NULL
ORDER BY $LISTTOSTRING(FavoriteColors)

动态SQL可以使用输入参数为ORDER BY子句提供文字值; 它不能使用输入参数来提供字段名、字段别名、字段号或排序关键字。

0
0 115
文章 姚 鑫 · 十一月 1, 2021 8m read

第六十三章 SQL命令 ORDER BY(一)

指定结果集中行排序的SELECT子句。

大纲

ORDER BY ordering-item [ASC | DESC]{,ordering-item [ASC | DESC] ...}

参数

  • ordering-item - 决定排序顺序的文字。 列名、列别名或列号。 ORDER BY子句可以包含单个排序项或以逗号分隔的排序项列表,以指定排序层次结构。
  • ASC DESC - 可选-按升序()或降序(DESC)排序。 默认为升序。

描述

子句根据指定列的数据值或以逗号分隔的列序列对查询结果集中的记录进行排序。 该语句对单个结果集进行操作,这些结果集要么来自语句,要么来自多个语句的。

按逻辑(内部存储)数据值对记录进行排序,而不考虑当前的选择模式设置。

子句是SELECT语句中的最后一个子句。 它出现在FROM、、和子句之后。 以错误的顺序指定SELECT子句将产生错误。

如果语句没有指定子句,则返回的记录顺序是不可预测的。

如果SELECT语句指定了和子句,则作行的返回的记录将与子句中指定的顺序一致。 为例。 返回中年龄最大的5行数据,按从老到小的顺序排列。

在列表中执行窗口函数(包括窗口函数自己的子句)之后应用子句。 因此,窗口函数返回的值不受查询的子句的影响。

限制

如果查询指定了子句,则生成的数据是不可更新的。

0
0 162
文章 姚 鑫 · 十月 31, 2021 2m read

第六十二章 SQL命令 OPEN

打开游标。

大纲

OPEN cursor-name

参数

  • cursor-name - 游标的名称,已经声明过了。 游标名称是在DECLARE语句中指定的。 游标名称区分大小写。

描述

OPEN语句根据游标的DECLARE语句中指定的参数打开游标。 一旦打开,就可以获取游标。 打开的游标必须关闭。

  • 试图打开未声明的游标会出现SQLCODE -52错误。
  • 试图打开已经打开的游标会导致错误。
  • 试图获取或关闭未打开的游标将导致错误。

成功的设置,即使结果集是空的。

作为语句,这只在嵌入式中支持。 通过ODBC使用支持等价的操作。

示例

下面的嵌入式SQL示例显示了一个正在打开和关闭的游标(名为):

ClassMethod Open()
{
	s name = "LastName,FirstName",state = "##"
	&sql(
		DECLARE EmpCursorO CURSOR FOR 
			SELECT Name, Home_State
			INTO :name, :state FROM Sample.Person
			WHERE Home_State %STARTSWITH 'A'
	)
	w !,"BEFORE: Name=",name," State=",state 
	&sql(OPEN EmpCursorO)
	if SQLCODE '= 0 { 
		w "打开错误: ",SQLCODE
	    q 
	}
	n %ROWCOUNT,%ROWID
	for { 
		&sql(FETCH EmpCursorO)
		q:SQLCODE  
		w !,"DURING: Name=",name," State=",state 
	}
	w !,"FETCH status SQLCODE=",SQLCODE
	w !,"获取的行数 = ",%ROWCOUNT
	&sql(CLOSE EmpCursorO)
	w !,"AFTER: Name=",name," State=",state
}
0
0 188
文章 姚 鑫 · 十月 30, 2021 5m read

第六十一章 SQL命令 LOCK

锁表

大纲

LOCK [TABLE] tablename IN EXCLUSIVE MODE [WAIT seconds]

LOCK [TABLE] tablename IN SHARE MODE [WAIT seconds]

参数

  • tablename - 要锁定的表的名称。 Tablename必须是已经存在的表。 表名可以是限定的(schema.table),也可以是非限定的()。 非限定表名接受默认模式名。 模式搜索路径被忽略。
  • / - IN EXCLUSIVE MODE关键字短语创建一个常规的IRIS锁。 关键字短语创建一个共享的IRIS锁。
  • - 可选-一个整数,指定在超时前尝试获取锁的秒数。 如果省略,则应用系统默认超时时间。

描述

和是同义词。

命令显式锁定SQL表。 此表必须是已存在的表,对其具有必要的特权。 如果是一个不存在的表,LOCK会失败并出现编译错误。 如果是临时表,则命令执行成功,但不执行任何操作。 如果是视图,则命令失败,并出现错误。

命令用来反转操作。 显式LOCK将保持有效,直到针对同一模式发出显式,或者直到进程终止。

可以使用多次锁定一个表; 必须显式解锁表,解锁次数为表被显式锁定的次数。 每个必须指定与相应LOCK相同的模式。

权限

LOCK命令是一个特权操作。 在使用之前,进程必须对指定的表拥有

0
0 210
文章 姚 鑫 · 十月 29, 2021 5m read

第六十章 SQL命令 JOIN(二)

单向外部联接

IRIS支持单向外部联接:左外部联接和右外部联接。

使用标准的“inner”联接时,当一个表的行链接到第二个表的行时,第一个表中找不到第二个表中对应行的行将从输出表中排除。

使用单向外联接时,即使第二个表中没有匹配项,第一个表中的所有行也会包括在输出表中。使用单向外连接,第一个表会从第二个表中取出相关信息,但不会因为第二个表中缺少匹配项而牺牲自己的行。

例如,如果查询首先列出Table1并创建一个左外部联接,那么它应该能够看到Table1中的所有行,即使它们在Table2中没有对应的记录。

在指定单向外联接时,在子句中命名表的顺序非常重要。对于左外部联接,指定的第一个表是联接的源表。对于右外部联接,指定的第二个表是联接的源表。因此,或%STARTTABLE优化关键字不能与一起使用。以下语法相互矛盾,导致错误:。

外部联接语法

IRIS支持两种表示外连接的格式:

  1. ANSI标准语法:LEFT OUTER JOINRIGHT OUTER JOIN。SQL标准语法将外联接放在语句的子句中,而不是子句中,如下例所示:
  1. ODBC规范外部联接扩展语法,使用转义语法{OJ Join-Expression},其中Join-Expression
0
0 115
文章 姚 鑫 · 十月 28, 2021 7m read

第五十九章 SQL命令 JOIN(一)

基于两个表中的数据创建表的SELECT子句。

大纲

table1 [[AS] t-alias1] CROSS JOIN table2 [[AS] t-alias2] |
table1 [[AS] t-alias1] , table2 [[AS] t-alias2]

 table1 [[AS] t-alias1]
NATURAL [INNER] JOIN |
NATURAL LEFT [OUTER] JOIN |
NATURAL RIGHT [OUTER] JOIN |
table2 [[AS] t-alias2] 

table1 [[AS] t-alias1]
[INNER] JOIN |
LEFT [OUTER] JOIN |
RIGHT [OUTER] JOIN |
FULL [OUTER] JOIN
table2 [[AS] t-alias2] 
ON condition-expression

table1 [[AS] t-alias1]
[INNER] JOIN |
LEFT [OUTER] JOIN |
RIGHT [OUTER] JOIN |
table2 [[AS] t-alias2] 
USING (identifier-commalist)

(上述联接语法用于SELECT语句FROM子句。

0
0 123
文章 姚 鑫 · 十月 27, 2021 2m read

第五十八章 SQL命令 %INTRANSACTION

显示事务状态。

大纲

%INTRANSACTION
%INTRANS

参数

描述

%INTRANSACTION语句设置SQLCODE以指示事务状态:

  • 如果当前在事务中,则SQLCODE=0
  • 如果不在事务中,则SQLCODE=100

事务正在进行时,%INTRANSACTION返回。此事务可以是由START TRANSACTION或发起的SQL事务。它也可以是由发起的事务。

事务嵌套对没有影响。对%INTRANSACTION没有影响。

还可以使用确定事务状态。仅指示事务是否正在进行。指示事务是否正在进行以及当前的事务级别数。

示例

以下嵌入式SQL示例显示如何设置:

ClassMethod %INTRANSACTION()
{
	n SQLCODE
	&sql(%INTRANSACTION)
	w "Before %INTRANS SQLCODE=",SQLCODE," TL=",$TLEVEL,!
	&sql(SET TRANSACTION %COMMITMODE EXPLICIT)
	n SQLCODE
	&sql(%INTRANSACTION)
	w "SetTran %INTRANS SQLCODE=",SQLCODE," TL=",$TLEVEL,!
	&sql(START TRANSACTION)
	n SQLCODE
	&sql(%INTRANSACTION)
	w "StartTran %INTRANS SQLCODE=",SQLCODE," TL=",$TLEVEL,!
	&sql(SAVEPOINT a)
	n SQLCODE
	&sql(%INTRANSACTION)
	w "Savepoint %INTRANS SQLCODE=",SQLCODE," TL=",$TLEVEL,!
	&sql(ROLLBACK TO SAVEPOINT a)
	n SQLCODE
	&sql(%INTRANSACTION)
	w "Rollback to Savepoint %INTRANS SQLCODE=",SQLCODE," TL=",$TLEVEL,!
	&sql(COMMIT)
	n SQLCODE
	&sql(%INTRANSACTION)
	w "After Commit %INTRANS SQLCODE=",SQLCODE," TL=",$TLEVEL
}
0
0 187
文章 姚 鑫 · 十月 26, 2021 8m read

第五十七章 SQL命令 INTO

一个SELECT子句,指定在宿主变量中存储选定的值。

大纲

INTO :hostvar1 [,:hostvar2]...

参数

  • :hostvar1 - 在宿主语言中声明的输出宿主变量。 当在INTO子句中指定时,变量名前面加冒号(:)。 主机变量可以是局部变量(非下标或下标)或对象属性。 可以将多个变量指定为逗号分隔的列表、单个下标数组变量或逗号分隔的列表和单个下标数组变量的组合。

描述

INTO子句和主机变量仅在嵌入式SQL中使用。它们不在动态SQL中使用。在动态SQL中,类为输出变量提供了类似的功能。在通过、或动态SQL处理的查询中指定子句会导致错误。

子句可以在、DECLARE或语句中使用。子句对于所有三个语句都是相同的;本页上的示例都引用语句。

子句使用在列表中检索(或计算)的值来设置相应的输出主机变量,从而使这些返回的数据值可用于ObjectScript。在中,可选子句出现在列表之后、子句之前。

注意:编译嵌入式SQL时,输出主机变量将初始化为空字符串。这可以防止在执行时出现错误。因此,只有当时,主机变量才包含有意义的值。在使用输出主机变量值之前,请始终检查SQLCODE。当或为负数时,不要使用这些变量值。

主机变量

主机变量只能包含单个值。因此,嵌入式SQL中的只检索一行数据。

0
0 144
文章 姚 鑫 · 十月 25, 2021 7m read

第五十六章 SQL命令 INSERT OR UPDATE

在表中添加新行或更新表中的现有行。

大纲

INSERT OR UPDATE [%keyword] [INTO] table
          SET column = scalar-expression {,column2 = scalar-expression2} ...  |
          [ (column{,column2} ...) ] VALUES (scalar-expression {,scalar-expression2} ...)  |
          VALUES :array()  |
          [  (column{,column2} ...) ] query  |
          DEFAULT VALUES

参数

  • %keyword - 可选-以下一个或多个关键字选项,以空格分隔:%NOCHECK%NOFPLAN、、、、、、。
  • - 要对其执行插入操作的表或视图的名称。此参数可以是子查询。关键字是可选的。
  • column - 可选-与提供的值列表顺序对应的列名或以逗号分隔的列名列表。如果省略,值列表将按列号顺序应用于所有列。
  • - 为相应列字段提供数据值的标量表达式或以逗号分隔的标量表达式列表。
  • :array()
0
0 252
文章 姚 鑫 · 十月 24, 2021 4m read

第五十五章 SQL命令 INSERT(四)

嵌入式SQL和动态SQL示例

下面的嵌入式SQL示例创建一个新表SQLUser.MyKids。下面的示例使用INSERT用数据填充此表。在插入示例之后,提供了一个删除的示例。

ClassMethod Insert2()
{
	&sql(
		CREATE TABLE SQLUser.MyKids 
		(
			KidName VARCHAR(16) UNIQUE NOT NULL,
			KidDOB INTEGER NOT NULL,
			KidPetName VARCHAR(16) DEFAULT 'no pet'
		) 
	)
	if SQLCODE=0 {
		w !,"创建的表" 
	} elseif SQLCODE=-201 {
		w !,"表已存在"  
		q
	} else {
		w !,"CREATE TABLE失败。SQLCODE=",SQLCODE 
	}
}

下面的嵌入式示例插入具有两个字段值的行(第三个字段采用默认值)。请注意,表架构名称由#SQLCompile Path

0
0 143
文章 姚 鑫 · 十月 23, 2021 12m read

第五十四章 SQL命令 INSERT(三)

SQLCODE错误

默认情况下,INSERT是要么全有要么全无的事件:要么完全插入行,要么根本不插入行。 IRIS返回一个状态变量SQLCODE,指示插入是成功还是失败。要将行插入到表中,插入操作必须满足所有表、字段名和字段值要求,如下所示。

表:

  • 该表必须已经存在。尝试插入到不存在的表会导致SQLCODE-30错误。
  • 不能将该表定义为READONLY。尝试编译引用ReadOnly表的插入会导致错误。请注意,此错误是在编译时发出的,而不是在执行时发出的。
  • 如果通过视图更新表,则不能将该视图定义为只读。尝试这样做会导致错误。如果视图基于分割表,则不能通过使用定义的视图进行插入。尝试这样做会导致SQLCODE-35,其中不允许基于带有选项条件的切片表的视图()使用。
  • 必须具有适当的权限才能插入表

字段名称:

  • 该字段必须存在。尝试插入不存在的字段会导致错误。
  • 插入必须指定所有必填字段。尝试插入行而不为必填字段指定值会导致错误。
  • 插入不能包含重复的字段名称。尝试插入包含两个同名字段的行会导致错误。
  • 插入不能包含定义为的字段。尝试编译引用字段的插入会导致错误。请注意,此错误现在在编译时发出,而不是仅在执行时发出。使用链接表向导链接表时,可以选择将字段定义为只读。
0
0 246
文章 姚 鑫 · 十月 22, 2021 6m read

第五十三章 SQL命令 INSERT(二)

流数据

可以将以下类型的数据值插入到流字段中:

  • 对于任何表:字符串文字或包含字符串文字的主机变量,例如:
    set literal="Technique 1"

    //do the insert; use a string
    &sql(INSERT INTO MyStreamTable (MyStreamField) VALUES (:literal))
  • 对于非切片表:对流对象的对象引用(OREF)。 IRIS打开此对象并将其内容复制到新的流字段中。例如:
    set oref=##class(%Stream.GlobalCharacter).%New()
    do oref.Write("Technique non-shard 1")

    //do the insert; use an actual OREF
    &sql(INSERT INTO MyStreamTable (MyStreamField) VALUES (:oref))

或流的OREF的字符串版本,例如:

    set oref=##class(%Stream.GlobalCharacter).%New()
    do oref.Write("Technique non-shard 2")

    //next line converts OREF to a string OREF
    set string=oref_""

    //do the insert
    &sql(INSERT INTO MyStreamTable (MyStreamField) VALUES (:string))
0
0 150
文章 姚 鑫 · 十月 21, 2021 10m read

第五十二章 SQL命令 INSERT(一)

向表中添加新行(或多行)。

大纲

INSERT [%keyword] [INTO] table
          SET column1 = scalar-expression1 
                 {,column2 = scalar-expression2} ...  |
          [ (column1{,column2} ...) ] 
                 VALUES (scalar-expression1 {,scalar-expression2} ...)  |
          VALUES :array()  |
          [ (column1{,column2} ...) ] query  |
          DEFAULT VALUES

参数

  • %keyword - 可选参数:%NOCHECK%NOFPLAN, , , , , , 。
  • - 要对其执行插入操作的表或视图的名称。此参数可以是子查询。关键字是可选的。表名(或视图名)可以是限定的(schema.table),也可以是不限定的()。使用架构搜索路径(如果提供)或默认架构名称将非限定名称与其架构匹配。
0
0 296
文章 姚 鑫 · 十月 20, 2021 6m read

第五十一章 SQL命令 HAVING(二)

In和%INLIST谓词

IN谓词用于将值与一系列非结构化的项进行匹配。

%INLIST谓词是 IRIS扩展,用于将值与列表结构的元素进行匹配。

使用任一谓词,都可以执行相等比较和子查询比较。

在中有两种格式。第一个用作使用与OR运算符链接在一起的多个相等比较的速记。例如:

SELECT Name, Home_State FROM Sample.Person
GROUP BY Home_State
HAVING Home_State IN ('ME','NH','VT','MA','RI','CT')

如果Home_State等于括号列表中的任意值,则计算为TRUE。列表元素可以是常量或表达式。排序规则适用于IN比较,因为它适用于相等性测试。默认情况下,比较使用字段定义的排序规则类型;默认情况下,字符串字段定义为,不区分大小写。

当日期或时间用于IN谓词相等比较时,会自动执行适当的数据类型转换。如果子句字段是类型,则DATE或类型的值将转换为。如果子句字段为类型,则或类型的值将转换为。如果子句字段为TIME类型,则或类型的值将转换为。

下面的示例都执行相同的相等比较并返回相同的数据。 字段指定对于每个成功的相等比较只返回一条记录。 字段的数据类型为:

SELECT Name,DOB FROM Sample.Person 
GROUP BY DOB
HAVING DOB IN ({d '2014-01-02'},{d '1990-04-25'})
0
0 136
文章 姚 鑫 · 十月 19, 2021 5m read

第五十章 SQL命令 HAVING(一)

对一组数据值指定一个或多个限制性条件的SELECT子句。

大纲

SELECT field
FROM table
GROUP BY field
HAVING condition-expression

SELECT aggregatefunc(field %AFTERHAVING)
FROM table
[GROUP BY field]
HAVING condition-expression

参数

  • condition-expression - 由一个或多个布尔谓词组成的表达式,用于控制要检索哪些数据值。

描述

可选的HAVING子句出现在子句、可选的WHERE和子句之后,可选的子句之前。

语句的子句限定或取消查询选择中的特定行。符合条件的行是条件表达式为真的行。条件表达式是一系列逻辑测试(谓词),它们可以通过和逻辑运算符链接起来。

子句类似于子句,它可以在组上操作,而不是在整个数据集上操作。因此,在大多数情况下,HAVING子句要么与使用关键字的聚合函数一起使用,要么与子句结合使用,或者两者兼而有之。

子句条件表达式还可以指定聚合函数。子句条件表达式不能指定聚合函数。下面的示例显示了这一点:

SELECT Name,Age,AVG(Age) AS AvgAge
FROM Sample.Person
HAVING Age > AVG(Age)
ORDER BY Age

image

0
0 185