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

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

嵌入式SQL和动态SQL示例

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

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 
    }
}

下面的嵌入式SQL示例插入具有两个字段值的行(第三个字段KidPetName采用默认值)。请注意,表架构名称由#SQLCompile Path宏指令作为架构搜索路径提供:

ClassMethod Insert3()
{
    #SQLCompile Path = Sample
    n SQLCODE,%ROWCOUNT,%ROWID
    &sql(
        INSERT INTO MyKids 
        (
            KidName, KidDOB
        ) 
        VALUES 
        (
            'Molly', 60000
        )
    )
    if SQLCODE = 0 {
        w !,"插入成功"
        w !,"Row count=",%ROWCOUNT
        w !,"Row ID=",%ROWID
        q 
    } elseif SQLCODE = -119 {
        w !,"未写入重复记录",!
        w %msg,!
        q 
    } else {
        w !,"插入失败,SQLCODE=",SQLCODE 
    }
}

下面的嵌入式SQL示例使用表的列顺序插入具有三个字段值的行:

ClassMethod Insert4()
{

    n SQLCODE,%ROWCOUNT,%ROWID
    &sql(
        INSERT INTO SQLUser.MyKids VALUES ('Josie','40100','Fido') 
    )
    if SQLCODE = 0 {
        w !,"插入成功"
        w !,"Row count=",%ROWCOUNT
        w !,"Row ID=",%ROWID
        q 
    } elseif SQLCODE = -119 {
        w !,"未写入重复记录",!
        w %msg,!
        q 
    } else {
        w !,"插入失败,SQLCODE=",SQLCODE 
    }
}

下面的嵌入式SQL示例使用主机变量插入具有两个字段值的行。这里使用的插入语法指定了COLUMN=VALUE对:

ClassMethod Insert5()
{
    #SQLCompile Path=Sample
    n SQLCODE,%ROWCOUNT,%ROWID
    s x = "Sam"
    s y = "57555"
    &sql(
        INSERT INTO MyKids 
        SET 
            KidName = :x, KidDOB = :y 
    )
    if SQLCODE = 0 {
        w !,"插入成功"
        w !,"Row count=",%ROWCOUNT
        w !,"Row ID=",%ROWID
        q 
    } elseif SQLCODE = -119 {
        w !,"未写入重复记录",!
        w %msg,!
        q 
    } else {
        w !,"插入失败,SQLCODE=",SQLCODE 
    }
}

下面的嵌入式SQL示例使用主机变量数组插入具有三个字段值的行。数组元素按列顺序编号。请注意,用户提供的数组值以myarray(2)开头;第一个数组元素对应于RowID列,该列是自动提供的,不能由用户定义:

ClassMethod Insert6()
{
    #SQLCompile Path=Sample
    n SQLCODE, %ROWCOUNT, %ROWID
    s myarray(2) = "Deborah"
    s myarray(3) = 60200
    s myarray(4) = "Bowie"
    &sql(
        INSERT INTO MyKids VALUES :myarray()
    )
    if SQLCODE = 0 {
        w !,"插入成功"
        w !,"Row count=",%ROWCOUNT
        w !,"Row ID=",%ROWID
        q 
    } elseif SQLCODE = -119 {
        w !,"未写入重复记录",!
        w %msg,!
        q 
    } else {
        w !,"插入失败,SQLCODE=",SQLCODE 
    }
}

下面的动态SQL示例使用%SQL.Statement类插入具有三个字段值的行。请注意,表架构名称在%New()方法中作为架构搜索路径提供:

ClassMethod Insert7()
{
    s x = "Noah"
    s y = "61000"
    s z = "Luna"
    s sqltext = "INSERT INTO MyKids (KidName,KidDOB,KidPetName) VALUES (?,?,?)"
    s tStatement = ##class(%SQL.Statement).%New(0,"Sample")
    s qStatus = tStatement.%Prepare(sqltext)
    if qStatus '= 1 {
        w "%Prepare failed:" 
        d $System.Status.DisplayError(qStatus) 
        q
    }
    s rtn = tStatement.%Execute(x, y, z)
    if rtn.%SQLCODE = 0 {
        w !,"插入成功"
        w !,"Row count=",rtn.%ROWCOUNT
        w !,"Row ID=",rtn.%ROWID 
    } elseif rtn.%SQLCODE = -119 {
        w !,"未写入重复记录",!,rtn.%Message
        q 
    } else {
        w !,"插入失败,SQLCODE=",rtn.%SQLCODE 
    }
}

下面的嵌入式SQL示例显示插入的记录,然后删除SQLUser.MyKids表:

ClassMethod Insert8()
{
    s myquery = "SELECT * FROM SQLUser.MyKids"
    s tStatement = ##class(%SQL.Statement).%New()
    s qStatus = tStatement.%Prepare(myquery)
    if qStatus '= 1 {
        w "%Prepare failed:" 
        d $System.Status.DisplayError(qStatus) 
        q
    }
    s rset = tStatement.%Execute()
    d rset.%Display()
    w !,"End of data"
    &sql(DROP TABLE SQLUser.MyKids)
    if SQLCODE = 0 {
        w !,"Deleted table"
        q 
    } else {
        w !,"Table delete failed, SQLCODE=",SQLCODE 
    }
}

DHC-APP>d ##class(PHA.TEST.SQLCommand).Insert8()
KidName KidDOB  KidPetName
Molly   60000   no pet
Josie   40100   Fido
Sam     57555   no pet
Deborah 60200   Bowie
Noah    61000   Luna
 
5 Rows(s) Affected
End of data
Deleted table

下面的嵌入式SQL示例演示了主机变量数组的使用。请注意,对于主机变量数组,可以使用带有未指定最后一个下标的动态本地数组来传递要在运行时插入的值数组。例如:

ClassMethod Insert9()
{
  n SQLCODE,%ROWCOUNT,%ROWID
  &sql(INSERT INTO Sample.Employee VALUES :emp('profile',))
  w !,"SQL Error code: ",SQLCODE," Row Count: ",%ROWCOUNT
}

使插入的“Employee”行中的每个字段设置为:

emp("profile",col)

其中,“col”Sample.Employee表中字段的列号。

下面的示例显示如何将SELECT查询的结果用作INSERT语句的数据输入,从而为多行提供数据:

INSERT INTO StudentRoster (NAME,GPA,ID_NUM)
     SELECT FullName,GradeAvg,ID
     FROM temp WHERE SchoolYear = '2004'
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容