GBase 8s SQL 指南:教程 / SQL 编程 |
反复地执行与数据定义相关的一个任务:授予和撤销权限。由于必须频繁地授予和撤销权限,有可能是由不熟悉 SQL 的用户操作,因此一种策略是将 GRANT 和 REVOKE 语句打包在程序中,来提供给他们更简单、更方便的用户接口。
您可能至少需要基于程序输入(来自于用户、命令行参数或文件)提供这些值的一部分,但都不可以主变量的形式提供。这些语句的语法不允许在任何位置使用主变量。
一个替代方案是将语句的各个部分组合到字符串内,并准备和执行组合好的语句。程序输入可作为字符串合并到准备好的语句内。
char priv_to_grant[100]; char table_name[20]; char user_id[20]; table_grant(priv_to_grant, table_name, user_id) char *priv_to_grant; char *table_name; char *user_id; { EXEC SQL BEGIN DECLARE SECTION; char grant_stmt[200]; EXEC SQL END DECLARE SECTION; sprintf(grant_stmt, " GRANT %s ON %s TO %s", priv_to_grant, table_name, user_id); PREPARE the_grant FROM :grant_stmt; if(SQLCODE == 0) EXEC SQL EXECUTE the_grant; else printf("Sorry, got error # %d attempting %s", SQLCODE, grant_stmt); EXEC SQL FREE the_grant; }
table_grant(priv_to_grant, table_name, user_id) char *priv_to_grant; char *table_name; char *user_id;
EXEC SQL BEGIN DECLARE SECTION; char grant_stmt[200]; EXEC SQL END DECLARE SECTION;
sprintf(grant_stmt, " GRANT %s ON %s TO %s",priv_to_grant, table_name, user_id);
结果是部分由程序输入组成的完整的 GRANT 语句。PREPARE 语句将组合的语句文本传给数据库服务器进行解析。
if(SQLCODE == 0) EXEC SQL EXECUTE the_grant; else printf("Sorry, got error # %d attempting %s", SQLCODE, grant_stmt);
如果准备成功,则 SQLCODE = = 0,下一步执行准备好的语句。