




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
程序员应能够装配一个数据集并能处理每次查询一行的数据。设想你推着满满一车自选商品到超级市场的收款台,要求收款员用条形码扫描器一次完成全部物品的扫描。收款员绝对无法控制价格的计算。如果没有逐行处理数据的能力,依赖于应用程序需求的程序员要像的收款员了。从版本6Oracle实现了一种过程处理语言,称为PL/SQL,它使用户能更容易地完成工作。PL/SQL具有与大多数其他程序设计语言相似的编程结构。有两种PL/SL版本:一种是数据库引擎(ngne)部分,另一种是嵌入到许多racle工具中的独立引擎,将它们分别称为数据库PL/SQL和工具PL/SQL。两者非常相似,都具有相同的编程结构、语法和逻辑机制,工具PL/SQL另外增加了用于支持工具需求的语法。例如:在窗体上设置下压式按扭,以定位到屏幕的底部,此动作可用OraceForms系统中的L/SQL来编程实现。本章主要讨论数据库PL/QL。Oracle在何处使用PL/SQL用于Internet的PL/SQL在本章的PL/SQL代码样例中,将用三个点(⋯)来表示省略。此三点并非代码的组成部分,仅表示此处某些代码与所介绍的内容关系不大,没必要列出。可执行(Executable)文件是某种计算机程序设计语言编写的程序文件。用户输入可执行字符集(CharacterSet)描述计算机语言支持以及报表中显示的字符范围。大多数程序设算术运算符(ArithmeticOperator) 关系运算符(RelationalOperator) 个日期以二者之间的关系。常见的关系运算符有:>、<、<>等。变量(Variable) Word)在PL/SQL中有特殊的含义。它们被留下来供Oracle使用,不能用数据类型(DataType)定义数据(或信息)的类别。如日常生活中,我们把信息分为数值和字符。字符类型包括某个特定字母表中所有可表示的字符,数值类型包括由0~9组成的所循环(Loop)退出条件(ExitCondition)是循环的一部分,在循环中测试数据。如果有两个不同的数控制结构(ControlStructure)影响计算机程序的处理流程。如果有两个不同的数据处理对象(StoredObject)是存放在数据库里的PL/SQL代码段,为开发者所使用,最终用户将其当作Oracle系统的操作。在1.3.1之2“过程组件”中曾提到过Oracle的这种过程性功能。过程(Procedure)是一个在数据库中命名了的PL/SQL集合。它可以或不包含输入输函数也是在数据库中的PL/SQL集合。与过程的主要区别是函数必须有一个返回值包(Package)是根据相同功能的特点把过程和函数在一起的集合。所有的内部过程数据库触发器(DatabaseTrigger)也是的可执行PL/SQL。数据库触发器在插入、更改或删除语句之前或之后运行。这些数据语言(DML)的语句在第7章中讨论过。Oracle应用服务器(OracleApplicationServer,缩写为OAS)是一个Oracle数据库的附加工具。OAS可用来建立基于eb的数据库应用并可以在eb请求、PL/SQL引擎和数据库之间作为主要的引擎。HTML(HypertextMarkupLanguage)是基于Web浏览的Internet标准语言。文本和图形HTML标记用来标识HTML文档。标记作为命令传给Web浏览器,例如标识哪个文本页(DynamicWebPage)是一个用命令建立的HTML文档。在OAS中,它通常是WYSIWYG是Web服务器可写入或读出的与Wb浏览器有关的文本字符串。在众多的应用中,用来控制eb和应的计。持久连接是指应用与数据库之间的一种联接状态。前端事务应用当用户完成一个从表单到表单的导航时通常保持一个与数据库连续连接。Web网页的请求结果是一个不需要与数据库持久连接的HTML文档。的使用是用户学习模仿持久连接的一个方法。为什么要学习作者当初刚使用PL/SQL时,在盘上找一个名为plsql己尝试着用SQL*Plus编写了一个PL/SQL模块,获得了成功。不过学习PL/SQL,提高自己技能的最佳途径是使用OracleForms或其前一代产品SQL*Forms版本。在使用Oracle的过程中,数据库触发器、打包和函数都要用PL/SQL编写代码。因此,如果不了解PL/SQL就不可能深入掌握Oracle。PL/SQ是应用下列Oracle工具编程的基础:OracleOracleOracleOracleApplication如果用户想熟练地使用Oracle产品,就必须掌握PL/SQL。如果用户具有使用Ada编程的经验,对PL/SQL就不会陌生。本章介绍了初步的概念和编程结构。只有在更熟悉PL/SQL后,和所有其他程序设计语言一样,PL/SQL也有一个字符集。用户能从键盘上输入的字符都数字0~9符号:()+-*/=!~;:.'@"#$^&_|{}[]其中一些字符用于编程,另一些用作算术运算操作符(除法、加法、幂等)及关系运算符(等于和不等于)。例如:在通信应用程序中,开发人员可能会使用变量名“area_code”存放下面列出了PL/SQL中常用的算术运算符,如果用户使用过其他高级程序设计语言,想必不会陌生。运算 意 下面列出了PL/SQL中常用的关系运算符,如果用户使用过其他程序设计语言,一定见过这些符号:运算 意 符号意义样例(;.项分隔(在例子中,分隔account与Select*from'ifvar1=Rec_read:=--Thisisa/*This,too,isa 变量必须以字母(A~Z)其后跟可选的一个或多个字母、数字(0~9)或特殊字符$、#或_变量长度不超过30先来看几个实例。表8-2给出了样例变量名并评价了其 变量 合法 特殊字符只能是变量 合法 love多于30 保留字可视为PL/SQL 的字符串。在定义变量名时,用户不能使用这些保留字“loop”在PL/SQL中有特殊含义,因此下列代码是的:employeevarchar2(0)loopnumber保留字不能用作变量名。尽管我们不推荐,但如果用户愿意,也可以连接两个保留字形成变量名(如loop_varchar2。完整的PL/SQL保留字表可以在Oracle8i文档中找到。到目前为止,讨论了在PL/SQL中编程时允许使用的字符、变量名和保留字。下面着重讨论数据类型。PLSQL程序用于处理和显示多种类型的数据。和所有计算机软件一样,Oracle也将数据类型分成大量的子类。例如:数可分为整型(不允许有小数)和小数(有一位小数variable_namevarchar2(max_length);vc_fieldvc_fieldvarchar2(10):='STARTVALUE'num_fieldnumber(precision scale);其中 可以有1~38个数字位,而scale表示在precision位数字中小数点后的数num_fieldnumber(12,2表示num_field是一个整数部分最多10位、小数部分最多2date_fielddate,Oracle以DD-MON-YY, 年月日显示为-SEP-0。PL/SQL中编程处理日期必须使用这种格式。是否可以说用户必须用数据库缺省的日期格式除非用户用O_CHAR或TO_DATE?是否能提醒用户用自己的TO_DATE/O_CHAR定义的格式而不赖缺省的期式?那使用程序方和更少依于init.ora设置。 Oracle中还有DD-MON-RR的日期格式,用来表示4位年份以确保Oracle不会省去两位数。关于这种表示的详细情况请参阅SQL*Plus文档集。这种数据类型只有两个值:true或false。在使用boolean变量时,如果为true,则做某事,否则做另外的事。例如,如果试图某公司是否分发了一个10KB的2000年年度预算表,可用boolean变量。若该公司分发了此表,则该变量值为true。下面讨论PL/SQL是如何构成的。利用前几节学到的知识,我们可以建立一些生动有趣的代码实例。PL/SQL提供了一组标准的自从计算机出现以来,开发人员一直在使用的过程化技术:逻辑、循环以及错误处理机制。变量PL/SQL程序是由独的量执代码和常理等部代块写成。PL/SQ可在SQL*Plus窗口中作为一个的块编码。当在数据库中PL/SQL时,子程序包括单元命名的头部分、程序类型的以及可选的in、out和inoutbegin和enddeclare和exception部分是可选的。 createorrecper/生时的程序流程以后,PL/SQL的好处将变得更明显。这将在8.7.4“异常”部分讨论。甚至在被createorreceprocedure(pharmacy_idin
/从Oracle8i开始,Oracle已经引进了自主的事务处理。在PL/SQL的早期版本中,在子程序中的commit和rollback名PL/SQL块、过程、函数或者数据库触发器的部分增加一个自主的事务语句,保证一个在那个块的commit或rollback语句将对从初始化块开始的未完成的事务没有影响。一个块中的自主事务只能由第一个部分组成,自主事务不允许任何嵌套。下面的例子说明了怎样创建一个自主事务块:pramaautonomous_transaction;/ 此PL/SQL块用于定义变量。如果用户熟悉COBOL语言,declare段就相当于COBOL中的工作区。在declare段中,可找到前面讲过的常用数据类型以及下一节要介绍的cursor(游标)当对象(命名块)产生时,declare段自动跟着as关键字。在SQL*Plus编写一个PL/SQL代码块(块)时,用户必须指定DECLARE。createor ceproceduresamp(i_salaryini_cityin datesysdate-;变量能在此初始化status_flagvarchar2(1);mess_textvarchar2(80);temp_buffercursormy_cursorselectemployee_number,last_name,first_namefromemployeea,departmentbwherea.department_number=b.department_numberanda.salary>i_salaryandb.location=i_city;/控制结构是所有程序设计语言的。因为绝大多数系统都用于处理各种不同的情况,三种类型的if1.1. 知“更换执照请到12-G房间”。而在12-G房间,又得到指示“用现金或保付支票(Certifiedcheck)付帐的在1台及2 策的程序控制如表8-3所示。表8-3下一步 2.iftrue,做某事;为FALSE,做另一件不同的事。PLSQL提供三种if逻辑结构供用户测试测试为false,则程序控制转到测试后面的代码。下面的代码说明PL/SQL这个逻辑的实现:ifvar1>10thenvar2:=var1+20;end语句中的测试(>)是在8.“PL/SQl字符集”中讲过的关系运算符。上面的语句也可以用下列语句替换,结果一样。ifnot(var1<=10)thenvar2:=var1+20;endifvar1>10ifvar2<var1thenvar2:=endif;注意,上面代码中的两个endif,分别对应两个不同的if。在PL/SQL中实现if逻辑有两条规则每个if语句块以相应的endif这种结构与if语句非常相似,唯一不同的是在条件为false时,执行跟在else后的一条或多ifvar1>10thenvar2:=var1+20;var2:=var1*var1;endif;注意,同样的控制逻辑也可以用另外的方式表达,使var1+20在else部分执行,而var1的ifvar1<=10thenvar2:=var1*var1;var2:=var1+20;endif;这种结构用于替代嵌套if-then-else结构。前面中的嵌套if-then-else语句可改写为elsif无匹配的endifendif仿佛针对前面的ifvar1>10thenvar2:=var1+20;elsifvar1between7and8thenvar2:=2*var1;end if属于本语句块开始的if,而不属于elsif关键字。注意上列各 注意 我们建议用户编写程序代码时采用缩进格式—跟上和理解逻辑和控制流是比较容易。前面的例子只说明了一个elsif的语句。但是,在任何if语句中可以有许多elsif语句。值得注意的是elseelsif语句的if/*Codesegment1-易读ifvar1<5thenvar2:='y';elsifvar1=5thenvar2:=elsevar2:=null;end /*Codesegment2易读*/ifvar1<5thenvar2y elseifvar1=5:=nulendif;
对前面举过的驾照管理部门DMVPLSQL编程表示其逻辑如下。根据“the_act12a,12b,12g3.循环提供了一遍又一遍直至完成执行同一个处理过程的能力。在现实生活中,从自己的车上卸下杂货的过程中就有两个循环:第一个是将好几个杂货包一个一个搬到家中的重复动168-4所示的逻辑。设置进入循环的条件(2结束循环条件为真(如YES=55YES=设置退出条件(如22编写循环语句时,要注意的问题是一定要确保在退出条件满足时有相应的退出代码。遗憾的是,很多时候开发人员还是写了无终止的循环(当然,我们没有犯过这样的错误,但我们)。在洗发液说明书上可以见到一个没有循环结束的很好例子:冲洗、抹上、再来。在一个联机技术词典中有一个非常精辟的总结说明循环的概念和开发人员最容易犯的错误:(1)LOOP-EXIT-END ifcnt>=100then测试cnt end End (2)LOOP-EXITWHEN-END10end whilecnt100loopwhile End 第三部分:关键字endlooforin部分定义循环的变量endloopforcntin1..3insertintotablvalues('Stillinloop',cnt);endloop;在本章的前面部分,讨论了PL/SQL块结构化编码,介绍了在每个代码块中可以选择的异无论何时发生错误,控制自动地转向执行异常部分。表8-5PL/SQL异常, 如果一个select 检测到有多行数据存在(有关隐式游标参阅8.8.2“隐式游标”) dup_val_on_index 如果某索引中已有某键列值,若还要在该索引中创建该键码值的索引项时,出现此异常。例如:假设一个计费系统以号为键码,当某个应用程序准备创建一个重复的号时,产生此异常value_error 此异常表示指定目标域的长度小于待放入其中的数据的长度。例如:ABCDEFGH”字符串放入定义为“varchar2(6)”的域时,产生此异常当遇到预先定义的错误时,错误被当前块的异常部分相应的when...then语句捕捉。跟在when句子后的then语句的代码被执行。then语句执行后,控制运行到了紧跟着当前块的end语句的行。如果你的错误陷阱代码只是退出内部嵌套的块,程序将继续执行跟在内部块end语句如果在当前块中没有联系错误的when子句并且begin/end块是嵌套的,程序将继续在外部块中寻找错误处理柄,直到找到一个。当错误发生而在任何异常部分没有与之联系的错误处理柄,程序将终止。Oracle给我们提供了“抓住一切”的错误处理柄来捕捉不是预定义的错误。whenothersthen错误处理柄将捕捉所有Oracle预定义错误范围之外的错误。通过Oracle的sqlcode和sqlerrm函数在whenothersthen错误处理柄中显示错误代码和错误信息是一个好主意。规则通常用一个whenothers错误处理柄。如果你在异常部分有其他的错误处理柄,确定whenothers是最后一个。如果你错误地先写whenothers子句,它将捕捉所有的错误,即使是那些 有时,特别是在使用if逻辑时,用户结束测试一个条件。当测试条件为true,什么工作都ifcnt>=90theninsertintotab1values('Stilllessthan90',cnt);endif;关键字nullnull”结构常用于捕捉某个异常,但不做任何处理,然后继续执行下一块代码而不终止程序单元。PL/SQL用游标来管理SQ的select语句。游标是为处理这些语句而分配的一大块内存。有时用户手工定义游标。游标定义类似于其他PL/SQL变量,并且必须遵守同样名规则。在本节中,介绍显式游标(ExplicitCursor)和隐式游标(ImplicitCursor)。显式游标要(Declare),在使用前要打开(Open),使用完毕要关闭(Close)。使用隐式游标时,用户无需执行上述步骤,只要简单地编码select语句并让PL/SQL根据需要处理游标即可。与循环结构结合的显式游标处理返回多于一行的Select语句。与循环结合的游标将允许你显式游标是作为declare段中的一部分进行定义的。所定义的SQL语句必须只包含select语句,并且不能用insert、update或delete关键字。当select语句可能返回零或多于一行时,必须用显式游标。本节介绍如下内容:准备(或打开) 表中,first_name,last_namearchar2(20)而ssn是fnamevarchar2(10);lnamevarchar2(30);ssec_numvarchar2(8);cursorregion_curisselectfirst_name,last_name,ssnwhereregion_number=region_number_in;openfetchregion_curintofname,lname,ssec_num;whileregion_cur%foundifssec_numisnullinsertintoe_msgvalues(pin_in,'noinsertintoe_tabvalues(pin_in,sysdate);endif;fetchregion_curintofname,lname,ssec_num;endloop;closeregion_cur;/found”和“%notfound”检验游标(此处为“mycur”)成功与否。如果游标按照ifmycur%foundendifmycur%notfoundendfetchmycurintotemp_buffer;closemycur;ifmycur%foundend循环执行游标取数操作时,检索出的总数据行数存放在系统变量“%rowcountwhilecounter<100fetchmycurintotemp_buffer;ifmycur%rowcount<=50thenendcounter:=counter+1;endloop;openmycur;fetchmycur;ifmycur%foundcursormycurselect /*in是数字型* /*Last_name是字符型*fromwherepin=pin_in;field1varchar2(10);field2number;openfetchmycurintocursormycurselect fromwherepin=pin_in;field1varchar2(10);field2number;openfetchmycurinto如果试图打开一个已打开的游标或关闭一个已关闭的游标,将会出现错误。因此用户在打开或关闭游标前,若不清楚其状态,应该用“%isopentrue或false,采取相应的动作。ifmycur%isopenthenopenmycur;endif;游标的for缺了游标的for循环的简单介绍,这节不能算完全。这部分要求用户忽视刚刚了解的显式游标。游标的for循环的优点是用户不需打开游标、取数据、测试数据的存在(%found)游标或定义存放数据的变量。相同之处是在部分中的游标定义。当游标被调用时,用Select语句中的同样一些元素创建一条记录。对于由游标检索出的每一行继续执行循环内的全部代码,当没有数据发现时,游标自动地关闭。该方法要求最少的编程和得到很少游标结构前面的例子用游标的forcursorregion_curselectfirst_name,last_name,ssnwhereregion_number=region_number_in;forregion_recinregion_curifregion_rec.ssnisnullinsertintoe_msgvalues(pin_in,'nossnum');insertintoe_tabvalues(pin_in,sysdate);endif;endloop;/ifcounter>=20thenselectlast_nameintolnamewherepin=/每个隐式游标必须有一个intoifthis_value>0selectcount(*)from endif;ifthis_value>0selectcount(*)intocnterfrom endif;和显式游标一样,带有关键字“隐式游标一次仅返回一行,使用时必须检查表 8-5给出的异常。最常见的异常为“too_many_rowsifcounter>=10thenselectageintov_agewherepin=pin_value;whentoo_many_rowsinsertintotabavalues(pin_value,sysdate);whenno_data_foundthenend/通过检查PL/SQL的系统变量“%found”或“%notfound”确认成功或失败。使用显式游标的代码段简单地检测这些系统变量以确定使用显示游标的select语句成功或失败。在学习关系数据库理论时,很有趣的是,由两个或多个表联接构成的查询结果本身就是一个表。常常需要用PL/SQL循环查询一组数据并对一组查询值进行比较。PL/SQL允许将这少的I/O操作。本书很多地方都谈到了数据类型—字符、字母数字、数值等等。而PL/SQL表却是用一个用户定类表来说的考查下程,看看了找目的怎将州装入内的。setserveroutputonsize100000typejust_namesistableofindexbybinary_integer局部表just_name包含了和stateibinary_integer:= nametabforstate_rec (selectnamefromstate)i:=nametab(i):=state_;endloop;/注意PL/SQL表为PL/SQL的版本2.3PL/SQL是SQL*Plus和过程化代码共同构成的一个混合体。注释文本括在斜杠星号(/*declaretfieldvarchar2(20);selectdesc_textintotfieldfromprod /*prod是一个中心查询*/wherepnum='FR4512';/*表的拥有者为 /或declaretfieldvarchar2(20);selectdesc_textintotfieldfrom wherepnum='FR4512'; /或declaretfieldvarchar2(20);selectintotfieldfromprodwherepnum='FR4512';/createorreceprocedure(order_number_inincursordetail_curselectproduct_number,tyfromorder_detailwhereorder_number=order_number_in;v_product_numbernumber;v_tynumber;openfetchdetail_curintov_product_number,v_ty;whiledetail_cur%foundifv_ty>100insertintoorder_audit(order_number,product_number,ty)values(order_number_in,v_product_number,v_ty);endif;"if""Endif"结束fetchdetail_curintoend/Oracle给开发者提供了更容易的工具集合。其中一个例子就是有许多适合编程人员的内置程序包。内置程序包是预先生成的、在数据库中、能在PL/SQL代码块中调用的根据需求可以传递参数的程序,它们用来完成下面的各种任务:把结果输出到终端窗口(dbms_output)直接从操作系统文件读写数据(utl_file)执行动态的SQL(dbms_sql)PL/SQL的功能在于许多预先写好的过程。在8.14.2中的“动态HTML概念”部分,将演示怎样用Web开发工具中的内置程序包创建页。当Oracle编译PL/SQL块时,可能会提示一些错误。如同我们面中所表示的,斜杠(/)结束PL/SQL块,并且传递代码至Oracle。参阅下述出错编译,注意PL/SQL编译时并不显示错误,要显示错误可用语句shoerrors。sql>createor ceproceduretemp(countinnumber)declarecursormycurselectcount(*)fromopenfetch/warning:Procedurecreatedwithcompilationerrors.SQI>shoerrorsErrorsforPROCEDURELINE/COL PLS-00103:Encounteredthesymbol";"whenexpectingoneofthebegindeclareexitforgotoifloopmodnullpragmaraisereturnselectupdatewhile<anidentifier><adouble_quoteddelimited-identifier><abindvariable><<closecurrentdeletefetchlockinsertopenrollbacksavepointsetsqlexecutecommitforall<asingle-quotedSQLsql>createor ceproceduretemp(countinnumber)declarecursormycurselectcount(*)fromopenfetchwarning:ProcedurecreatedwithcompilationSQL>shoerrorsErrorsforPROCEDURETEMP:LINE/COLERROR
PLS-00103:Encounteredthesymbo;l”whenexpectingoneof.into下面将给出三个简单的需求,并示范如何用PL/SQL来完成。每个例子中的注释说明了在本章讲过的一些要点。我们用到的编码风格同时说明了良好的编码技巧。Oracle的保留字已经实例本例将通过社会号码查询其出生日期。注释代码说明PL/SQL如何工作。例中使createorre ceprocedureget_dob(ss_numvarchar2,doboutdate)select
into wheresoc_sec_num=ss_num;exceptionwhenno_data_foundthen /定义的过程有两个包含在括号中的变量,第一个包括要查询其出生日期的人员的社会保险号,第二个接受出生日期并将其返回给本过程的调用者。注意在begin和createorreceprocedureas代码行间无分号。此两行间不允许有分号实例本例用函数而非过程达到上述相同的结果。正如下列所示,函数可以接受多个变量procedure换成了function。createorre cefunctionget_dob(ss_numvarchar2)returndateselectintobirthd wheresoc_sec_num=ss_num;whenno_data_foundthenerror_notify(ss_num);-birthd:=whenothersreturn 实例由于区域代码(AreaCode)分成片段(Piece),某些编号仍然是旧的代码,而某些已是新的。我createorreceprocedureac_switch(oacinnacinl_change_swnumber(3); cursorac_curSelectdistinctpref_3fromwherearea_code=oac;forac_recinac_curl_change_it:='N';selectintol_change_swfromstatic_excwhereareacode=
andpref_3=ac_rec.pref_3;whenno_data_foundl_change_it:=ifl_change_it='Y'
updatesetarea_code=nacwherearea_code=andpref_3=ac_rec.pref_3;endif;endloop;/
注意在游标时distinct的使用。有的读者可能熟悉关键字unique,但它只用在forac_recinac_curloop语句连续取每次与查询语句中的谓词匹配的行存放到ac_recstatic_exc的select语句包含在自身的内部beginend块内,当需要在隐式游标中检查一个或多个异常时可以这样来进行。用于Internet的这节打算简洁地接触Oracle应用程序服务器和怎样编写PL/SQL代码,这种代码把动态HTML文档返回到客户端Web。PL/SQL存放在数据库中。它是一个应用逻辑和产生HTML、这节从通过给出一个对HTML的综述开始,它是什么和它怎样解释。随着对HTML基础的理解,这节剩余部分将试图使你熟悉工具和产生页的方法。通过融合你的PL/SQL、游标和HTML知识,产生一个从数据库中获得与一个传递参数值相匹配的数据的应用程序来结束本节。HTML入被eb浏览器翻译成格式化和显示信息。回忆PC字处理时代的早期,在indows的所见即所得的环境之前,如果看文档的代码,你可能已经看到了“粗体开始”前和一个“粗体结束”后的文本将以粗体打印。这种标识文档的方法用来帮助员工决定打印的文档看起来像什么。HTML用同样的方法标识文本文档。它用任何文本编辑器和本机标识语言来写。同样,eb编写软件也能进行简单的点击操作。下一次,你浏览网页,能从浏览器菜单里页源代码,并能看到各种各样的围绕着正在看的文本和图形的。我们提供的例子可以完全按照你所见到的形式用一个计算机的文本编辑器编写,然后通过在eb浏览器中输出文件的路径来显示。我们有目的地提供一个没有精美的背景和图象的例子,使你可以亲自尝试一下:图8-1显示了HTML代码在Web浏览器如何出现。在继续本节的创建动态HTML之前,下通常成对出现,封装被格式化的文本和图形。第一个定义了标识的开始点,第二个定了格式到里结束例以<html>是HTML。在文本文件的最后一行可以发现是</html>,在这里结束了eb浏览器翻译的HTML。为了在HTM文档中专业化地布置和排列文本和图形,表格是必不可少的。简单地说,表格是一个网格,有产生插入文本和图形的单元格的行和列。我们的例子甚至在一个外部表格的单元格中嵌套了一个表格。表格是通过打开表格<table>和关闭表格</table>定义的。在表格里,表格的行通过<tr>打开、</tr>关闭。在行中的列通过表格数据定义。表格数据打开是<td></td>。在表格数据之间,有在文档中显示的数据(文本、图形、超链等等和支持的任何格式属性(下划线、粗体、斜体等等)。图8-1HTML文档的Web成功应用表格的关键是在以正确的顺序中使用。用户通常是在出现相反顺序时关闭。因此,表格打开直到所有的表格行和表格数据已经编码才能关闭。下面显示了一个简单的表格:我们知道能从数据库中用游标一次抽取一行数据。想象从数据库中的数据表集生成一个HTML。通过传递“执行部门”的工作分类给过程,游标能从雇员表中检索出每个“执行部门”类型的雇员的人事信息并从放假表中检索出他或假期余额。我们开始讨论动态HTMHTML右之间安排它。OracleApplicationServer和PL/SQL是在Oracle数据库中用发现的数据生成页的角色。机智的开发者将为标准背景、表格布局和导航等等的eb地址生成模板。这些标准能作为每次网页建立时调用的独立的模块。这些独立过程的调用和应用逻辑的组合将产生有动态信息的专业的HTML动态HTML以上出现了“动态”的概念,为了更好地理解它,我们通过对照“静态”概念来解释它的意思。用户所的大多数网页是静态的。当用户在浏览器中输入HTML文档的URL时,一个在Web服务器上的文件,它只有在某个网络管理员在Web服务器上放置一个同名的新文件时才改变内容。相反,当用户从URL调用一个PL/SQL过程时,依靠数据库中数据的变化或者传递参数的不同,PL/SQL代码生成HTML文档,并为每次请求返回可能不同的网页。Oracle给开发者提供了一组内置程序包,它可产生HTML、发送或接收文本、生成前端表单等。让我们介绍几个这样的工具,看看它们怎样帮助我们数据和作为一个HTML在应用程序服务器PL/SL代码中应用定义在HTP内置程序包的过程,用户可生成HML和返回一个Web浏览器可以调用的HML文档。这里有几个HTP打程和一个在缺少适当的HTP过程的情况下用来传递HML字符串的通用过程。下面例子的代码和输出说明了HPcreateor ceprocedure(zip_inincursorphrmc_curselectname,contacts,phone_numberfrompharmacywherezip=htp.title('HealthInformationCorporation');htp.bodyopen(cattributes=>'bgcolor=htp.tablecaption('PharmacyInformation','center');htp.tableheader('PharmacyName');htp.tableheader('ContactName');htp.tableheader('PhoneNumber');forphrmc_recinphrmc_curendloop;/在下一节,将演示怎样在一个eb表单中调用这个过程。下面是一个前面过程被调用时生成HTM的示例。在HTML中出现的(药房名)、(联系人名)、()将依赖zip_in参数值成HTML的eb浏览器显示结果。<TITLE>HealthInformation<BODYbgcolor=<TABLE<CAPTIONALIGN="CENTER">Pharmacy<TH>Pharmacy<TH>Contact<TH>Phone<TD>A.B.ThriftDrug<TD>Arlene<TD>MirageMedicalCenter<TD>John<TD>NumberFiveDrug<TD>Mark 每个人调用产生相应的 、属性和文本的HTP打包的过程。页标题、标题、表头是硬编码,因此这页的每次生成是相同的。 面的例子中,在药房表中有三个与输入的邮政编码匹配的药房。由于“游标for循环”代码完全在一组表的 内部,一个简单的HTML一个每次循环迭代的表行生成。 htp.tabledata过程调用内部的htp.tablerowopen,ht
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 短视频营销策略解析
- 湖北省2025年中考第三次模拟考试道德与法治试卷(含答案)
- 6月排产内销强于外销空调内销高增
- 农村土地流转2025年土地流转与农村土地流转政策创新实践规范化管理报告
- 2025年工业互联网平台同态加密技术在智慧城市建设中的应用研究报告
- 基于2025年餐饮行业现状的突发事件应急管理预案编制策略报告
- 2025年工业碳捕获与封存(CCS)技术应用案例环保效益与政策环境研究报告
- 城市公共交通枢纽2025年社会稳定风险评估与风险防范研究报告
- 2025年私募股权投资基金行业投资热点:人工智能芯片设计与应用退出策略深度剖析
- 2025年智能客服语音识别系统在银行行业的应用案例分析报告
- 上海市2013年基准地价更新成果
- 道德与法治四年级(下)第二单元单元备课
- 苏州市吴江区2021-2022苏教版五年级数学下册期末试卷真题
- 《红楼梦》PPT课件(优秀)
- 新高考英语读后续写——故事编写思路
- “363生态课堂”模式及流程
- (高清版)建筑工程风洞试验方法标准JGJ_T 338-2014
- 钢构车棚施工组织方案
- HP彩色激光打印机节能证书
- 最新烟叶储存保管方法标准
- 《丹江城区普通住宅小区物业服务收费管理办法》
评论
0/150
提交评论