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 ;