返回首页

gbase数据、南大通用产品文档:GBase8aCREATE TABLE LIKE

更新日期:2024年09月11日

功能说明
源表包含自增列,create table like 的目标表继承自增列属性。
示例

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
1011
gbase> CREATE TABLE t1_1 like t1;
Query OK, 0 rows affected (Elapsed: 00:00:00.07)
gbase> SHOW CREATE TABLE t1_1 \G
*************************** 1. row ***************************
Table: t1_1
Create Table: CREATE TABLE "t1_1" (
"name" varchar(10) DEFAULT NULL,
"id" int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY ("id")
)
ENGINE=EXPRESS
DEFAULT
CHARSET=utf8
TABLESPACE='sys_tablespace'
1 row in set (Elapsed: 00:00:00.00)

集群环境描述:
Coordinator 节点:172.168.83.11,172.168.83.12,172.168.83.13
Data 节点:
vc1:172.168.83.11,172.168.83.12
Vc2:172.168.83.13,172.168.83.14
增加新的coordinator 节点IP:172.168.83.15

使用 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;