PowerScript支持在脚本中使用标准的嵌入式SQL和动态SQL语句。还支持在SQL语句中使用数据库管理系统的语句、函数和保留字。

在SQL中任何地点都可以使用常量和任何合法的变量,但使用变量时必须在变量名前加冒号,多个变量或常量用逗号分隔,例如 :

INSERT INTO EMPLOYEE( SALARY,AGE ) VALUES ( 18900, 30);

INSERT INTO EMPLOYEE ( SALARY, AGE) VALUES( :Sal_var,:Age_var);

PowerBuilder 支持指示变量(indicator variable),在检索数据库后可以使用指示变量判断返回的数据是否空值或者发生了转换错误。例如下面是未加指示变量的情况:

            :Name, :Address , :City

下面是在上一行中加入指示变量后的情况:

            :Name :IndvName,:Address :IndvAddress,:City :IndvCity

其中在变量名后用空格为分隔的为该变量的指示变量。

指示变量保存的是一个Integer型整数,0表示有意义的发空值,-1表示空值 -2表示转换错误。

脚本中,可以通过检测事务对象的SQLCode属性,判断SQL语句对数据库操作是否成功,进行错误处理。SQLCode的属性值及意义如下表所示:

   

   

0

成功

100

检索行未找到

-1

语句错误,用SQLErrText或SQLDBCode获取详情

可以在脚本和函数中编写SQL语句。创建标准SQL语句需要先说明作用域为Global,Instance,Shared或者Local型的游标或过程,其方法与说明变量相同。

COMMIT

COMMIT语句的语法格式为:

COMMIT [USING TransactionObject];

TransactionObject代表自上一次COMMIT、ROLLBACK或者CONNECT操作以来的需要永久更新的数据库操作的事物对象的名称。该子句仅在操纵除默认事务对象(SQLCA)以外的事务对象的需要。该语句会关闭所有的游标和过程,但不会引起连接中断。

CONNECT

CONNECT语句的语法格式为:

CONNECT [USING TransactionObject];

TransactionObject代表包含数据库连接信息事务对象名称。连接默认事务对象SQLCA,在对数据库进行任何的操作之前,必须首先使用CONNECT语句连接数据库。

DELETE

DELETE删除某事务对象中的表中的数据。其语法格式为:

DELETE FROM TableName WHERE Criteria

[USING TransactionObject];

TableName代表将要删除的数据的持有表,Criteria指明删除的标准,USING TransectionObject指明使用的事务对象,缺省表示使用SQLCA。

删除游标中当前数据和与之对应的表中的数据,可以使用下面的DELETE语句。

DELETE FROM TableName WHERE CURRENT OF CursorName

TableName是持有要删除数据的表的标识符,CursorName是与之对应的游标名。

DBMS-specific    并不是所有的DBMS都支持DELETE Where Current of Cursor语句。

DISCONNECT

DISCONNECT首先执行COMMIT语句,然后与数据库解除连接。其语法格式为:

DISCONNECT [USING TransactionObject];

INSERT

INSERT语句在数据库中插入一条记录。其语法格式为:

INSERT INTO TableName(FieldName[,...])

VALUES (ValueOfField[,...])

 ROLLBACK

ROLLBACK语句表示放弃自上一个COMMIT、ROLLBACK或者CONNECT语句以来的所有数据库操作,并关闭所有的游标和过程。其语法格式为:

ROLLBACK [USING TransactionName];

其中TransactionObject代表在使用非默认事务对象时的事务对象名。

SELECT

SELECT语句检索一条记录,如果找到多于一条的记录,则发生错误。其语法格式为:

SELECT FieldOFTableList

INTO VariableList

FROM TableName

WHERE Criteria

[USING TransactionObject];

其中FieldOFTableList代表接收数据的变量名列表,TableName代表被检索的表名,Criteria是检索条件,TransactionObject代表在使用非默认事务对象时的事务对象名。

SELECTBLOB

SELECTBLOB检索blob型数据,找到多条符和查询条件的数据时,事务对象状态属性将指明错误。其句法为:

SELECTBLOB BlobFieldOFTableList

INTO VariableList

FROM TableName

WHERE Criteria

[USING TransactionObject];

其中FieldOFTableList代表blob型字段名列表,VariableList代表接受数据的blob变量名列表,TableName代表被检索的表名,Criteria是检索条件,TransactionObject代表在使用非默认事务对象时的事务对象名。

UPDATE

UPDATE修改指定的数据,其句法为:

UPDATE TableName

SET FieldName = VarName

WHERE Criteria

[USING TransactionObject];

用下面的UPDATE语句可以修改与游标当前所指对应的记录,其句法为:

UPDATE TableName

SET FieldName = VarName

WHERE CURRENT OF CurSortName;

[USING TransactionObject];

TransactionObject是包含需要接触连接数据库信息的事务对象。

UPDATEBLOB

UPDATEBLOB语句修改blob型数据。格式为:

UPDATEBLOB TableName

SET BlobColumn = BlobVariable

WHERE Criteria

[USING TransactionObject];

其中Tablename指需修改blob所在的表,BlobColumn指blob数据所在的列名,BlobVariable代表包含blob数据的变量。

OPEN Cursor

OPEN语句打开了说明的游标,并执行了相应的SQL语句。其语法格式为:

OPEN CursorName;

其中CursorName代表游标名。

INSERT

INSERT语句在数据库中插入一条记录。其语法格式为:

INSERT INTO TableName(FieldName[,...])

VALUES (ValueOfField[,...])

[USING TransactionObject];

FETCH

FETCH语句从游标或者过程中读取当前的记录,并把它们存储在指定的变量当中。数据库支持的情况下,用户还可以使用FETCH FIRST、FETCH PRIOR或FETCH LAST语句。FETCH语句的语法格式为:

FETCH Cursorname | Procedure INTO HostVariableList;

其中HostVariableList代表存储数据库记录的变量列表。

EXECUTE

EXECUTE语句执行一个已说明的过程,在这里不需要指明事务对 象,因为在说明过程时事务对象已经指明。EXECUTE的语法格式为:

EXECUTE ProcedureName;

其中ProcedureName指明要求执行的过程的名字。

DECLARE Procedure

DECLARE Procedure语句的语法格式为:

DECLARE ProcedureName PROCEDURE FOR

StoredProcedureName

@Praram1 = Value1 , @Param2 = Value2 , ......

[USING TransactionObject];

ProcedureName代表过程名,可以使用任何PowerBuilder接受的标识符,StoredProcedureName 代表数据库中保存的过程,@Praram1是StoredProcedureName过程的参数,在@Praram1后的VALUE1是它的初始化值,USING TransactionObject子句指明引用的事务对象,如果缺省该子句,表示使用默认事务对象SQLCA。

DECLARE Cursor

DECLARE Cursor语句的语法格式为:

DECLARE CursorNsme CURSOR FOR SelectStatement

[USING TransactionObject];

CursorName代表游标名,可以使用任何有效的PowerBuilder标识符。SelectStatement代表SELECT语句。除使用默认事务对象SQLCA外的事务对象需要使用USING TransectionObject指明使用的事务对象。

这个语句为指定的事务对象说明一个游标,是一个不可执行语句。用户可以使用该语句按照与说明变量类似的方法,说明某事务对象的游标。

例如,下面说明了一个名为CUR的游标:

DECLARE CUR CURSOR FOR

SELECT database.field1, database.field2

FROM database

WHERE database.field >= 36;

CLOSE Procedure

CLOSE Prodedure语句的语法格式为:

CLOSE ProcedureName;

关闭SQL名为ProcedureName的过程,这一语句只能在使用EXECUTE执行了该过程后关闭该过程的时候才能使用。用户不能对使用USING TransactionObject子句的事务对象说明的过程使用CLOSE语句。用户只需要关闭那些返回状态信息的程序,对于那些不返回状态信息或者返回状态信息代码为100的程序,PowerBuilder自动地关闭它们。

DBMS-specific    并不是所有的DBMS都支持存储过程。

CLOSE CURSOR

CLOSE CURSOR的语法格式为:

CLOSE CURSORNAME;

关闭CURSORNAME代表的由OPEN打开的游标,正在使用的游标不能关闭。通常检索后在SQLCode等于100时使用,在执行该语句后最好检测关闭是否成功。

动态SQL语句1

使用这种格式可以处理既没有输出结果序列,也没有输入参数序列的SQL语句。可以处理所有形式的数据定义语言(Data Definition Language ---- DDL)。格式为:

EXECUTE IMMEDIATE SQLStatement {USING TransactionObject};

其中SQLStatement包含一条有效SQL语句的字符串。

例下面假设已存在一个事务对象,并将其连接到数据库:

string mySql

mySql = "INSERT INTO dept Values ( 1234,'Purchasing')"

EXECUTE IMMEDIATE :MySql USING My_trans;

动态SQL语句2

使用这种格式可以处理那些没有输出结果序列,但是需要输入参数序列的SQL语句。可以处理所有形式的数据定义语言(Data Definition Language ---- DDL)。格式为:

PREPARE DynamicStagingArea FROM SQLStatement {USING TransactionObject};

EXECUTE DynamicStagingArea USING {ParameterList}

其中DynamicStagingArea为DynamicStagingArea变量名(通常为SQLSA),SQLStatement包含一条有效SQL语句的字符串,ParameterList为以逗号隔开的PowerScript变量列表。

例如:

int emp_id_var = 56

PREPARE SQLSA FROM "DELETE FROM employee WHERE emp_id = ?";

EXECUTE SQLSA USING :Emp_id_var;

动态SQL语句3

使用这种格式可以处理那些有输入序列,而输出序列在编译的时候才知道的SQL语句。格式为:

DECLARE Cursor | Procedure DYNAMIC CURSOR | PROCEDURE FOR DynamicStagingArea ;

PREPARE DynamicStagingArea FROM SQLStatement {USING TransactionObject} ;

OPEN DYNAMIC Cursor {USING ParameterList} ;

EXECUTE DYNAMIC Procedure {USING ParameterList} ;

FETCH Cursor | Procedure INTO HostVariableList ;

CLOSE Cursor | Procedure ;

其中Cursor or Procedure指需要使用的游标或过程名,DynamicStagingArea为DynamicStagingArea变量名(通常为SQLSA),SQLStatement包含一条有效SQL语句的字符串,ParameterList为以逗号隔开的PowerScript变量列表,HostVariableList是用来保存检索数值的PowerScript变量列表。

例如:

integer Emp_id_var

DECLARE my_cursor DYNAMIC CURSOR FOR SQLSA ;

PREPARE SQLSA FROM "SELECT emp_id FROM employee" ;

OPEN DYNAMIC my_cursor ;

FETCH my_cursor INTO :Emp_id_var ;

CLOSE my_cursor ;

动态SQL语句4

使用这种格式可以处理那些输出序列和输入参数序列在编译时有一个或都未知的SQL语句。其格式为:

DECLARE Cursor | Procedure DYNAMIC CURSOR | PROCEDURE FOR DynamicStagingArea ;

PREPARE DynamicStagingArea FROM SQLStatement {USING TransactionObject} ;

DESCRIBE DynamicStagingArea INTO DynamicDescriptionArea ;

OPEN DYNAMIC Cursor | Procedure USING DESCRIPTOR DynamicDescriptionArea ;

EXECUTE DYNAMIC Cursor | Procedure USING DESCRIPTOR DynamicDescriptionArea ;

FETCH Cursor | Procedure USING DESCRIPTOR DynamicDescriptionArea ;

CLOSE Cursor | Procedure ;

其中Cursor or Procedure指需要使用的游标或过程名,DynamicStagingArea为DynamicStagingArea变量名(通常为SQLSA),SQLStatement包含一条有效SQL语句的字符串,DynamicDescriptionArea为DynamicDescriptionArea变量名(通常为SQLDA)。

例如:

string Stringvar, Sqlstatement

integer Intvar

Sqlstatement = "SELECT emp_id FROM employee"

PREPARE SQLSA FROM :Sqlstatement ;

DESCRIBE SQLSA INTO SQLDA ;

DECLARE my_cursor DYNAMIC CURSOR FOR SQLSA ;

OPEN DYNAMIC my_cursor USING DESCRIPTOR SQLDA ;

FETCH my_cursor USING DESCRIPTOR SQLDA ;

CHOOSE CASE SQLDA.OutParmType[1]

CASE TypeString!

        Stringvar = GetDynamicString(SQLDA, 1)

    CASE TypeInteger!

        Intvar = GetDynamicNumber(SQLDA, 1)

END CHOOSE

CLOSE my_cursor ;

PowerScript SQL语句的更多相关文章

  1. mysql学习之 sql语句的技巧及优化

    一.sql中使用正则表达式 select name,email from user where email Regexp "@163[.,]com$"; sql语句中使用Regex ...

  2. 一条Sql语句分组排序并且限制显示的数据条数

    如果我想得到这样一个结果集:分组排序,并且每组限定记录集的数量,用一条SQL语句能办到吗? 比如说,我想找出学生期末考试中,每科的前3名,并按成绩排序,只用一条SQL语句,该怎么写? 表[TScore ...

  3. LINQ to SQL语句(7)之Exists/In/Any/All/Contains

    适用场景:用于判断集合中元素,进一步缩小范围. Any 说明:用于判断集合中是否有元素满足某一条件:不延迟.(若条件为空,则集合只要不为空就返回True,否则为False).有2种形式,分别为简单形式 ...

  4. Oracle ------ SQLDeveloper中SQL语句格式化快捷键

    Oracle SQL Developer中SQL语句格式化快捷键: 每次sql复制到SQL Developer面板的时候,格式老不对,而且看起来很不舒服,所有的sql都挤在一行完成. 这时我们可以全选 ...

  5. SQL语句优化

    (1)      选择最有效率的表名顺序 ( 只在基于规则的优化器中有效 ) : ORACLE 的解析器按照从右到左的顺序处理 FROM 子句中的表名, FROM 子句中写在最后的表 ( 基础表dri ...

  6. LinqToDB 源码分析——生成与执行SQL语句

    生成SQL语句的功能可以算是LinqToDB框架的最后一步.从上一章中我们可以知道处理完表达式树之后,相关生成SQL信息会被保存在一个叫SelectQuery类的实例.有了这个实例我们就可以生成对应的 ...

  7. 年终巨献 史上最全 ——LINQ to SQL语句

    LINQ to SQL语句(1)之Where 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句.Where操 ...

  8. LINQ to SQL语句(19)之ADO.NET与LINQ to SQL

    它基于由 ADO.NET 提供程序模型提供的服务.因此,我们可以将 LINQ to SQL 代码与现有的 ADO.Net 应用程序混合在一起,将当前 ADO.NET 解决方案迁移到 LINQ to S ...

  9. LINQ to SQL语句(17)之对象加载

    对象加载 延迟加载 在查询某对象时,实际上你只查询该对象.不会同时自动获取这个对象.这就是延迟加载. 例如,您可能需要查看客户数据和订单数据.你最初不一定需要检索与每个客户有关的所有订单数据.其优点是 ...

随机推荐

  1. python之路——23

    复习 1.类定义 函数--方法--动态属性 必须传self 变量--类属性--静态属性 __init__方法--初始化方法2.实例化 1.使用:对象 = 类() 2.实例和对象没有区别 3.对象调用方 ...

  2. Immutable 学习

    1.什么是Immutable Data? Immutable Data 就是一旦创建,就不能再被更改的数据.对 Immutable 对象的任何修改或添加删除操作都会返回一个新的 Immutable 对 ...

  3. LeetCode 789. Escape The Ghosts

    题目链接:https://leetcode.com/problems/escape-the-ghosts/description/ You are playing a simplified Pacma ...

  4. 命令纠正工具 thefuck 的简单使用

    在unix系列的系统中,总会出现 命令拼写或者执行错误的情况, 比如 把 python 写成了pythou, cd 到一个不存在的目录,执行任务的权限 不够的问题, 这是心里 总是 在 fuck,但是 ...

  5. Z 字形变换

    将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C I R E T ...

  6. DLC 基本定律与规则2

    逻辑函数的相等 布尔代数 9 个定律 三条规则 代入规则

  7. Docker最简教程

    本文旨在让你用最短的时间弄懂Docker命令操作,什么虚拟化都太泛泛了,不讲大道理,实践出真知,让你从此的日常开发和工作中在面对Docker时不再茫然失措而是得心应手.本文也不谈安装,我实在认为作为程 ...

  8. eShopOnContainers 看微服务⑤:消息通信

    1.消息通信 传统的单体应用,组件间的调用都是使用代码级的方法函数.比如用户登录自动签到,增加积分.我们可以在登录函数调用积分模块的某个函数,为了解耦我们使用以来注入并放弃new Class()这种方 ...

  9. Vim常用配置

    mkdir -p ~/.vim/bundle/Vundle.vim git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/V ...

  10. MSMQ 队列消息和死信队列

    日志消息 日志队列可以保存你操作过的消息的备份.它的好处是,一但发现前面的操作失败,可以从日志队列中重新创建出原先的消息对象,然后再进行操作. 例如,向远方发送一个消息对象,然后对方返回一个失败的确认 ...