我正在参加 Joel Solon 讲授的“使用 InterSystems Objects 和 SQL 进行开发”课程。 课程非常好,我将在这里分享一些从培训中总结的提示。 第 3 天的提示: 1. 您可以使用 %Dictionary 类查看类目录,并在 INFORMATION_SCHEMA 表中查看 sql 对象。 2. 可以在 ObjectScript 方法中以动态 SQL 或嵌入式 SQL 使用 SQL。 3. 您可以使用 ?(例如:where country = ?)将参数传递到动态 SQL 字符串, 使用冒号(例如:where country = :variable)将参数传递到嵌入式 SQL。 4. 动态 SQL 示例(来自 Intersystems 文档):
SET tStatement = ##class(%SQL.Statement).%New(,"Sample")
  SET myquery = 3
  SET myquery(1) = "SELECT TOP ? Name,DOB,Home_State"
  SET myquery(2) = "FROM Person"
  SET myquery(3) = "WHERE Age > 60 AND Age < 65"
  SET qStatus = tStatement.%Prepare(.myquery)
   IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
  DO tStatement.%Display()
  WRITE !,"End of %Prepare display"
5. 嵌入式 SQL 示例(来自 Intersystems 文档):
#SQLCompile Select=Display
   &sql(SELECT DOB INTO :a FROM Sample.Person)
      IF SQLCODE<0 {WRITE "SQLCODE error ",SQLCODE," ",%msg  QUIT}
      ELSEIF SQLCODE=100 {WRITE "Query returns no results"  QUIT}
   WRITE "1st date of birth is ",a,!
   DO $SYSTEM.SQL.Util.SetOption("SelectMode",1)
   WRITE "changed select mode to: ",$SYSTEM.SQL.Util.GetOption("SelectMode"),!
   &sql(SELECT DOB INTO :b FROM Sample.Person)
   WRITE "2nd date of birth is ",b
6. 嵌入式 SQL 示例 - 插入:
&sql(INSERT INTO Sample.Person (Name, Age, Phone) VALUES (:name, :age, :phone)
7. 如果您需要使用 SQL 批量处理数据,处理单个记录,请使用 Persistent Object API。 8. 您可以创建 SQLQuery 方法,如果在方法中使用 [SqlProc],将在 SQL 端中创建一个 SQL 存储过程。 9. 从终端可以进入 SQL Shell,要从终端进入 SQL 命令,请执行 do $system.SQL.Shell()。 10. 持久类具有系统生成的 ID,如果需要由您控制的 ID,您可以使用具有一个或多个属性的 IDKEY 索引。 例如,SocialNumber [IdKey, PrimaryKey, Unique] 上的索引键。 11. 当两个或多个进程同时尝试处理相同数据时,有两种控制并发的策略:悲观型和乐观型。 12. 要获取悲观控制,请使用 %OpenId(ID, 4) 锁定对象,其中 4 会将表锁定为互斥访问。 在进程运行后,可以释放锁定。 13. 要进行乐观控制(针对 Web 应用),在您的持久类中创建 Parameter VERSIONPROPERTY = "Version"; Property Version as %Integer [ InitialExpression = 1 ]。 IRIS 会在每次实例更新时递增属性版本,这样可以协调更新顺序,而不是锁定表。 14. 当您有更新、插入或删除数据的方法时,请使用事务保持数据一致。 示例:
Transfer(from,to,amount)   // Transfer funds from one account to another
{
   TSTART
    &SQL(UPDATE A.Account
        SET A.Account.Balance = A.Account.Balance - :amount
        WHERE A.Account.AccountNum = :from)
    If SQLCODE TRollBack  Quit "Cannot withdraw, SQLCODE = "_SQLCODE
    &SQL(UPDATE A.Account
        SET A.Account.Balance = A.Account.Balance + :amount
        WHERE A.Account.AccountNum = :to)
    If SQLCODE TROLLBACK  QUIT "Cannot deposit, SQLCODE = "_SQLCODE
    TCOMMIT
    QUIT "Transfer succeeded"
}
15. InterSystems IRIS 的架构基于命名空间(数据库的逻辑组)和数据库。 16. 要在数据库中保存的数据有两种类型:数据(global)和代码(源代码 - 过程)。 17. 您可以使用 ECP(企业缓存协议)对数据库进行水平处理扩展,这样可以在同一命名空间访问查看多个服务器中不同的数据库。 18. 您可以使用Sharding(仅限 IRIS)进行水平数据量扩展(分布式数据库分区),这样可以将数据分区到分布式节点(如 MongoDB)。 19. 数据库的最大容量是 32TB。 20. 要从一个命名空间更改为另一个命名空间,请执行 zn "Namespace" 或 set $namespace = "Namespace"。   PS 1:课程详细展示了如何进行事务控制,这非常重要。 明天我会发布第 4 天的总结。