返回首页

gbase数据、南大通用产品文档:GBase8a

更新日期:2024年09月11日

gbase_affected_rows
 摘要:
返回上次UPDATE 更改的行数,上次DELETE 删除的行数,或上次INSERT 语
句插入的行数。
对于UPDATE、
DELETE 或INSERT 语句,
可在gbase_query()后立
刻调用。对于SELECT 语句,gbase_affected_rows()的工作方式与
gbase_num_rows()类似。
 语法:
gs_ulonglong gbase_affected_rows(GBASE *gbase);



GBase 8a 程序员手册C API 篇
南大通用数据技术股份有限公司

- 9 -
 参数:
gbase
数据库句柄
 返回值:
大于0 的整数表明受影响或检索的行数。
“0”
表示UPDATE 语句未更新记录,
在查询中没有与WHERE 匹配的行,或未执行查询。
“-1”表示查询返回错误,或
者对于SELECT 查询,在调用gbase_store_result()之前调用了
gbase_affected_rows()。由于gbase_affected_rows()返回无符号值,通过比
较返回值和“(gs_ulonglong)-1”或等效的“(gs_ulonglong)~0”
,检查是否为
“-1”
。.


GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 77 -
CallableStatement 提供从 Java™ 程序调用服务器上的存储过程的方式。可在
CallableStatement 中使用命名了的参数来按名称而不是按次序位置标识参数。
在 JDBC 3.0
规范中引入了此改善。如果过程是唯一的,则可省略有缺省值的参数,可以任何顺序输入
参数。对于调用有许多参数且某些参数有缺省值的存储过程,命名了的参数特别有用。
JDBC 驱动程序忽略参数名称的大小写。如果对于所有参数,存储过程都没有名称,则服
务器为丢失的名称传递一个空字符串。
对于 CallableStatement 中命名了的参数的要求和约束
对于 CallableStatement 中命名了的参数,GBase 8s JDBC Driver 有下列要求和约束:

在例程的单个调用之内,
必须通过名称或通过次序格式来为 CallableStatement 指定
参数。例如,如果您为一个参数命名参数,则必须为所有参数使用参数名称。

对于远程 CallableStatement,不支持命名了的参数。

在 JDK Version 1.4.x 或后来版本上,支持命名了的参数。

对于调用存储过程,对命名了的参数的支持以现有限制为准。
在 CallableStatement 中核实对命名了的参数的支持
JDBC 规范提供 DatabaseMetaData.supportsNamedParameters() 方法,来确定驱动程序和
RDMS 是否支持 CallableStatement 中命名了的参数。例如:
Connection myConn = . . . // connection to the RDBMS for Database
. . .
DatabaseMetaData dbmd = myConn.getMetaData();
if (dbmd.supportsNamedParameters() == true)
{
System.out.println("NAMED PARAMETERS FOR CALLABLE"
+ "STATEMENTS IS SUPPORTED");
. . .
}
如果支持命名了的参数,则系统返回 true。
检索存储过程的参数名称
要检索存储过程的参数名称,请使用 JDBC 规范定义的 DatabaseMetaData 方法,如下列示
例所示。
Connection myConn = ... // connection to the RDBMS for Database
. . .
DatabaseMetaData dbmd = myConn.getMetaData();
ResultSet rs = dbmd.getProcedureColumns(
"myDB", schemaPattern, procedureNamePattern, columnNamePattern);

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 78 -
rs.next() {
String parameterName = rs.getString(4);
- - - or - - -
String parameterName = rs.getString("COLUMN_NAME");
- - -
System.out.println("Column Name: " + parameterName);
显示与 getProcedureColumns() 方法的参数相匹配的所有列。
参数名称不是 ParameterMetaData 接口的一部分,不可从 ParameterMetaData 对象检索。
当您使用 getProcedureColumns() 方法时,该查询从 sysprocedures 系统目录表检索
由 gbasedbt 拥有的所有过程(包括系统产生的例程)。要防止错误,请核实:已在服务器
上以正确的许可配置了您正在使用的存储过程。
对于 getProcedureColumns() 方法,
要了解在 JDBC API 行为中的重要差异,
请参阅 不支持
的方法和行为不同的方法。
命名了的参数和唯一的存储过程
唯一的存储过程有唯一的名称和唯一的参数编号。当 CallableStatement 中的参数数等于或
小于存储过程中的参数数时,唯一的存储过程支持命名了的参数。
命名了的参数数等于参数数的示例
下列存储过程有五个参数
create procedure createProductDef(productname varchar(64),
productdesc varchar(64),
listprice float,
minprice float,
out prod_id float);
. . .
let prod_id = ;
end procedure;
下列带有五个参数的 Java™ 代码对应于该存储过程。JDBC 调用的圆括号内的问号(?)引
用这些参数。(在此情况下,是五个参数的五个参数)。设置或注册所有参数。通过使用
格式 cstmt.setString("arg", name); 来命名这些参数,
在此,
arg 是相应的存储过程中的参数名
称。无需按照与存储过程中参数顺序相同的顺序来命名参数。
String sqlCall = "{call CreateProductDef(?,?,?,?,?)}";
CallableStatement cstmt = conn.prepareCall(sqlCall);

cstmt.setString("productname", name); // Set Product Name.
cstmt.setString("productdesc", desc); // Set Product Description.

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 79 -
cstmt.setFloat("listprice", listprice); // Set Product ListPrice.
cstmt.setFloat("minprice", minprice); // Set Product MinPrice.

// Register out parameter which should return the product is created.

cstmt.registerOutParameter("prod_id", Types.FLOAT);

// Execute the call.
cstmt.execute();

// Get the value of the id from the OUT parameter: prod_id
float id = cstmt.getFloat("prod_id");
Java 代码和存储过程展示下列事件的进程:
1.
准备对存储过程的调用。
2.
参数名称指示哪些参数对应于哪个参数值或类型。
3.
为输入参数设置值,并注册输出参数的类型。
4.
以输入参数作为参数来执行存储过程。
5.
存储过程返回参数值作为输出参数,并检索输出参数的值。
命名了的参数数小于参数数的示例
如果 CallableStatement 中的参数数小于存储过程中的参数数,则剩余的参数必须有缺省值。
无需为有缺省值的参数设置值,因为服务器自动地使用缺省值。然而,您必须指出没有缺
省值的参数,或在 CallableStatement 中以问号(?)覆盖缺省值。
例如,如果存储过程有 10 个参数,其中 4 个没有缺省值,6 个有缺省值,则在
CallableStatement 中必须有至少 4 个问号。或者,可使用 5、6,或最多 10 个问号。
如果以多于无缺省值但少于存储过程参数数的参数准备 CallableStatement,则它必须为无
缺省值参数设置值。剩余的参数可为任何其他参数,且可随同每一执行来更改它们。
在下列唯一的存储过程中,参数 listprice 和 minprice 有缺省值:
create procedure createProductDef(productname varchar(64),
productdesc varchar(64),
listprice float default 100.00,
minprice float default 90.00,
out prod_id float);
. . .
let prod_id = ;
end procedure;

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 80 -
下列 Java™ 代码以少于存储过程中参数的参数调用存储过程(五个参数的四个参数)。由
于 listprice 有缺省值,因此,可从 CallableStatement 省略它。
String sqlCall = "{call CreateProductDef(?,?,?,?)}";
// 4 params for 5 args
CallableStatement cstmt = conn.prepareCall(sqlCall);

cstmt.setString("productname", name); // Set Product Name.
cstmt.setString("productdesc", desc); // Set Product Description.

cstmt.setFloat("minprice", minprice); // Set Product MinPrice.

// Register out parameter which should return the product id created.

cstmt.registerOutParameter("prod_id", Types.FLOAT);

// Execute the call.
cstmt.execute();

// Get the value of the id from the OUT parameter: prod_id
float id = cstmt.getFloat("prod_id");

或者,
对于同一存储过程,
可省略 minprice 参数的参数。
无需再次准备 CallableStatement。
cstmt.setString("productname", name); // Set Product Name.
cstmt.setString("productdesc", desc); // Set Product Description.

cstmt.setFloat("listprice", listprice); // Set Product ListPrice.

// Register out parameter which should return the product id created.

cstmt.registerOutParameter("prod_id", Types.FLOAT);

// Execute the call.
cstmt.execute();

// Get the value of the id from the OUT parameter: prod_id
float id = cstmt.getFloat("prod_id");
或者,您可同时省略缺省参数的参数:

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 81 -
cstmt.setString("productname", name);
cstmt.setString("productdesc", desc);
cstmt.registerOutParameter("prod_id", Types.FLOAT);
cstmt.execute();
float id = cstmt.getFloat("prod_id");
命名的参数和重载的存储过程
如果多个存储过程有相同的名称和相同的参数数,
则该过程为重载的
(也称为重载的 UDR)


对于重载的存储过程,JDBC 驱动程序抛出 SQLException,因为调用不可解析至单个存储
过程。要防止 SQLException,请通过将 ::data_type附加至 data_type 为 GBase 8s 服务器数
据类型处的问号字符,在参数列表中指定命名的参数的 GBase 8s 服务器数据类型。例
如 ?::varchar 或?::float。您还必须为所有参数输入命名的参数,且以与重载的存储过程的参
数顺序相同的顺序输入。
例如,下列两个过程有相同的名称(createProductDef)和相同的参数数。在每一过程中,
prod_id 参数的数据类型不一样。
过程 1
create procedure createProductDef(productname varchar(64),
productdesc varchar(64),
listprice float default 100.00,
minprice float default 90.00,
prod_id float);
...
let prod_id = ;
end procedure;
过程 2
create procedure createProductDef(productname varchar(64),
productdesc varchar(64),
listprice float default 100.00,
minprice float default 90.00,
prod_id int);
...
let prod_id = ;
end procedure;
如果使用下列 Java™ 代码,则由于它不可解析至唯一的一个过程,因此,它返回
SQLException:
String sqlCall = "{call CreateProductDef(?,?,?,?,?)}";

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 82 -
CallableStatement cstmt = con.prepareCall(sqlCall);
cstmt.setString("productname", name); // Set Product Name.
如果您为有不同数据类型的参数指定 GBase 8s 数据类型,则 Java 代码解析至一个过程。
下列 Java 代码解析至存储过程 1,因为代码为 prod_id参数指定 FLOAT 数据类型:
String sqlCall = "{call CreateProductDef(?,?,?,?,?::float)}";
CallableStatement cstmt = con.prepareCall(sqlCall);
cstmt.setString("productname", name); // Set Product Name

本示例中,使用下划线(_)作为行分隔符,导出方法如下:

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
547
$ ./orato8a --user='ssbm/ssbm@maya' --query="select id,name from message where
rownum<=5;" --file='./message.tbl' --format=3 --field='|' --string_qualifier="'"
--line_separator='_'
export columns: 2
export rows: 5
export time: 0 sec
process ok!
$ cat message.tbl
'1'|'Tom'_'2'|'小明'_'3'|'Peter'_'4'|'Yama'_'5'|'Hellen'_