3.编写PSP网页,文件名为show.psp。
程序说明:第1行标识出该页为PL/SQL语言文件。第2行指出即将为该页面生成的PL/SQL过程名,最后PL/SQL页面将要调用数据库中的该过程来显示数据,如果省略该行则以文件名作为缺省的过程名。第3行为即将生成的过程的输入或输出参数,以标记说明,default="1001"说明该参数为可选参数,注意,即使是数值数据类型,也要用双引号括起。第4至11行为该PSP网页的全局参数,同时也是过程show的局部参数,以标记表示。接下来以全局参数调用已经存储在数据库中的过程show_student,程序代码前后分别被置以标记。当然也可将第二步中的过程show_student的编码直接写入以标记括起的程序中,但是为了实现代码与内容的分离,尽量不要把它们混在一起。这样做的好处是分离业务逻辑与表示层,使得程序结构清晰,因为可能还有其它PSP页面调用该存储过程。在页面显示部分对全局参数的调用格式为标记,这也是输出标记,该标记可以实现字符串的连接和变量的计算,如通过psp_id的加减1达到翻页目的。在链接标记<a href="show?id=<%=psp_id-1%>">中,注意show为已经存储的过程,用"show?id="的格式调用过程并输入参数。
<%@ show language="PL/SQL"%> <%@ plsql procedure="show" %> <%@ plsql parameter="id" type="NUMBER" default="1001"%> <%! psp_id student.id%TYPE:=id;%> <%! psp_name student.name%TYPE;%> <%! psp_dob student.dob%TYPE;%> <%! psp_gender student.gender%TYPE;%> <%! psp_classyr student.classyr%TYPE;%> <%! psp_major student.major%TYPE;%> <%! psp_email student.email%TYPE;%> <%! psp_photo student.photo%TYPE;%> <% show_student ( p_id => psp_id , p_name => psp_name , p_dob => psp_dob , p_gender => psp_gender , p_classyr => psp_classyr , p_major => psp_major , p_email => psp_email , p_photo => psp_photo ); %> <html> <head> <title>学生信息</title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> </head> <body bgcolor="#999900" text="#FFFFFF" link="#3366FF"> <table width="80%" border="0" cellspacing="2" cellpadding="2" align="center" height="400"> <tr> <td colspan="3" height="72"> <div align="center"><font size="+3"><b>学生信息</b></font></div> </td> </tr> <tr> <td width="40%" height="195" rowspan="8"><img src="admin_/images/<%=psp_photo%>" width="172" height="191" align="middle"></td> <td colspan="2" height="30">编号为<%=psp_id%>的学生的资料如下:</td> </tr> <tr> <td colspan="2" height="30">编号:<%=psp_id%></td> </tr> <tr> <td colspan="2" height="30">姓名:<%=psp_name%></td> </tr> <tr> <td colspan="2" height="30">出生日期:<%=psp_dob%></td> </tr> <tr> <td colspan="2" height="30">性别:<%=psp_gender%></td> </tr> <tr> <td colspan="2" height="30">年级:<%=psp_classyr%></td> </tr> <tr> <td colspan="2" height="30">主修课程:<%=psp_major%></td> </tr> <tr> <td colspan="2" height="30">电子邮件:<%=psp_email%></td> </tr> <tr> <td width="40%" height="74"> <div align="center"></div> </td> <td width="46%" height="74"> <div align="center"><a href="show?id=<%=psp_id-1%>">上一页</a> <a href="show?id=<%=psp_id+1%>">下一页</a></div> </td> <td height="74" width="14%"> <div align="center"></div> </td> </tr> </table> </body> </html> |
4.使用Oracle命令行程序
使用Oracle命令程序$ORACLE_HOME\bin\loadpsp.exe将第3步编写的PSP页面(show.psp)载入数据库的cf/cf模式下。loadpsp.exe程序的所有选项格式如下:
l:\oracle\ora90\bin\loadpsp.exe
usage: loadpsp [-replace] -user <logon> [<page1><page2> ...]
where <logon> ::= <username>/<password>[@<connect_string>]
本例中使用如下命令:
l:\oracle\ora90\bin\loadpsp -replace -user cf/cf show.psp
"show.psp":procedure "show" created.
5.载入show.psp页面后,在数据库的cf/cf模式下生成存储过程show(该过程名由网页show.psp中的<%@ plsql procedure="show" %>程序决定),过程中已经加入HTP进程包来调用参数。
以下是引用片段: PROCEDURE show ( id IN NUMBER default 1001) AS psp_id student.id%TYPE:=id; psp_name student.name%TYPE; psp_dob student.dob%TYPE; psp_gender student.gender%TYPE; psp_classyr student.classyr%TYPE; psp_major student.major%TYPE; psp_email student.email%TYPE; psp_photo student.photo%TYPE; BEGIN NULL; htp.prn(’ ’); htp.prn(’ ’); htp.prn(’ ’); htp.prn(’ ’); htp.prn(’ ’); htp.prn(’ ’); htp.prn(’ ’); htp.prn(’ ’); htp.prn(’ ’); htp.prn(’ ’); htp.prn(’ ’); show_student ( p_id => psp_id , p_name => psp_name , p_dob => psp_dob , p_gender => psp_gender , p_classyr => psp_classyr , p_major => psp_major , p_email => psp_email , p_photo => psp_photo ); htp.prn(’ <html> <head> <title>学生信息</title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> </head> <body bgcolor="#999900" text="#FFFFFF" link="#3366FF"> <table width="80%" border="0" cellspacing="2" cellpadding="2" align="center" height="400"> <tr> <td colspan="3" height="72"> <div align="center"><font size="+3"><b>学生信息</b></font></div> </td> </tr> <tr> <td width="40%" height="195" rowspan="8"><img src="admin_/images/’); htp.prn(psp_photo); htp.prn(’" width="172" height="191" align="middle"></td> <td colspan="2" height="30">编号为’); htp.prn(psp_id); htp.prn(’的学生的资料如下:</td> </tr> <tr> <td colspan="2" height="30">编号:’); htp.prn(psp_id); htp.prn(’</td> </tr> <tr> <td colspan="2" height="30">姓名:’); htp.prn(psp_name); htp.prn(’</td> </tr> <tr> <td colspan="2" height="30">出生日期:’); htp.prn(psp_dob); htp.prn(’</td> </tr> <tr> <td colspan="2" height="30">性别:’); htp.prn(psp_gender); htp.prn(’</td> </tr> <tr> <td colspan="2" height="30">年级:’); htp.prn(psp_classyr); htp.prn(’</td> </tr> <tr> <td colspan="2" height="30">主修课程:’); htp.prn(psp_major); htp.prn(’</td> </tr> <tr> <td colspan="2" height="30">电子邮件:’); htp.prn(psp_email); htp.prn(’</td> </tr> <tr> <td width="40%" height="74"> <div align="center"></div> </td> <td width="46%" height="74"> <div align="center"><a href="show?id=’); htp.prn(psp_id-1); htp.prn(’">上一页</a> <a href="show?id=’); htp.prn(psp_id+1); htp.prn(’">下一页</a></div> </td> <td height="74" width="14%"> <div align="center"></div> </td> </tr> </table> </body> </html> ’); END; |
6.浏览网址:http://localhost/pls/simpledad/show,即可看到如图1所示的页面,可点击"上一页"或"下一页"浏览相临记录。