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. web页面性能

    一.资源压缩合并,减少HTTP请求 二.非核心代码异步加载 1.异步加载的方式 动态脚本加载 defer async 2.异步加载的区别 (1)defer是在HTML解析完之后才会执行,如果是多个,按 ...

  2. idea git commit撤销

    到项目目录下,打开git bash 1.git log 找到要撤销的版本id1 commit之前的版本id2 2.git reset –hard id13.git reset id2 参考链接:htt ...

  3. Linux下搭建jmeter

    最近做性能测试,Windows下跑jmeter,并发跑不到100,CPU就100%,这还是在命令行模式下,真心头大.没办法,只好搞个Linux来跑了,下面说下如何玩转的. 1.下载Ubuntu操作系统 ...

  4. Win2008服务启动不能调用Office Word的解决方法

    本文为大家分享一下如何解决Windows Server 2008 服务启动不能调用Office Word的问题,分享这个教程的原因是,今天在Windows server2008上部署一个应用时发现了一 ...

  5. iOS XML解析使用-韩国庆

    欢迎-------(北京-iOS移动开发金牌教师QQ:2592675215)韩老师给你带来XML解析课程 今天给大家讲解下xml解析的第三方简单用法:首先我解释下,json和xml解析格式. JSON ...

  6. Xilinx FPGA开发随笔

    1.UCF文件 1.1.UCF作用 UCF文件主要是完成管脚的约束,时钟的约束, 以及组的约束. 1.2.UCF语法 普通IO口只需约束引脚号和电压: NET "端口名称" LOC ...

  7. jenkins部署web项目(不包含前后端分离)

    本次部署的是非常非常传统的web项目, jsp页面那种, 一 首先给tomact设置管理员用户和管理员密码,这类的教程网上有很多,在<tomcat-users><tomcat-use ...

  8. python-web自动化-Js-滚动条操作

    滚动条操作:当待操作的元素在页面可是区域外时,要将待操作的元素滚动到可视区域当中 步骤:1.先找要将要操作的元素element = driver.find_element_by_xxxx(" ...

  9. The requested URL /xxxx.html was not found on this server

    The requested URL /xxxx.html was not found on this server 的原因是,Apache没有开启重写 apache 打开 httpd.conf 文件找 ...

  10. 《2018面向对象程序设计(Java)课程学习进度条》

    周次 (阅读/编写)代码行数 发布博客量/博客评论数量 课堂/课余学习时间(小时) 最满意的编程任务 第一周 50/40 1/0 6/4 九九乘法表 第二周 100/80 1/0 6/8 实验5,6, ...