返回首页

gbase数据、南大通用产品文档:GBase8sGOTO语句和异常处理

更新日期:2024年09月11日

GOTO语句可以从异常处理程序跳转到父块。例如:
CREATE TABLE t2(c1 VARCHAR(200));
CREATE OR REPLACE PROCEDURE sp1(X INT) IS
begin
<>
DECLARE
-- Raises an error:
i int := 10;
BEGIN
i := 10 / x;
INSERT INTO t2 VALUES('now x is not 0');

GBase 8s PL/SQL手册
南大通用数据技术股份有限公司
- 131 -


EXCEPTION
WHEN zero_divide THEN
INSERT INTO t2 VALUES('in sub-block, zero_divide');
x := 10;
GOTO label1;
END;
end;

CALL sp1(0);
SELECT * FROM t2;

GBase 8s PL/SQL手册
南大通用数据技术股份有限公司
- 132 -


#ifdef WIN32
# include
# define sleep(x) Sleep(x*1000)
#else
# include
#endif
#include
#include
#include
#include
#include
#include "sqlgbase.h"

#define isSuc(result) ((result) == SQL_SUCCESS || (result) ==
SQL_SUCCESS_WITH_INFO)
#define FOR_TIMES 50
#define CON_NUM 50

SQLHANDLE henv;
int seg;
#ifdef WIN32

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

- 61 -
CRITICAL_SECTION thread_quit_lock;
#define THREAD_ID() GetCurrentThreadId()
#else
pthread_mutex_t thread_quit_lock;
#define THREAD_ID() pthread_self()
#endif

void getError(SQLSMALLINT type, SQLHANDLE handle)
{
SQLCHAR sqlstate[1024];
SQLCHAR errormes[1024];
SQLINTEGER numerror;
SQLSMALLINT errlen;
SQLGetDiagRec(type, handle, 1, sqlstate, &numerror, errormes,
1024, &errlen);
printf("sqlstate:%s\terrmsg:%s\terrno:%d\n",sqlstate,
errormes, numerror);
}

char* connStr = "DRIVER=GBase 8a ODBC 8.3
Driver;UID=gbase;PWD=gbase20110531;"


"SERVER={192.168.9.173;192.168.9.174;192.168.9.175};DATABASE
=test; PORT=5258;"




"GCLUSTER_ID=aaa;POOL_MAX_ACTIVE_SIZE=70;POOL_MAX_IDLE=65;"




"POOL_INIT_SIZE=10;"




"POOL_TEST_BORROW=0;"




"POOL_LBS=1;"




"POOL_CHECKOUT_TIMEOUT=5000;"




"POOL_MANAGER=1;"




"POOL_TEST_INVALID_CONN_PERIOD=2000;"




"POOL_KEEP_IDLE=1; POOL_MIN_IDLE=12;"

GBase 8a 程序员手册ODBC 篇


- 62 -

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




"POOL_CLEAR_OVERDUE=1; POOL_USED_LIFE=400000;
POOL_IDLE_LIFE=0;";

#ifdef WIN32
DWORD WINAPI thread_bf(LPVOID arg)
#else
int thread_bf(void* arg)
#endif
{
SQLHDBC hdbc;
SQLHANDLE hsmt;
int sret = 0;
int i =0 ;
clock_t t1, t2;
time_t t;
int rc = 0;

while(i < FOR_TIMES)
{
t1 = t2 = clock();
SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);
sret = SQLDriverConnect(hdbc,
NULL, connStr, SQL_NTS,NULL,
0, NULL, 0);
if (!isSuc(sret))
{
getError(SQL_HANDLE_DBC, hdbc);
}
else
{
t2 = clock();
time(&t);
printf("thread id %u\t\tconnect success! use %lu
msec\t%s.\n",THREAD_ID(), (t2 - t1), ctime(&t));

rc = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hsmt);
if (rc == SQL_SUCCESS)
{

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

- 63 -
SQLExecDirect(hsmt,
"show
databases",
strlen("show
databases"));
SQLFreeHandle(SQL_HANDLE_STMT, hsmt);
}



SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
}
i++;
}

#ifdef WIN32

EnterCriticalSection(&thread_quit_lock);
seg--;
LeaveCriticalSection(&thread_quit_lock);
#else
pthread_mutex_lock(&thread_quit_lock);
seg--;
pthread_mutex_unlock(&thread_quit_lock);
#endif
return 0;
}

void t1_bf()
{
SQLHDBC hdbc;
int rc = 0, i = 0;

#ifdef WIN32
InitializeCriticalSection(&thread_quit_lock);
#else
pthread_mutex_init(&thread_quit_lock, NULL);
#endif
SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv);
SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_O
DBC3,0);


GBase 8a 程序员手册ODBC 篇


- 64 -

南大通用数据技术股份有限公司
seg = CON_NUM;
while(i{
#ifdef WIN32
CreateThread(NULL, 0, thread_bf, NULL, 0, NULL);
#else
pthread_t thread;
pthread_create(&thread, 0, thread_bf, NULL);
#endif

i++;
}

while(seg > 0)sleep(1);
SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);
rc
=
SQLDriverConnect(hdbc,
NULL,
connStr,
SQL_NTS,NULL,
0,
NULL,
0);
if (!isSuc(rc))
{
getError(SQL_HANDLE_DBC, hdbc);
return;
}
SQLSetConnectAttr(hdbc, SQL_ATTR_GBASE_POOL_FREE,
SQL_FREE_GBASE_POOL, NULL);
SQLDisconnect(hdbc);

SQLFreeHandle(SQL_HANDLE_ENV, henv);
}

取值:sql mode 字符串
默认值:
PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY,
NO_AUTO_VALUE_ON_ZERO,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_
ZERO_DATE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,PAD_CH
AR_TO_FULL_LENGTH
说明:SQL MODE 常用的是ONLY_FULL_GROUP_BY
ONLY_FULL_GROUP_BY:即严格group by 模式
ANSI_QUOTES:松散模式,类型不一致时也可以插入
STRICT_ALL_TABLES,STRICT_TRANS_TABLE:严格模式,如果类型不同中
断插入。
修改方式:
可使用set 语句修改值也可在配置文件中修改值。
适用于session、
global
范围均可。

GBase 8a MPP Cluster 参数手册
文档版本2022-06-07
南大通用数据技术股份有限公司
72