SQL 语言环境支持的以下数据类型需要进行特殊考虑。
可以将大型对象文件 (LOB) 存储在 DB2 数据库中, 并使用针对您的 Web 应用程序的 SQL 语言环境来对它们进行访问。
SQL 语言环境不会将大型对象存储在处理变量 的 Net.Data 表格中(例如 V1 或 V2),当 SQL 查询在结果集中返回 LOB 时,也不将大型对象存储 在 Net.Data 表格字段中。相反,当 Net.Data 遇到 LOB 时,它将 LOB 存储在 Net.Data 所创建的 一个文件中。该文件位于 HTML_PATH 路径配置变量指定的目录中。Net.Data 表格字段和表格处理变量 的值被设置为文件的路径。对该文件的访问被限于运行 Net.Data 的用户 ID。
存储 LOB 的文件名是动态构造的,具有如下格式:
name[.extension]
其中:
如果无法识别 BLOB 的对象类型,则文件名上不添加任何扩展名。
当宏文件中引用 LOB 时,SQL 语言环境将返回文件名(在 LOB 文件名前添加 字符串 /tmplobs/),使用以下语法:
/tmplobs/name.[extension]
规划技巧:对于每个返回 LOB 的查询,在 HTML_PATH 路径配置变量 指定的目录中都将创建文件。在使用 LOB 时请考虑系统限度,因为它们会很块地消耗资源。您可能希望创建 一个批处理程序来定期对该目录进行清除。建议您使用 DataLink,它将消除 SQL 语言环境 在目录中存储文件的需要,从而提高性能,并大大减少对系统资源的使用。
例子:应用程序用户必须单击文件名才能调用察看器, 因为该应用程序使用 MPEG 声频文件 (.MPA)。SQL 语言环境不能识别这种文件类型,因此使用了一个 EXEC 变量 来将扩展名附加到文件。
%DEFINE{
lobpath = "@DTW_RGETINIDATA("HTML_PATH")"
filename = "@DTW_RREPLACE($(V3), "/tmplobs/", "", "1", "F")"
myFile=%EXEC "REN '$(lobpath)/$(filename)' '$(filename).mpa'"
%}
%{ where rename is the rename command on your operating system %}
%FUNCTION(DTW_SQL) queryData() {
SELECT Name, IDPhoto, Voice FROM RepProfile
%REPORT{
<P>Here is the information you selected:<P>
%ROW{
$(myFile)
$(V1) Voice sample <IMG SRC="$(V2)">
<A HREF="$(V3).mpa")>Voice sample</A><P>
%}
%}
%}
%HTML(REPORT){
@queryData()
%}
queryData 函数返回以下 HTML 输出:
<P>Here are the images you selected:<P> Kinson Yamamoto <IMG SRC="/tmplobs/p2345n1.gif"> <A HREF="/tmplobs/p2345n2.mpa">Voice sample</A><P> Merilee Lau <IMG SRC="/tmplobs/p2345n3.gif"> <A HREF="/tmplobs/p2345n4.mpa">Voice sample</A><P>
先前例子中的 REPORT 块使用隐式表格变量 V1、V2 和 V3。
对于 LOB 的访问权限: 请确保运行 Web 服务器的用户 ID 对于 HTML_PATH 指定的目录具有写的权限。
DataLink 是一种基本构造块,用于扩展可以存储在数据库文件中的数据类型。通过使用 DataLink, 存储在列中的实际数据便只是一个指向文件的指针了。这个文件可以是任何类型的文件;图象文件、语音记录或 文本文件。DataLink 存储 URL 以便分辨文件的位置。
DATALINK 数据类型需要使用 DataLink 文件管理器。有关 DataLink 文件管理器的更多信息, 请参阅针对您的操作系统的 DataLink 文档。使用 DATALINK 数据类型之前,必须确保 Web 服务器 对 DB2 文件管理器服务器所管理的文件系统具有访问权。
当 SQL 查询使用 DataLink 返回结果集时,将用具有 READ PERMISSION DB DataLink 选项 的 FILE LINK CONTROL 创建 DataLink 列,DataLink 列中的文件路径包含一个访问令牌。DB2 使用 访问令牌来授予对文件的访问权。没有这个访问令牌,所有对该文件的访问都将因权限违例而失败。当然, 访问令牌中可能包含要返回给浏览器的 URL 中不能使用的字符,例如分号字符 (;)。例如:
/datalink/pics/UN1B;0YPVKGG346KEBE;baibien.jpg
URL 无效,因为它包含分号 (;) 字符。要使该 URL 有效,必须使用 Net.Data 内部函数 DTW_URLESCSEQ 对 该分号进行编码。当然,有些字符串处理必须在使用此函数之前执行,因为这个函数也将对斜线 (/) 进行编码。
可以编写一个 Net.Data MACRO_FUNCTION 来自动进行字符串处理并使用 DTW_URLESCSEQ 函数。在每个 从 DATALINK 数据类型列中检索数据的宏中使用此技术。
例 1:一个使 DB2 UDB 返回的 URL 自动编码的 MACRO_FUNCTION
%{ TO DO: Apply DTW_URLESCSEQ to a DATALINK URL to make it a valid URL.
IN: DATALINK URL from DB2 File Manager column.
RETURN: The URL with token portion is URL encoded
%}
%MACRO_FUNCTION encodeDataLink(in DLURL) {
@DTW_rCONCAT( @DTW_rDELSTR( DLURL,
@DTW_rADD(@DTW_rLASTPOS("/", DLURL), "1" ) ),
@DTW_rURLESCSEQ( @DTW_rSUBSTR(DLURL,
@DTW_rADD( @DTW_rLASTPOS("/", DLURL), "1" ) ) ) )
%}
在使用此 MACRO_FUNCTION 之后,URL 即被正确编码,DATALINK 列中指定的文件就可以在 任何 Web 浏览器上引用。
例 2:一个 Net.Data 宏,指定返回 DATALINK URL 的 SQL 查询
%FUNCTION(DTW_SQL) myQuery() {
select name, DLURLCOMPLETE(picture) from myTable where name like '%river%'
%REPORT{
%ROW{
<p> $(V1) <br>
Before Encoding: $(V2) <br>
After Encoding: @encodeDataLInk($(V2)) <br>
Make HREF: <a href="@encodeDataLink($(V2))"> click here </a> <br> <p>
%}
%}
%}
请注意,这里使用了 DataLink “文件管理器”函数。函数 dlurlcomplete 返回一个完整的 URL。