返回首页

gbase数据、南大通用产品文档:GBase8sEXECUTE IMMEDIATE 语句

更新日期:2024年09月11日

使用 EXECUTE IMMEDIATE 语句来执行等同于 PREPARE、EXECUTE 和
FREE 语句实现的那些任务,但只作为单个操作。
请随同 GBase 8s ESQL/C 和 SPL 使用该动态 SQL 语句。
语法

元素
描述
限制
语法
char_expr 取值为字符
数据类型的
表达式
必须取值为CHAR、LVARCHAR、
NCHAR、NVARCHAR 或 VARCHAR 数据
类型
表达式
statement 有效 SQL 语
句的文本
请参阅下列的 statement_var 的相
同章节
请参阅本
章节。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 611
statement
_var
包含
statement
的变量或
(在 ESQL/C
中)以分号
分隔的语句
列表
必须是先前声明的 CHAR、NCHAR、
NVARCHAR 或 VARCHAR (或在 SPL
中,LVARCHAR)类型的变量。请参阅
EXECUTE IMMEDIATE 和限制性语句
和 对有效语句的限制。
Language
specific
用法
EXECUTE IMMEDIATE 语句动态地执行在程序执行期间构造的单个 SQL 语句
(或在 ESQL/C 例程中,以分号分隔的 SQL 语句列表)。例如,您可从程序输
入获取数据库的名称,将 DATABASE 语句构建为程序变量,然后使用
EXECUTE IMMEDIATE 来执行该语句,以打开指定的数据库。
在 ESQL/C 例程内,由变量或引用的字符串指定的语句文本可包括多个 SQL 语
句,如果用分号(;)分隔符来分隔连续的语句的话。然而, 在 SPL 例程中,仅
可包括一个语句。statement 不可为 SPL 语句,但可为在 EXECUTE
IMMEDIATE 和r 限制性语句 或 对有效语句的限制 章节中未列出的任何 SQL
语句。
如果跟在 IMMEDIATE 关键字后的参数有效,则被分析并执行;然后立即释放所
有数据结构和内存资源。除非您使用 EXECUTE IMMEDIATE,不然这些操作需
要单独的 PREPARE、EXECUTE 和 FREE 语句。
如果会话环境值(诸如发出 EXECUTE IMMEDIATE 语句的 ESQL/C 或 SPL 例
程的 EXTDIRECTIVES、OPTCOMPIND 或 USELASTCOMMITTED 设置)与相
应的 ONCONFIG 参数值不同,则会话环境值覆盖它们。
在支持隐式事务的符合 ANSI/ISO 的数据库中,在缺省情况下,EXECUTE
IMMEDIATE 语句不开启新的事务。然而,执行指定的 SQL 语句文本可开启新
的事务。
EXECUTE IMMEDIATE 和限制性语句
不可跟在下列 SQL 语句之后执行 EXECUTE IMMEDIATE 语句。

CLOSE

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 612

CONNECT

DECLARE

DISCONNECT

EXECUTE

EXECUTE FUNCTION

EXECUTE PROCEDURE

FETCH

FLUSH

FREE

GET DESCRIPTOR

GET DIAGNOSTICS

OPEN

OUTPUT

PREPARE

PUT

SELECT

SET AUTOFREE

SET CONNECTION

SET DEFERRED_PREPARE

SET DESCRIPTOR

WHENEVER
对于 EXECUTE PROCEDURE,该限制仅引用与返回一个或多个值的调用。
EXECUTE IMMEDIATE 支持作为语句文本的唯一的 SELECT 语句形式为
SELECT ... INTO TEMP table。要了解 SELECT 语句中 INTO TEMP table
子句的语法,请参阅 INTO table 子句。
此外,ESQL/C 不可使用 EXECUTE IMMEDIATE 语句来执行包含由分号分隔的
多个 SQL 语句的文本中的下列语句:

CLOSE DATABASE

CREATE DATABASE

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 613

DATABASE

DROP DATABASE

SELECT(SELECT INTO TEMP 除外)
EXECUTE IMMEDIATE 语句不可处理包括问号(?)符号作为占位符的 SQL 语
句文本。请使用 PREPARE 语句和或者游标或者 EXECUTE 语句来执行动态构
建的 SELECT 语句。
(在 SPL 例程中,EXECUTE IMMEDIATE 语句仅可执行单个 SQL 语句。如果
紧跟在 IMMEDIATE 关键字后的参数赋值为多个 SQL 语句的列表,或为
NULL 值,或为非有效 SQL 语句的文本,则数据库服务器发出运行时错误。)
对有效语句的限制
下列限制应用于那些包含在紧跟在 EXECUTE IMMEDIATE 关键字之后的字符表
达式、引用字符串或语句变量中的语句:

SQL 语句不可包含主语言注释。

主语言变量的名称不像在准备好的文本中那样被识别。

您可使用的唯一标识符是在当前数据库的系统目录中注册的名称,诸如表
名称和列名称。

该语句不可引用主变量列表或描述符;不可包含任何问号(?)占位符,
这允许随同 PREPARE 语句使用。

该文本不可包括任何嵌入的 SQL 语句前缀,诸如美元符号($)或关键
字 EXEC SQL。

虽然不是必需的,在语句文本中可包括 SQL 语句结束符(;)。

该文本不可包括任何嵌入的 SQL 语句前缀,诸如美元符号($)或关键
字 EXEC SQL。
EXECUTE IMMEDIATE 不可处理输入主变量,这对集合变量是必需的。
请使用 EXECUTE 语句或游标来处理对集合变量的准备好的访问。
处理来自 EXECUTE IMMEDIATE 语句的例外
在编译 EXECUTE IMMEDIATE 语句时,如果 GBase 8s ESQL/C 分析器发现语
法错误,则发出编译错误,并不产生可执行的 UDR,直到语法正确并编译。如果
分析器接受 EXECUTE IMMEDIATE 语法且 UDR 编译成功,但在执行
EXECUTE IMMEDIATE 语句时在调用 UDR 期间发生例外,则数据库服务器在

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 614
运行时发出错误。WHENEVER 语句可捕获运行时错误,在 UDR 的程序逻辑中
一些其他例外处理机制也可捕获。
对于用 SPL 语言写的例程,在运行时为 SQL 表达式赋值,而不是在编译或优化
例程时。如果跟在 IMMEDIATE 关键字之后的表达式指定无效的 SQL 语句文
本,则 GBase 8s 发出运行时例外,而不是编译错误。在 SPL 例程中的任何运行
时错误条件之后,程序控制转到 ON EXCEPTION 语句块(如果定义的话);否
则,UDR 的执行异常终止,并返回给调用上下文一个错误。要获取关于如何在
SPL 例程中处理运行时错误的信息,请参阅 SPL 语句 ON EXCEPTION 的描
述。(另请参阅内建 SQL 函数 SQLCODE。)
EXECUTE IMMEDIATE 语句的示例
下列 ESQL/C 示例展示 GBase 8s ESQL/C 中的 EXECUTE IMMEDIATE 语句。
两个示例都是用包含 CREATE DATABASE 语句的主变量。
sprintf(cdb_text1, "create database %s", usr_db_id);
EXEC SQL execute immediate :cdb_text1;

sprintf(cdb_text2, "create database %s", usr_db_id2);
EXEC SQL execute immediate :cdb_text2;
下一个示例展示 SPL 程序片断,声明本地 SPL 变量并分配给它们两个 DDL 语
句文本的部分。然后发出 EXECUTE IMMEDIATE 语句来删除名为 DYN_TAB
的表,指定 SPL 变量中的 DROP TABLE 语句文本。本示例中的第二个
EXECUTE IMMEDIATE 语句创建一个同名的表,在此指定字符表达式中的
CREATE TABLE 语句文本,该表达式将两个 SPL 变量的内容连在一起。
CREATE PROCEDURE myproc()
DEFINE COLS VARCHAR(22);
DEFINE CRTOPER VARCHAR(16);
DEFINE DRPOPER VARCHAR(16);
DEFINE TABNAME VARCHAR(16);
DEFINE QRYSTR VARCHAR(100);
...
LET CRTOPER = "CREATE TABLE ";
LET DRPOPER = "DROP TABLE ";
LET TABNAME = "DYN_TAB";
LET COLS = "(ID INT, NAME CHAR(20))";

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 615
LET QRYSTR = DRPOPER || TABNAME;
EXECUTE IMMEDIATE QRYSTR;


EXECUTE IMMEDIATE CRTOPER || TABNAME || COLS;

END PROCEDURE;

下列来自 SimpleSelect.java 程序的示例展示如何使用 PreparedStatement 接口,
来执行有一个
输入参数的 SELECT 语句:
try
{
PreparedStatement pstmt = conn.prepareStatement("Select *
from x "
+ "where a = ?;");
pstmt.setInt(1, 11);

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 65 -
ResultSet r = pstmt.executeQuery();
while(r.next())
{
short i = r.getShort(1);
System.out.println("Select: column a = " + i);
}
r.close();
pstmt.close();
}
catch (SQLException e)
{
System.out.println("ERROR: Fetch statement failed: " +
e.getMessage());
}
该程序首先使用 Connection.prepareStatement() 方法来以它的单个输入参数准备 SELECT
语句。然后,它通过使用PreparedStatement.setInt() 方法来将值赋予该参数,并
以 PreparedStatement.executeQuery() 方法来执行该查询。
该程序返回 ResultSet 对象中的结果行,该程序以 ResultSet.next() 方法通过其重复执行。该
程序以 ResultSet.getShort() 方法来检索单独的列值,
因为选中列的数据类型为 SMALLINT。

最后,以恰当的 close() 方法来同时显式地关闭 ResultSet 和 PreparedStatement 对象。
要获取关于哪些 getXXX() 方法检索单独的列值的更多信息,
请参阅 ResultSet.getXXX() 方
法的数据类型映射。

Memory 概况
在8s 集群节点监控导航栏,点击操作系统监控的Memory 概况,即进入
Memory 概况监控界面。
本界面包括OS Memory Page In 趋势图、OS Memory Page Out 趋势图、OS
Free Physical Memory 趋势图。
趋势图支持点击图中任何位置,会出现一条竖线,以表格的方式显示在该
竖线、该时间点上各个趋势图所对应指标的值。
OS Memory Page In 趋势图,包含指标如下:
OS Memory Page In,即内存页换入。
OS Memory Page Out 趋势图,包含指标如下:
OS Memory Page Out,即内存页换出。
OS Free Physical Memory 趋势图,包含指标如下:
OS Free Physical Memory,即空闲物理内存。
趋势图界面显示如下:

统一数据平台监控与运维系统用户手册


- 20 -

南大通用数据技术股份有限公司