华为云用户手册

  • ifdef,ifndef,else,elif和endif指令 ecpg提供了ifdef、ifndef、else、elif和endif条件编译指令。在预处理时,按照不同的条件去编译程序的不同部分,使用时,需要添加EXEC SQL前缀关键字。 示例如下: EXEC SQL ifndef TZVAR; EXEC SQL SET TIMEZONE TO 'GMT'; EXEC SQL elif TZNAME; EXEC SQL SET TIMEZONE TO TZNAME; EXEC SQL else; EXEC SQL SET TIMEZONE TO TZVAR; EXEC SQL endif; 父主题: 预处理指令
  • 设置回调 设置回调操作,当告警或者错误发生时,直接执行具体操作进行处理,设置回调命令如下: EXEC SQL WHENEVER condition action; condition取值范围: SQLERROR:当在SQL语句执行期间发生错误时,调用指定操作。 SQLWARNING:当在SQL语句执行期间发生告警时,调用指定操作。 NOT FOUND:当SQL语句检索或者影响零行,则调用指定操作。 action取值范围: CONTINUE:忽略回调错误条件,继续执行,通常可以用来停止break包含条件,为缺省值。 GOTO label/GO TO label:跳转到指定标签(使用C语言goto语句)。 SQLPRINT:输出消息到标准错误。 STOP:调用exit(1),终止程序。 DO BREAK:执行C语句break,只有在循环中或者switch语句中使用。 SQLCALL name (args) / DO name (args):调用具有指定参数的指定C语言函数(当前特性是实验室特性,使用时请联系华为工程师提供技术支持)。 示例如下: /* 当出现一个告警时它打印一个消息,发生一个错误时中止程序。 */EXEC SQL WHENEVER SQLWARNING SQLPRINT; EXEC SQL WHENEVER SQLERROR STOP; 语句EXEC SQL WHENEVER是SQL预处理器的一个指令,而非一个C语言语句。不管C语言程序的流程如何,该语句设置的错误或告警动作都适用于位于处理程序设置点之后的嵌入式SQL语句,除非第一个EXEC SQL WHENEVER语句和导致错误或告警情况发生的SQL语句之间为同一个情况设置了不同的动作。因此下面的两个C语言程序都不会得到预期的效果: /* * 错误 */ int main(int argc, char *argv[]) { ... if (verbose) { EXEC SQL WHENEVER SQLWARNING SQLPRINT; } ... EXEC SQL SELECT ...; ... } /* * 错误 */ int main(int argc, char *argv[]) { ... set_error_handler(); ... EXEC SQL SELECT ...; ... } static void set_error_handler(void) { EXEC SQL WHENEVER SQLERROR STOP; } 当使用DO BREAK时只能用于while/for/switch场景,且用完需要使用CONTINUE语句忽略。 父主题: 错误处理
  • 类型映射 当ecpg应用程序在 GaussDB Kernel服务器和C语言程序之间交换值时(例如:从服务器检索查询结果或者执行带有输入参数的SQL语句),在GaussDB Kernel数据类型和宿主语言变量类型(具体的C语言数据类型)之间需要进行值的转换。有两种数据类型可以使用:一些简单的GaussDB Kernel数据类型,如integer和text,可以直接被应用程序读取和写入;其他GaussDB Kernel数据类型,如timestamp和numeric,只能通过特殊库函数进行访问,参见ecpg接口参考章节。 表1 GaussDB Kernel数据类型和C变量类型之间的映射 GaussDB Kernel数据类型 宿主变量数据类型 smallint short integer int bigint long long int boolean bool character(n), varchar(n), text char[n+1], VARCHAR[n+1] double precision double real float smallserial short serial int bigserial long long int oid unsigned int name char[NAMEDATALEN] date date [a] timestamp timestamp [a] interval interval [a] decimal decimal [a] numeric numeric [a] [a]这种类型可以通过访问特殊数据类型访问。 当前仅支持对于C语言的基本数据类型的使用或者组合,不支持C++语言中string数据类型用作宿主变量数据类型。 当前ecpg仅对GaussDB Kernel SQL的常用数据类型做映射,具体支持项可参考表1。 父主题: 宿主变量
  • 处理字符串 处理SQL字符串数据类型(例如:varchar、text),有两种方式来声明宿主变量: 方式一:使用char[](一个char字符串),C语言程序中处理字符数据最常见的方式。 EXEC SQL BEGIN DECLARE SECTION; char str[50];EXEC SQL END DECLARE SECTION; 注意字符串必须控制长度,如果上述示例的宿主变量用作存放查询结果且查询命令返回的字符串长度超过49字节,那么将会发生缓冲区溢出。 方式二:使用VARCHAR类型,ecpg提供的一种特殊类型。在一个VARCHAR类型数组上的定义会被转变成一个struct类型。如下声明: VARCHAR var[180]; 会被转变成: struct varchar_var { int len; char arr[180]; } var; 要在一个VARCHAR宿主变量中存储一个字符串,该宿主变量必须被声明为包含零字节为终止符长度的字符串。字段arr存放以零字节为终止符的字符串,字段len保存存储在arr中的字符串的长度,计算长度时不包括终止符。当宿主变量被用于一个查询的输入时,如果strlen(arr)和len结果不同,将使用较短的那一个。 VARCHAR可以被写成大写或小写形式,但是不能大小写混合。 char和VARCHAR类型宿主变量也可以保存其他SQL类型的值,它们将被存储为字符串形式。 父主题: 宿主变量
  • 执行没有结果集的语句 执行EXECUTE IMMEDIATE命令示例如下: EXEC SQL BEGIN DECLARE SECTION; const char *stmt = "CREATE TABLE test1 (...);";EXEC SQL END DECLARE SECTION; EXEC SQL EXECUTE IMMEDIATE :stmt; EXECUTE IMMEDIATE可以用于不返回结果集的SQL语句,比如:DDL,INSERT,UPDATE,DELETE语句。但不能用这种方式执行检索数据的语句,比如:SELECT语句。 父主题: 执行动态SQL语句
  • 执行具有输入参数的语句 准备一个普通语句,通过替换参数(在想要替换参数的地方写上问号)执行它的特定版本。使用EXECUTE语句通过USING子句给定参数执行准备语句。示例如下: EXEC SQL BEGIN DECLARE SECTION; const char *stmt = "INSERT INTO test1 VALUES(?, ?);";EXEC SQL END DECLARE SECTION; /* PREPARE 准备一个语句用于执行 */ EXEC SQL PREPARE mystmt FROM :stmt; ... /* 单引号为有效字符,若用字符串需用双引号 */ EXEC SQL EXECUTE mystmt USING 42, 'foobar'; /* 当你不再需要预备语句时,你应该释放它 */ EXEC SQL DEALLOCATE PREPARE name; 父主题: 执行动态SQL语句
  • 声明段 要实现嵌入式SQL-C程序和数据库间的数据交互(例如:从SQL-C程序把查询语句中的参数传递给数据库,或者从数据库向嵌入式SQL-C程序传回数据),需要在特殊的标记段里面声明包含此数据的C语言变量,以便预处理器能够识别。 标记段以下面的代码开始: EXEC SQL BEGIN DECLARE SECTION; 以下面的代码结束: EXEC SQL END DECLARE SECTION; 在此之间,必须有常规的C语言变量声明,比如: int x = 4;char foo[16], bar[16]; 标记段代码开始和结束之间声明的宿主变量类型必须为当前支持的数据类型,详见表1。 可以隐式地创建一个声明段声明变量:EXEC SQL int i = 4。 那些不在SQL命令里使用的变量可以在这些特殊的声明段外面声明。 结构体或者联合体的定义也必须在DECLARE段中列出。否则预处理器就无法处理这些类型,因为它不知道定义。 父主题: 宿主变量
  • 检索查询 对于常用的检索查询,嵌入式SQL提供了常规命令SELECT和FETCH的特殊变体。这些命令使用特殊的INTO子句,用以指定检索出来的数值存储在哪些宿主变量里。SELECT用于返回单行的查询,FETCH用于使用游标返回多行的查询。 使用SELECT /* * 假定有这个表: * CREATE TABLE test1 (a int, b varchar(50)); */EXEC SQL BEGIN DECLARE SECTION; int v1; VARCHAR v2;EXEC SQL END DECLARE SECTION; ... EXEC SQL SELECT a, b INTO :v1, :v2 FROM test; INTO子句出现在选择列表和FROM子句之间。选择列表和INTO后面的列表的元素(也叫目标列表)个数必须相同。 使用FETCH EXEC SQL BEGIN DECLARE SECTION; int v1; VARCHAR v2;EXEC SQL END DECLARE SECTION; ... EXEC SQL DECLARE foo CURSOR FOR SELECT a, b FROM test; ... do { ... EXEC SQL FETCH NEXT FROM foo INTO :v1, :v2; ... } while (...); 这里的INTO子句出现在所有SQL子句后面。 父主题: 宿主变量
  • 概述 在嵌入式SQL中进行C语言程序和SQL语句之间的数据传递不需要把数据粘贴到语句中,只需要在SQL语句里写上C语言变量的名称,前缀一个冒号即可。示例如下: EXEC SQL INSERT INTO sometable VALUES (:v1, 'foo', :v2); 这个语句引用了两个C语言变量:v1和v2,并且使用一个普通的SQL字串文本,这表明一条SQL语句内并不限制只使用某一种数据。 父主题: 宿主变量
  • 示例 EXEC SQL WHENEVER NOT FOUND CONTINUE; EXEC SQL WHENEVER NOT FOUND DO BREAK; EXEC SQL WHENEVER SQLWARNING SQLPRINT; EXEC SQL WHENEVER SQLWARNING DO warn(); EXEC SQL WHENEVER SQLERROR sqlprint; EXEC SQL WHENEVER SQLERROR SQLCALL print2(); EXEC SQL WHENEVER SQLERROR DO handle_error("select"); EXEC SQL WHENEVER SQLERROR DO sqlnotice(NULL, NONO);EXEC SQL WHENEVER SQLERROR DO sqlprint(); EXEC SQL WHENEVER SQLERROR GOTO error_label; EXEC SQL WHENEVER SQLERROR STOP; 使用WHENEVER NOT FOUND BREAK来处理结果集的循环: int main(void) { EXEC SQL CONNECT TO testdb AS con1; EXEC SQL SELECT pg_catalog.set_config('search_path', '', false); EXEC SQL COMMIT; EXEC SQL ALLOCATE DESCRIPTOR d; EXEC SQL DECLARE cur CURSOR FOR SELECT current_database(), 'hoge', 256; EXEC SQL OPEN cur; /* 当到达结果集末尾时,跳出循环 */ EXEC SQL WHENEVER NOT FOUND DO BREAK; while (1) { EXEC SQL FETCH NEXT FROM cur INTO SQL DESCRIPTOR d; ... } EXEC SQL CLOSE cur; EXEC SQL COMMIT; EXEC SQL DEALLOCATE DESCRIPTOR d; EXEC SQL DISCONNECT ALL; return 0; }
  • 参数说明 connection_target 以下列形式之一指定连接的目标服务器: [ database_name ] [ @host ] [ :port ]:通过TCP/IP连接。 unix:postgresql://host [ :port ] / [ database_name ] [ ?connection_option ]:通过Unix域套接字连接。 tcp:postgresql://host [ :port ] / [ database_name ] [ ?connection_option ]:通过TCP/IP连接。 SQL string constant:包含上述形式之一的值。 connection_name 用于该连接的一个可选标识符,可以在其他命令中引用它。可以是一个SQL标识符或者一个宿主变量。 connection_user 用于数据库连接的用户名。 使用user_name/password、user_name SQLIDENTIFIED BY password或者user_name USING password之一,这个参数也能指定用户名和口令。 用户名和口令可以是SQL标识符、字符串常量或者宿主变量。 上述参数中斜体部分为变量,请根据实际情况进行修改。
  • 示例 指定连接参数的变体的示例: EXEC SQL CONNECT TO "connectdb" AS main; EXEC SQL CONNECT TO "connectdb" AS second; EXEC SQL CONNECT TO 'connectdb' AS main; EXEC SQL CONNECT TO REGRESSDB1 as main; EXEC SQL CONNECT TO connectdb AS :id; EXEC SQL CONNECT TO connectdb AS main USER connectuser/connectdb; EXEC SQL CONNECT TO connectdb AS main USER connectuser USING "connectdb"; EXEC SQL CONNECT TO connectdb AS main; EXEC SQL CONNECT TO tcp:postgresql://localhost/connectdb USER connectuser IDENTIFIED BY connectpw; EXEC SQL CONNECT TO tcp:postgresql://localhost:20/connectdb USER connectuser SQLIDENTIFIED BY connectpw; EXEC SQL CONNECT TO unix:postgresql://localhost/connectdb USER connectuser SQLIDENTIFIED BY "connectpw"; EXEC SQL CONNECT TO unix:postgresql://localhost/connectdb USER connectuser USING "connectpw"; 使用宿主变量指定连接参数的示例: int main(void) { EXEC SQL BEGIN DECLARE SECTION; char *dbname = "testdb"; /* 数据库名 */ char *user = "testuser"; /* 连接用户名 */ char *pwd = "pwd_123_pwd"; /* 密码 */ char *connection = "tcp:postgresql://localhost:5432/testdb"; /* 连接字符串 */ char ver[256]; /* 存储版本字符串的缓冲区 */ EXEC SQL END DECLARE SECTION; ECPGdebug(1, stderr); EXEC SQL CONNECT TO :dbname; EXEC SQL SELECT pg_catalog.set_config('search_path', '', false); EXEC SQL COMMIT; EXEC SQL SELECT version() INTO :ver; EXEC SQL DISCONNECT; printf("version: %s\n", ver); EXEC SQL CONNECT TO :connection USER :user USING :pwd; EXEC SQL SELECT pg_catalog.set_config('search_path', '', false); EXEC SQL COMMIT; EXEC SQL SELECT version() INTO :ver; EXEC SQL DISCONNECT; printf("version: %s\n", ver); return 0; }
  • 宿主变量 本节详细介绍如何在C语言程序和嵌入式SQL程序之间使用宿主变量传递数据。在嵌入式SQL-C程序中,我们将C语言作为宿主语言,将EXEC SQL [Command]语句认为是宿主语言的嵌入式SQL,因此将C语言程序中用于嵌入式SQL语句的变量称为宿主变量。 概述 声明段 检索查询 类型映射 处理字符串 使用非初级类型的宿主变量 访问特殊数据类型 处理非初级SQL数据类型 父主题: 基于ecpg开发
  • 示例 EXEC SQL TYPE customer IS struct { varchar name[50]; int phone; };EXEC SQL TYPE cust_ind IS struct ind { short name_ind; short phone_ind; };EXEC SQL TYPE c IS char reference;EXEC SQL TYPE ind IS union { int integer; short smallint; };EXEC SQL TYPE intarray IS int[AMOUNT];EXEC SQL TYPE str IS varchar[BUFFERSIZ];EXEC SQL TYPE string IS char[11]; 使用EXEC SQL TYPE的示例: EXEC SQL WHENEVER SQLERROR SQLPRINT; EXEC SQL TYPE tt IS struct { varchar v[256]; int i; }; EXEC SQL TYPE tt_ind IS struct ind { short v_ind; short i_ind; }; int main(void) { EXEC SQL BEGIN DECLARE SECTION; tt t; tt_ind t_ind; EXEC SQL END DECLARE SECTION; EXEC SQL CONNECT TO testdb AS con1; EXEC SQL SELECT pg_catalog.set_config('search_path', '', false); EXEC SQL COMMIT; EXEC SQL SELECT current_database(), 256 INTO :t:t_ind LIMIT 1; printf("t.v = %s\n", t.v.arr); printf("t.i = %d\n", t.i); printf("t_ind.v_ind = %d\n", t_ind.v_ind); printf("t_ind.i_ind = %d\n", t_ind.i_ind); EXEC SQL DISCONNECT con1; return 0; } 该示例输出为: t.v = testdb t.i = 256 t_ind.v_ind = 0 t_ind.i_ind = 0
  • 查询结果集 返回单行结果的SELECT语句可以直接使用EXEC SQL执行,可参考执行SQL语句章节。 示例: /* 首先建立一个表并插入数据 */EXEC SQL CREATE TABLE test_table (number1 integer, number2 integer);EXEC SQL INSERT INTO test_table (number1, number2) VALUES (2, 1);/* 查询结果为单行,:num 为宿主变量 */EXEC SQL SELECT number1 INTO :num FROM test_table WHERE number2 = 1; 若要处理多行结果集,则必须使用游标,可参考使用游标章节(特殊情况下,应用程序可以一次取出多行结果写入到数组类型的宿主变量中,可参考使用非初级类型的宿主变量章节)。 示例: /* 首先建立一个表并插入数据 */ EXEC SQL CREATE TABLE test_table (number1 integer, number2 integer); EXEC SQL INSERT INTO test_table (number1, number2) VALUES (2, 1); EXEC SQL INSERT INTO test_table (number1, number2) VALUES (3, 1); EXEC SQL INSERT INTO test_table (number1, number2) VALUES (4,1); EXEC SQL INSERT INTO test_table (number1, number2) VALUES (5, 1);/* 定义宿主变量 */EXEC SQL BEGIN DECLARE SECTION; int v1; int v2;EXEC SQL END DECLARE SECTION; /* 声明游标 */ EXEC SQL DECLARE test_bar CURSOR FOR SELECT number1, number2 FROM test_table ORDER BY number1; /* 打开游标 */ EXEC SQL OPEN test_bar; /* 当游标到达结果集末尾时跳出循环 */ EXEC SQL WHENEVER NOT FOUND DO BREAK; /* 获取查询结果集 */ while(1) { EXEC SQL FETCH NEXT FROM test_bar INTO :v1, :v2; printf("number1 = %d, number2 = %d\n",v1,v2); } /* 关闭游标 */ EXEC SQL CLOSE test_bar; 父主题: 基于ecpg开发
  • 示例 int main(void) { EXEC SQL CONNECT TO testdb AS DEFAULT USER testuser; EXEC SQL CONNECT TO testdb AS con1 USER testuser; EXEC SQL CONNECT TO testdb AS con2 USER testuser; EXEC SQL CONNECT TO testdb AS con3 USER testuser; EXEC SQL DISCONNECT CURRENT; /* 关闭 con3 */ EXEC SQL DISCONNECT DEFAULT; /* 关闭 DEFAULT */ EXEC SQL DISCONNECT ALL; /* 关闭 con2 以及 con1 */ return 0; }
  • 示例 EXEC SQL ALLOCATE DESCRIPTOR mydesc;EXEC SQL PREPARE stmt1 FROM :sql_stmt;EXEC SQL DESCRIBE stmt1 INTO SQL DESCRIPTOR mydesc;EXEC SQL GET DESCRIPTOR mydesc VALUE 1 :charvar = NAME;EXEC SQL DEALLOCATE DESCRIPTOR mydesc;
  • 示例 声明用于查询的游标示例: EXEC SQL DECLARE C CURSOR FOR SELECT * FROM My_Table; EXEC SQL DECLARE C CURSOR FOR SELECT Item1 FROM T; EXEC SQL DECLARE cur1 CURSOR FOR SELECT version(); 声明用于预备语句的游标示例: EXEC SQL PREPARE stmt1 AS SELECT version(); EXEC SQL DECLARE cur1 CURSOR FOR stmt1;
  • 示例 检索结果集中列数: EXEC SQL GET DESCRIPTOR d :d_count = COUNT; 在第一列中检索数据长度: EXEC SQL GET DESCRIPTOR d VALUE 1 :d_returned_octet_length = RETURNED_OCTET_LENGTH; 检索作为字符串第二列的数据主体: EXEC SQL GET DESCRIPTOR d VALUE 2 :d_data = DATA; 执行SELECT current_database();并且显示列数、列数据长度和列数据的完整过程示例: int main(void) { EXEC SQL BEGIN DECLARE SECTION; int d_count; char d_data[1024]; int d_returned_octet_length; EXEC SQL END DECLARE SECTION; EXEC SQL CONNECT TO testdb AS con1 USER testuser; EXEC SQL SELECT pg_catalog.set_config('search_path', '', false); EXEC SQL COMMIT; EXEC SQL ALLOCATE DESCRIPTOR d; /* 描述、打开一个游标,并且分配一个描述符给该游标 */ EXEC SQL DECLARE cur CURSOR FOR SELECT current_database(); EXEC SQL OPEN cur; EXEC SQL FETCH NEXT FROM cur INTO SQL DESCRIPTOR d; /* 得到全部列的数量 */ EXEC SQL GET DESCRIPTOR d :d_count = COUNT; printf("d_count = %d\n", d_count); /* 得到一个返回列的长度 */ EXEC SQL GET DESCRIPTOR d VALUE 1 :d_returned_octet_length = RETURNED_OCTET_LENGTH; printf("d_returned_octet_length = %d\n", d_returned_octet_length); /* 将返回的列取出成一个字符串 */ EXEC SQL GET DESCRIPTOR d VALUE 1 :d_data = DATA; printf("d_data = %s\n", d_data); /* 关闭 */ EXEC SQL CLOSE cur; EXEC SQL COMMIT; EXEC SQL DEALLOCATE DESCRIPTOR d; EXEC SQL DISCONNECT ALL; return 0; } 该示例执行结果为: d_count = 1 d_returned_octet_length = 6 d_data = testdb
  • 事务管理 在ecpg缺省模式下,语句只有在EXEC SQL COMMIT发出的时候才被提交,嵌入的SQL接口也支持事务的自动提交(通过EXEC SQL SET AUTOCOMMIT TO ON语句设置自动提交)。在自动提交模式下,每条命令都是自动提交的,除非它们包围在一个明确的事务块里。自动提交模式可以用EXEC SQL SET AUTOCOMMIT TO OFF语句关闭。 常见事务管理命令如下: EXEC SQL COMMIT:提交正在进行的事务。 EXEC SQL ROLLBACK:回滚正在进行的事务。 EXEC SQL SET AUTOCOMMIT TO ON:启动自动提交模式。 SET AUTOCOMMIT TO OFF:关闭自动提交模式,缺省模式。 父主题: 执行SQL命令
  • td_compatible_truncation 参数说明:控制是否开启与Teradata数据库相应兼容的特征。该参数在用户连接上与TD兼容的数据库时,可以将参数设置成为on(即超长字符串自动截断功能启用),该功能启用后,在后续的insert语句中,对目标表中char和varchar类型的列插入超长字符串时,会按照目标表中相应列定义的最大长度对超长字符串进行自动截断。保证数据都能插入目标表中,而不是报错。 超长字符串自动截断功能不适用于insert语句包含外表的场景。 如果向字符集为字节类型编码(SQL_ASCII、LATIN1等)的数据库中插入多字节字符数据(如汉字等),且字符数据跨越截断位置,这种情况下,按照字节长度自动截断,自动截断后会在尾部产生非预期结果。如果用户有对于截断结果正确性的要求,建议用户采用UTF8等能够按照字符截断的输入字符集作为数据库的编码集。 该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。 取值范围:布尔型 on表示启动超长字符串自动截断功能。 off表示停止超长字符串自动截断功能。 默认值:off
  • plsql_compile_check_options 参数说明:数据库兼容性行为配置项,该参数的值由若干个配置项用逗号隔开构成。 该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。 取值范围:字符串 默认值:"" 当前只支持表2。 配置多个兼容性配置项时,相邻配置项用逗号隔开,例如:set plsql_compile_check_options='for_loop,outparam';
  • a_format_dev_version 参数说明:数据库平台迭代小版本兼容性行为配置项,该参数的值为字符串枚举值。 该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。 取值范围:字符串 默认值:"" 当前只支持表5。 兼容性配置项时设置字符串,例如:set a_format_dev_version='s1'; 表5 兼容性配置项 兼容性配置项 兼容性行为控制 s1 A平台兼容迭代小版本,影响函数(TRUNC(date, fmt),ROUND(date, fmt),NVL2,LPAD,RPAD,ADD_MONTHS,MONTHS_BETWEEN,REGEXP_REPLACE,REGEXP_COUNT,TREAT,EMPTY_CLOB,INSTRB,trunc(number),greatest,least,mod,round(number),cast,to_date,to_timestamp,chr,rtrim,translate,to_char,to_number,to_timestamp_tz)。 数据类型转换:小数字符串转换成整数类型(int1/int2/int4/int8/int16)时进行四舍五入。 数据类型转换:支持timestamp with time zone到timestamp without time zone的隐式转换。 s2 A平台兼容迭代小版本,影响函数(dump, to_single_byte, to_multi_byte, nls_upper, nls_lower, initcap, ascii2, asciistr, unistr, vsize, cosh, remainder, sinh, tanh, nanvl, current_date, current_timestamp, dbtimezone, numtodsinterval, numtoyminterval, new_time, sessiontimezone, sys_extract_utc, tz_offset, to_binary_double, to_binary_float, to_dsinterval, to_yminterval, lnnvl, ora_hash, rawtohex2, bit2coding, bit4coding)。 兼容配置项为s1时的所有行为。
  • plpgsql.variable_conflict 参数说明:设置同名的存储过程变量和表的列的使用优先级。 该参数属于USERSET类型参数,仅支持表1中对应设置方法3进行设置。 取值范围:字符串 error表示遇到存储过程变量和表的列名同名则编译报错。 use_variable表示存储过程变量和表的列名同名则优先使用变量。 use_column表示存储过程变量和表的列名同名则优先使用列名。 默认值:error
  • nls_timestamp_tz_format 参数说明:设置带时区时间戳默认格式。 该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。 取值范围:字符串,支持格式同nls_timestamp_format。 默认值:DD-Mon-YYYY HH:MI:SS.FF AM 此参数与在参数a_format_version值为10c和a_format_dev_version值为s1的情况下有效
  • transform_null_equals 参数说明:控制表达式expr = NULL(或NULL = expr)当做expr IS NULL处理。如果expr得出NULL值则返回真,否则返回假。 正确的SQL标准兼容的expr = NULL总是返回NULL(未知)。 Microsoft Access里的过滤表单生成的查询使用expr = NULL来测试空值。打开这个选项,可以使用该接口来访问数据库。 该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。 取值范围:布尔型 on表示控制表达式expr = NULL(或NULL = expr)当做expr IS NULL处理。 off表示不控制,即expr = NULL总是返回NULL(未知)。 默认值:off 新用户经常在涉及NULL的表达式上语义混淆,故默认值设为off。
  • b_format_behavior_compat_options 参数说明:数据库B模式兼容性行为配置项,该参数的值由若干个配置项用逗号隔开构成。 该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。 取值范围:字符串 默认值:"" 当前只支持表1 兼容性B模式配置项。 配置多个兼容性配置项时,相邻配置项用逗号隔开,例如:set b_format_behavior_compat_options='enable_set_variables,set_session_transaction'; 表1 兼容性B模式配置项 兼容性配置项 兼容性行为控制 enable_set_variables set语法增强控制开关。 不设置此配置时,不支持set自定义变量、set [global | session]语法。 设置此配置时,支持B兼容模式下使用上述语法,比如 set @v1 = 1;。 set_session_transaction set session transaction控制开关。 不设置此配置时,set session transaction等效于set local transaction。 设置此配置时,支持B兼容模式下使用上述语法,修改当前会话事务特性。 enable_modify_column ALTER TABLE MODIFY语义控制开关。 不设置此配置时,“ALTER TABLE table_name MODIFY column_name data_type;”只修改列的数据类型。 设置此配置时,“ALTER TABLE table_name MODIFY column_name data_type;”修改整个列定义。 default_collation 默认字符序前向兼容开关。 不设置此配置时,在未显式指定字符类型字段的字符集或字符序且表级字符序也为空时,字段为default字符序。 设置此配置时,字符类型字段的字符序当表级字符序不为空时继承表级字符序,为空时设置为数据库编码对应的默认字符序。
  • audit_login_logout 参数说明:这个参数决定是否审计用户的登录(包括登录成功和登录失败)、注销。 该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。 取值范围:整型,0~7。 0表示关闭用户登录、注销审计功能。 1表示只审计用户登录成功。 2表示只审计用户登录失败。 3表示只审计用户登录成功和失败。 4表示只审计用户注销。 5表示只审计用户注销和登录成功。 6表示只审计用户注销和登录失败。 7表示审计用户登录成功、失败和注销。 默认值:7
  • 使用游标 使用游标可以检索出多行的结果集,应用程序必须声明一个游标并且从游标中抓取每一行数据。 声明一个游标: EXEC SQL DECLARE foo_bar CURSOR FOR SELECT number, ascii FROM foo ORDER BY ascii; 打开游标: EXEC SQL OPEN foo_bar; 从游标中抓取一行数据: EXEC SQL FETCH foo_bar INTO :FooBar, DooDad; 关闭游标: EXEC SQL CLOSE foo_bar; 更多游标的使用细节可参考DECLARE,关于FETCH命令的细节可参考FETCH。 父主题: 执行SQL命令
  • no_audit_client 参数说明:该参数用于配置不需要审计的客户端名称及IP地址列表。参数格式为:客户端名称@IP,同pg_query_audit函数中的client_conninfo字段,例如“cm_agent@127.0.0.1, gs_clean@127.0.0.1”。 该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。 取值范围:字符串,多个配置项需使用逗号分隔。 默认值:空字符串 当执行的SQL语句同时满足full_audit_users和no_audit_client参数配置时,以no_audit_client配置优先,不记录审计日志。 数据库服务端内部工具或节点之间通信也会产生审计日志,针对这些风险较低的审计场景的可以通过配置no_audit_client参数不记录审计,以节约审计日志占用空间,提升审计日志查询性能。
共100000条