GBase 8s SQL 指南:教程———9 SQL编程

9 SQL编程

前面的示例似乎将SQL作为一种交互的计算机语言;即,似乎您可以直接将SELECT语 句输入数据库服务器内并查看回滚给您的数据行。

当然,情况并非如此。在您与数据库服务器之间存在许多软件层。在可显示数据之前,数 据库服务器以必须格式化的二进制形式保留数据。它不会立即返回大量数据;当程序请求 它时,它一次返回一行。

您可使用DB-Access通过交互的访问,通过以诸如GBase 8s ESQ L/C这样的SQL API编 写的应用程序,或通过诸如SPL这样的应用程序语言,来访问您的数据库中的信息。

几乎所有程序都可包含SQL语句,执行它们,并从数据库服务器检索数据。本章节说明 如何执行这些活动并指示您可如何编写执行它们的程序。

本章节介绍使用任何语言进行SQL编程的常见概念。在您可以特定的编程语言编写成功 的程序之前,您必须先熟悉那种语言。然后,由于每种语言中处理的细节都不同,因此您 必须熟悉特定于那种语言的GBase 8s SQL API的出版物。

9.1程序中的SQL

您可以任意几种语言编写程序,并将SQL语句混合在程序的其他语句之中,就如同它们 是那种编程语言的一般语句似的。将这些SQL语句嵌入在程序中,且该程序包含嵌入式 SQL其通常缩写为ESQL

9.1.1 SQL API 中的 SQL

ESQL产品为GBase 8s SQL API应用程序编程接口)。GBaseC编程语言产生SQL API

下图展示SQL API产品如何工作。您编写您在其中将SQL语句处理作为可执行代码的源 程序。嵌入式SQL预处理器处理您的源程序,它是一个定位嵌入式SQL语句并将它们转 换为一系列过程调用和特殊的数据结构的程序。

图:使用嵌入式SQL语句处理程序的概述

 

然后,转换了的源程序传递到编程语言编译器。在将它与静态的或动态的SQL API过程库 相链接之后,编译器输出称为可执行的程序。当程序运行时,调用该SQL API库过程;它 们与数据库服务器建立通信来执行SQL操作。

如果您将您的可执行程序链接到线程库包,则您可开发GBase 8s ESQL/C多线程应用程序。 多线程应用程序可具有控制的许多线程。它将一个进程分割成多个执行线程,每一线程独 立地运行。多线程的GBase 8s ESQL/C应用程序的主要优势在于,每一线程可同时具有与 数据库服务器的许多活动的连接。而非线程的GBase 8s ESQL/C应用程序可创建与一个或 多个数据库的许多连接,它一次仅可有一个连接是活动的。对于多线程的GBase 8s ESQL/C应用程序,每一线程可有一个活动的连接,且每个应用程序可有许多线程。

要获取关于多线程的应用程序的更多信息,请参阅《GBase 8s ESQL/C程序员手册》。

9.1.2应用程序语言中的SQL

尽管GBase 8s SQL API产品允许您将SQL嵌入在主语言中,但某些语言包括SQL作为 它们的语句集的固有部分。GBase 8s "存储过程语言” SPL使用SQL作为它的语句

集的固有部分。您使用SQL API产品编写应用程序。您使用SPL编写例程,例程与数据 库一起存储并从应用程序调用它。

9.1.3静态的嵌入

您可通过静态的嵌入或动态的嵌入将SQL语句引入程序。比较简单和常见的方式是通过 静态的嵌入,其意味着编写SQL语句作为代码的一部分。该语句为静态的,是因为它们 是源文本的固定部分。要获取关于静态的嵌入的更多信息,请参阅检索单行和检索多行。

9.1.4动态的语句

有些应用程序要求有动态地组合SQL语句的能力,以响应用户输入。例如,程序可能必 须选择不同的列或将不同的标准应用到行,这依赖于用户想要什么。

使用动态的SQL,程序在内存中将SQL语句组合成字符串,并将它传递给数据库服务器 来执行。动态的语句不是代码的一部分;在执行期间在内存中构造它们。要了解更多信息, 请参阅动态SQL

9.1.5程序变量和主变量

应用程序可在SQL语句内使用程序变量。在SPL中,当语法允许时,您可在SQL语句 中放置程序变量。例如,DELETE语句可在它的WHERE子句中使用程序变量。

下列代码示例展示SPL中的程序变量。

CREATE PROCEDURE delete_item (drop_number INT)

DELETE FROM items WHERE order_num = drop_number

在使用嵌入式SQL语句的应用程序中,SQL语句可引用程序变量的内容。在嵌入式SQL 语句中命名的程序变量称为主变量,因为在程序中将该SQL语句认作是客人。

下列示例展示DELETE语句,当将它嵌入在GBase 8s ESQL/C源程序中时,它可能出现:

EXEC SQL delete FROM items

WHERE order_num = :onum;

在此程序中,您看到常规的DELETE语句,如同修改数据描述的那样。当执行该GBase 8s ESQL/C程序时,删除items表的一行;还可删除多行。

该语句包含一个新的特性。它将order_num列与编写为onum的一项相比较,这是主变 量的名称。

SQL API产品提供一种分隔主变量的名称的方式,当它们出现在SQL语句的上下文中时。 在GBase 8s ESQL/C中,可使用美元符号($)或冒号(:)来引入主变量。冒号是符合ANSI 的格式。示例语句请求数据库服务器删除其中的订单编号等于名为:onum的主变量的当前 内容的那些行。在程序中声明了此数值变量并提前分配了值。

GBase 8s ESQL/C中,可使用前导的美元符号($)或关键字EXEC SQL来引入SQL语 句。

在前面的示例中说明的语法的差异很小;重要的是,SQL APISPL语言使您执行下列 任务:

在源程序中嵌入SQL语句,就好像它们是主语言的可执行语句一样。

以使用文字值的方式,在SQL表达式中使用程序变量。

如果您有编程经验,则您可立即看到这些可能性。在该示例中,将要删除的订单号码传到 变量onum中。那个值来自程序可使用的任何源。可从文件读取它,程序可提示用户输入 它,或可从数据库读取它。DELETE语句本身可为子例程的一部分(在此情况下,onum可 为该子例程的参数);可一次或反复地调用该子例程。

总之,当您在程序中嵌入SQL语句时,您可对它们应用主语言的所有功能。您可将SQL语 句隐藏在许多接口之下,且可以多种方式优化SQL函数。

9.2调用数据库服务器

执行SQL语句本质上是作为子例程调用数据库服务器。必须将信息从程序传到数据库服 务器,且必须将信息从数据库服务器返回到程序。

此通讯的部分是通过主变量完成的。您可将在SQL语句中命名的主变量视作对数据库服 务器调用的过程的参数。在前面的示例中,主变量作为WHERE子句的参数。主变量收到 数据库服务器返回的数据,如同检索多行描述的那样。

  1. SQL通信区域

数据库服务器始终在一个称为SQL通信区域”SQLCA )的数据结构中返回结果代码, 以及关于操作结果的其他可能信息。如果数据库服务器在用户定义的例程中执行SQL语 句,则调用应用程序的SQLCA包含在该例程中SQL语句触发的值。

在从表1至表1中罗列SQLCA的主体字段。在编程语言之中,您用来描述诸如 SQLCA这样的数据结构的语法,以及您用来应用其中字段的语法是不同的。要了解详细信 息,请参阅您的SQL API出版物。

特别地,您通过其命名SQLERRDSQLWARN数组的一个元素的下标是不同的。在 GBase 8s ESQL/C中,数组元素从零开始编号,但在其他语言中,从一开始。在本讨论中, 以诸如third这样的特定词命名字段,且您必须将这些词翻译成您的编程语言的语法。

您还可使用GET DIAGNOSTICS语句的SQLSTATE变量来检测、处理和诊断错误。请 参阅SQLSTATE值。

  1. SQLCODE 字段

SQLCODE字段是数据库服务器的主要返回代码。在每个SQL语句之后,将SQLCODE 设置为如下表所示的一个整数值。当那个值为零时,无误地执行该语句。特别地,当假定 一个语句将数据返回到主变量内时,代码零意味着已返回了该数据且可使用它。任何非零 代码都意味着相反的意思。未将有用的数据返回到了主变量。

1. SQLCODE的值

返回值 解释

返回值

解释

值〈0

指定一个错误代码。

=0

指示成功。

0 < 值〈100

DESCRIBE语句之后,表示描述SQL语句的类型的一个整数值。

100

在未返回行的成功查询之后,指示NOT FOUND条件。在INSERT INTO/SELECTUPDATEDELETE SELECT... INTO TEMP 语句未能访 问任何行之后,NOT FOUND还可发生在符合ANSI的数据库中。

数据的结束

当正确地执行语句,但未找到行时,数据库服务器将SQLCODE设置为100。在两种情况 下可发生此情况。

第一种情况涉及使用游标的查询。(检索多行描述使用游标的查询。)在这些查询中,FETCH 语句将来自活动集的每一值检索到内存内。检索最后一行之后,后续的FETCH语句不可 返回任何数据。当发生此情况时,数据库服务器将SQLCODE设置为100,指示数据的结 束,找不到行。

第二种情况涉及不使用游标的查询。在此情况下,当没有行满足查询条件时,数据库服务 器将SQLCODE设置为100。在不符合ANSI的数据库中,仅不返回行的SELECT语句 会导致将SQLCODE设置为100

在符合ANSI的数据库中,如果未返回行,贝U SELECTDELETEUPDATEINSERT 语句都将SQLCODE设置为100

负代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值