返回首页

gbase数据、南大通用产品文档:GBase8sreset config 参数:

更新日期:2024年09月11日

恢复配置参数值
(SQL 管
理 API)
随同 admin() 或 task() 函数,使用 reset config 参数来将动态地可更新的配置参数值恢复
为 onconfig 文件中的值。动态地可更新的配置参数是您可用 onmode 或 SQL 管理 API
命令为会话变更的那些参数。
语法

元素
描述
关键考虑
configuration_parameter_name
您想要恢复其值的配置参数的名称。


GBase 8s 管理员参考
南大通用数据技术股份有限公司 - 782 -

用法
reset config 参数将配置参数的值恢复为 onconfig 文件中最后保存的值,
即使在数据库服务
器启动之后更改了该值。
示例
下列命令将 DYNAMIC_LOGS 配置参数的值恢复为 onconfig 文件中的值。
EXECUTE FUNCTION task("reset config","DYNAMIC_LOGS");

dbexport 实用程序支持磁盘和磁带目标选项。

元素
用途
重要注意事项
-b blocksize
指定磁带设备的块大小
(以千字节计)
无。
-f pathname
指定希望存储模式文件
的路径名
(如果要在磁带
上存储数据文件)
其他信息:
路径名可以是
完整的路径名或文件名。
如果只给出文件名,
那么
文件将存储在当前目录
中。
-o directory
指定磁盘上的目录,
dbexport 将在该目录



限制:
指定为目录名的目
录必须存在。



database.exp 目录。
该目录保
留 dbexport 为数据
库创建的数据文件和模
式文件。
-s tapesize
指定您可在磁带上存储
的数据量(以千字节计)

其他信息:
要写到磁带的末尾,
请将
tapesize 指定为 0。
如果您不指定 0,那么
最大tapesize 是 2
097 151 KB。
-t device
指定您希望存储文本文
件和可能存储模式文件
的磁带设备路径名。
-t 选项不允许您指定
远程磁带设备。

写到磁盘时,
dbexport 将在 -o 选项指定的目录中创建 database.exp 子目
录。 dbexport 实用程序为数据库中的每个表创建带 .unl 扩展名的文件。模式
文件写入文件 database.sql。 .unl 和 .sql 文件位于 database.exp 目录中。
如果没有为数据和模式文件指定目标,
将把子目录 database.exp 放置在当
前工作目录中。
将数据文件写入磁带时,
可以使用 -f 选项将模式文件存储到磁盘。
不需要
将模式文件命名为 database.sql。您可任意取名。
仅 UNIX/Linux
对于 UNIX™ 或 Linux™ 上的非 SE 数据库服务器,该命令为:
dbexport //finland/reports
以下命令将数据库 stores_demo 导出到磁带,该磁带的块大小为 16 KB
且容量为 24000 KB 。该命令还可以将模式文件写入到
/tmp/stores_demo.imp。



dbexport -t /dev/rmt0 -b 16 -s 24000 -f /tmp/stores_demo.imp
stores_demo
以下命令将同一
stores_demo
数据库导出到名为
/work/exports/stores_demo.exp
的目录。结果模式文件为
/work/exports/stores_demo.exp/stores_demo.sql。
dbexport -o /work/exports stores_demo

sqldetach() 函数从数据库服务器脱离进程。通常,当应用程序分叉一个新的进程来开
始新的执行流时,您调用此函数。

语法
mint sqldetach();

用法

如果在应用程序开启至数据库服务器的连接之后,它创建一个或多个进程,则所有子
进程 从父进程(产生了子进程的应用程序进程)继承数据库服务器连接。然而,数据库服
务器仍假定此连接仅有一个进程。如果一个数据库服务器连接试图同时为父进程和子进程
服务时,可导致问题。例如,如果两个进程都发送消息做某事,则数据库服务器无法知道
哪个消息属于哪个进程。数据库服务器可能未按合理的顺序接收消息,因此可能生成错误
(诸如错误 -408)。

自此情况下,
请从子进程调用 sqldetach() 函数。
sqldetach() 函数将子进程从父进程建
立的连接(子进程继承的)脱离。此行动删除子进程中的所有数据库服务器连接。然后,
子进程可建立自己的至数据库服务器的连接。

请随同 fork() 系统调用使用 sqldetach() 函数。当您以数据库服务器连接创建来自应
用程序进程的子进程时,函数调用排序如下:
调用来自父进程的 fork() 来创建父进程的副本(子进程)。现在,父子同时分享至数
据库服务器的相同的连接。
调用来自子进程的 sqldetach(),来将子进程从数据库服务器脱离。此调用关闭子进程
中的连接。

限制:
您不可在 vfork() 调用之后使用 sqldetach(),
因为直到调用 exec() 函数为止,
vfork() 才执行真正的进程分叉。在父进程使用 exec() 之后,请不要使用 sqldetach();当

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 938 -
exec() 启动子进程时,该子进程不继承父进程建立了的连接。

对 sqldetach() 函数的调用不影响父进程的数据库服务器会话。
因此,
在子进程中执行
sqldetach() 之后,父进程保持任何打开的游标、事务或数据库,且子进程不拥有数据库服
务器会话或数据库服务器连接。

当您从父进程调用 sqlexit() 函数时,
该函数删除父进程中的连接,
但不影响子进程中
的连接。
类似地,
当您从子进程调用 sqlexit() 时,
该函数仅删除子连接;
它不影响父连接。
在 sqlexit() 函数关闭连接之前,它回滚任何打开的事务。

如果您从子进程执行 DISCONNECT 语句,则您从数据库服务器断开该进程的连接,
并终止对应于那些连接的数据库会话。如果任何事务是打开的,则 DISCONNECT 失败。


在子进程应用程序调用 sqldetach() 之前,如果它仅有隐式的连接,则执行下一 SQL
语句,或执行下一 sqlstart() 库函数,会重新建立至缺省的数据库服务器的隐式的连接。如
果该应用程序已建立了一个或多个显式的连接,则在您执行任何其他 SQL 语句之前,必
须发出 CONNECT 语句。

sqldetach 演示程序说明如何使用 sqldetach() 函数。

返回代码
0
sqldetach() 调用成功。
<0
sqldetach() 调用不成功。

示例

demo 目录中的 sqldetach.ec 文件包含此样例程序。
/*
* sqldetach.ec *

This program demonstrates how to detach a child process from a parent process using the
ESQL/C sqldetach() library function.

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 939 -
*/

main()
{
EXEC SQL BEGIN DECLARE SECTION;
mint pa;
EXEC SQL END DECLARE SECTION;

printf("SQLDETACH Sample ESQL Program running.\n\n");

printf("Beginning execution of parent process.\n\n");
printf("Connecting to default server...\n");
EXEC SQL connect to default;
chk("CONNECT");
printf("\n");

printf("Creating database 'aa'...\n");
EXEC SQL create database aa;
chk("CREATE DATABASE");
printf("\n");

printf("Creating table 'tab1'...\n");
EXEC SQL create table tab1 (a integer);
chk("CREATE TABLE");
printf("\n");

printf("Inserting 4 rows into 'tab1'...\n");
EXEC SQL insert into tab1 values (1);
chk("INSERT #1");
EXEC SQL insert into tab1 values (2);
chk("INSERT #2");
EXEC SQL insert into tab1 values (3);
chk("INSERT #3");

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 940 -
EXEC SQL insert into tab1 values (4);
chk("INSERT #4");
printf("\n");

printf("Selecting rows from 'tab1' table...\n");
EXEC SQL declare c cursor for select * from tab1;
chk("DECLARE");

EXEC SQL open c;
chk("OPEN");

printf("\nForking child process...\n");
fork_child();

printf("\nFetching row from cursor 'c'...\n");
EXEC SQL fetch c into $pa;
chk("Parent FETCH");
if (sqlca.sqlcode == 0)
printf("Value selected from 'c' = %d.\n", pa);
printf("\n");

printf("Cleaning up...\n");
EXEC SQL close database;
chk("CLOSE DATABASE");
EXEC SQL drop database aa;
chk("DROP DATABASE");
EXEC SQL disconnect all;
chk("DISCONNECT");

printf("\nEnding execution of parent process.\n");
printf("\nSQLDETACH Sample Program over.\n\n");
}


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 941 -
fork_child()
{
mint rc, status, pid;

EXEC SQL BEGIN DECLARE SECTION;
mint cnt, ca;
EXEC SQL END DECLARE SECTION;

pid = fork();
if (pid < 0)
printf("can't fork child.\n");

else if (pid == 0)
{
printf("\n*******************************\n");
printf("* Beginning execution of child process.\n");
rc = sqldetach();
printf("* sqldetach() call returns %d.\n", rc);

/* Verify that the child is not longer using the parent's connection and has not inherited the
parent's connection environment.
*/
printf("* Trying to fetch row from cursor 'c'...\n");
EXEC SQL fetch c into $ca;
chk("* Child FETCH");
if (sqlca.sqlcode == 0)
printf("* Value from 'c' = %d.\n", ca);

/* startup a connection for the child, since
* it doesn't have one.
*/
printf("\n* Establish a connection, since child doesn't have one\n");
printf("* Connecting to database 'aa'...\n");

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 942 -
EXEC SQL connect to 'aa';
chk("* CONNECT");
printf("* \n");
printf("* Determining number of rows in 'tab1'...\n");
EXEC SQL select count(*) into $cnt from tab1;
chk("* SELECT");
if (sqlca.sqlcode == 0)
printf("* Number of entries in 'tab1' = %d.\n", cnt);
printf("* \n");

printf("* Disconnecting from 'aa' database...\n");
EXEC SQL disconnect current;
chk("* DISCONNECT");
printf("* \n");
printf("* Ending execution of child process.\n");
printf("*******************************\n");

exit();
}

/* wait for child process to finish */
while ((rc = wait(&status)) != pid && rc != -1);

}

chk(s)
char *s;
{
mint msglen;
char buf1[200], buf2[200];

if (SQLCODE == 0)
{

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 943 -
printf("%s was successful\n", s);
return;
}
printf("\n%s:\n", s);
if (SQLCODE)
{
printf("\tSQLCODE = %6d: ", SQLCODE);
rgetlmsg(SQLCODE, buf1, sizeof(buf1), &msglen);
sprintf(buf2, buf1, sqlca.sqlerrm);
printf(buf2);
if (sqlca.sqlerrd[1])
{
printf("\tISAM Error = %6hd: ", sqlca.sqlerrd[1]);
rgetlmsg(sqlca.sqlerrd[1], buf1, sizeof(buf1), &msglen);
sprintf(buf2, buf1, sqlca.sqlerrm);
printf(buf2);
}
}
}
输出

SQLDETACH Sample ESQL Program running.
Beginning execution of parent process.

Connecting to default server...
CONNECT was successful

Creating database 'aa'...
CREATE DATABASE was successful

Creating table 'tab1'...
CREATE TABLE was successful


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 944 -
Inserting 4 rows into 'tab1'...
INSERT #1 was successful
INSERT #2 was successful
INSERT #3 was successful
INSERT #4 was successful

Selecting rows from 'tab1' table...
DECLARE was successful
OPEN was successful

Forking child process...

**********************************************
* Beginning execution of child process.
* sqldetach() call returns 0.
* Trying to fetch row from cursor 'c'...

* Child FETCH:
SQLCODE = -404: The cursor or statement is not available.

* Establish a connection, since child doesn't have one
* Connecting to database 'aa'...
* CONNECT was successful
*
* Determining number of rows in 'tab1'...
* SELECT was successful
* Number of entries in 'tab1' = 4.
*
* Disconnecting from 'aa' database...
* DISCONNECT was successful
*
* Ending execution of child process.
**********************************************

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 945 -
SQLDETACH Sample ESQL Program running.

Beginning execution of parent process.

Connecting to default server...
CONNECT was successful

Creating database 'aa'...
CREATE DATABASE was successful

Creating table 'tab1'...

CREATE TABLE was successful

Inserting 4 rows into 'tab1'...
INSERT #1 was successful
INSERT #2 was successful
INSERT #3 was successful
INSERT #4 was successful

Selecting rows from 'tab1' table...
DECLARE was successful
OPEN was successful

Forking child process...

Fetching row from cursor 'c'...
Parent FETCH was successful
Value selected from 'c' = 1.

Cleaning up...
CLOSE DATABASE was successful
DROP DATABASE was successful

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 946 -
DISCONNECT was successful

Ending execution of parent process.

SQLDETACH Sample Program over.