oracle实验--存储过程

合集下载

oracle实验--存储过程

oracle实验--存储过程

实验八存储过程的使用一、实验目的1、熟练掌握存储过程的定义及使用二、实验要求1、实验前做好上机实验的准备,针对实验内容,认真复习与本次实验有关的知识,完成实验内容的预习准备工作;2、能认真独立完成实验内容;3、实验后做好实验总结,根据实验情况完成实验报告。

三、实验内容创建图书管理库的图书、读者和借阅三个基本表的表结构:图书表:BOOK (BOOK_ID NUMBER(10),SORT V ARCHAR2(10),BOOK_NAME V ARCHAR2(50),WRITER V ARCHAR2(10),OUTPUT V ARCHAR2(50),PRICE NUMBER(3));读者表READER (READER_ID NUMBER(3),COMPANY V ARCHAR2(10),NAME V ARCHAR2(10),SEX V ARCHAR2(2),GRADE V ARCHAR2(10),ADDR V ARCHAR2(50));借阅表BORROW (READER_ID NUMBER(3),BOOK_ID NUMBER(10),BORROW_DA TE DA TE);插入数据:BOOK表:insert into book values(445501,'TP3/12','数据库导论','王强','科学出版社',17.90); insert into book values(445502,'TP3/12','数据库导论','王强','科学出版社',17.90); insert into book values(445503,'TP3/12','数据库导论','王强','科学出版社',17.90); insert into book values(332211,'TP5/10','计算机基础','李伟','高等教育出版社',18.00); insert into book values(112266,'TP3/12','FoxBASE','张三','电子工业出版社',23.60); insert into book values(665544,'TS7/21','高等数学','刘明','高等教育出版社',20.00); insert into book values(114455,'TR9/12','线性代数','孙业','北京大学出版社',20.80); insert into book values(113388,'TR7/90','大学英语','胡玲','清华大学出版社',12.50); insert into book values(446601,'TP4/13','数据库基础','马凌云','人民邮电出版社',22.50); insert into book values(446602,'TP4/13','数据库基础','马凌云','人民邮电出版社',22.50); insert into book values(446603,'TP4/13','数据库基础','马凌云','人民邮电出版社',22.50); insert into book values(449901,'TP4/14','FoxPro大全','周虹','科学出版社',32.70); insert into book values(449902,'TP4/14','FoxPro大全','周虹','科学出版社',32.70); insert into book values(118801,'TP4/15','计算机网络','黄力钧','高等教育出版社',21.80); insert into book values(118802,'TP4/15','计算机网络','黄力钧','高等教育出版社',21.80); READER表:insert into reader values(111,'信息系','王维利','女','教授','1号楼424');insert into reader values(112,'财会系','李立','男','副教授','2号楼316');insert into reader values(113,'经济系','张三','男','讲师','3号楼105');insert into reader values(114,'信息系','周华发','男','讲师','1号楼316');insert into reader values(115,'信息系','赵正义','男','工程师','1号楼224');insert into reader values(116,'信息系','李明','男','副教授','1号楼318');insert into reader values(117,'计算机系','李小峰','男','助教','1号楼214');insert into reader values(118,'计算机系','许鹏飞','男','助工','1号楼216');insert into reader values(119,'计算机系','刘大龙','男','教授','1号楼318');insert into reader values(120,'国际贸易','李雪','男','副教授','4号楼506');insert into reader values(121,'国际贸易','李爽','女','讲师','4号楼510');insert into reader values(122,'国际贸易','王纯','女','讲师','4号楼512');insert into reader values(123,'财会系','沈小霞','女','助教','2号楼202');insert into reader values(124,'财会系','朱海','男','讲师','2号楼210');insert into reader values(125,'财会系','马英明','男','副教授','2号楼212');BORROW表:insert into borrow values(112,445501,'19-3月-2006');insert into borrow values(125,332211,'12-2月-2006');insert into borrow values(111,445503,'21-8月-2006');insert into borrow values(112,112266,'14-3月-2006');insert into borrow values(114,665544,'21-10月-2006');insert into borrow values(120,114455,'02-11月-2006');insert into borrow values(120,118801,'18-10月-2006');insert into borrow values(119,446603,'12-11月-2006');insert into borrow values(112,449901,'23-10月-2006');insert into borrow values(115,449902,'21-8月-2006');insert into borrow values(118,118801,'10-9月-2006');完成以下各题:1、创建一个不带参数据的存储过程,统计并输出2006年每个月份的图书借出的册数。

Oracle存储过程测试总结

Oracle存储过程测试总结

Oracle存储过程测试总结在Oracle数据库中,存储过程是一组预编译的SQL语句,类似于脚本,用于实现一些特定的业务逻辑。

通过存储过程可以提高数据库的性能和安全性。

在进行Oracle存储过程测试时,以下是我总结的一些关键点。

首先,存储过程应该能够正确地执行所需的操作。

在测试过程中,应该确保存储过程能够按照预期执行SQL语句,并且能够正确处理各种情况,例如错误输入、异常情况等。

可以使用各种测试用例来覆盖不同的情况,以确保存储过程的完整性和稳定性。

其次,存储过程应该具有良好的性能。

在测试过程中,应该评估存储过程的性能,包括其执行时间和资源消耗等。

可以使用性能测试工具来模拟不同的负载情况,并分析存储过程的响应时间和系统资源的使用情况。

如果存储过程的性能不达预期,可以考虑对其进行优化,例如通过优化SQL语句、调整索引等来提高性能。

另外,存储过程应该具有良好的安全性。

在测试过程中,应该测试存储过程对于非法访问的防护能力,例如禁止未授权的用户执行存储过程、防止SQL注入攻击等。

可以模拟各种攻击场景,例如尝试执行未授权的存储过程、注入恶意代码等,来测试存储过程的安全性。

如果存在安全漏洞,应该及时进行修复,例如增加访问权限检查、对输入参数进行验证等。

此外,存储过程应该具有良好的可维护性。

在测试过程中,应该测试存储过程的易读性、可理解性和可维护性。

可以评估存储过程的代码结构、注释和命名规范等方面,以确定存储过程是否易于理解和修改。

可以从开发者和维护者的角度进行评估,通过对存储过程进行重构或重写来提高其可维护性。

最后,存储过程应该具有良好的兼容性。

在测试过程中,应该测试存储过程在不同的数据库版本和配置环境下的兼容性。

可以在不同的Oracle数据库版本上进行测试,并进行性能比较、功能验证等。

如果存储过程在一些特定环境下存在问题,可以考虑进行适配或修复,以确保其在不同环境下的可用性和稳定性。

总之,Oracle存储过程的测试应该从功能性、性能、安全性、可维护性和兼容性等方面进行全面的评估。

oracle存储过程读写文件操作

oracle存储过程读写文件操作

oracle存储过程读写文件操作Oracle数据库提供了一种功能强大的存储过程来进行文件的读写操作。

这些功能可以用于读取外部的文件,将结果写入文件,以及将数据从一个文件中导入到数据库中等操作。

下面是一个示例的存储过程,将文件中的数据导入到数据库表中。

存储过程的输入参数包括文件的路径和文件名,以及表名称。

存储过程的步骤如下:1.使用UTL_FILE包进行文件的读取操作。

首先通过调用UTL_FILE.FOPEN函数打开指定路径的文件,然后通过UTL_FILE.GET_LINE 函数逐行读取数据,并将其存储到一个临时变量中。

2.使用SQL语句将读取到的数据插入到指定的表中。

可以使用INSERTINTO语句将数据插入到表中。

3.当文件的最后一行被读取后,关闭文件并结束存储过程。

下面是一个示例的存储过程:CREATE OR REPLACE PROCEDURE import_data_from_file(p_file_path IN VARCHAR2, p_file_name IN VARCHAR2,p_table_name IN VARCHAR2)ASfile_handle UTL_FILE.FILE_TYPE;file_data VARCHAR2(4000);BEGIN--打开指定路径下的文件file_handle := UTL_FILE.FOPEN(p_file_path, p_file_name, 'R');--循环读取文件中的每一行数据LOOPUTL_FILE.GET_LINE(file_handle, file_data);--将读取到的数据插入到指定的表中INSERT INTO p_table_name VALUES (file_data);--判断是否到了文件的最后一行IF UTL_FILE.IS_OPEN(file_handle) = FALSE THENEXIT;ENDIF;ENDLOOP;--关闭文件UTL_FILE.FCLOSE(file_handle);--提交事务COMMIT;--输出导入数据的信息DBMS_OUTPUT.PUT_LINE('Data imported successfully fromfile.');EXCEPTIONWHENOTHERSTHEN--输出错误信息DBMS_OUTPUT.PUT_LINE('Error: ' , SQLERRM);--关闭文件UTL_FILE.FCLOSE(file_handle);--回滚事务ROLLBACK;END;这个存储过程可以通过传递文件路径、文件名和表名来导入数据。

oracle存储过程

oracle存储过程

1、存储过程的概念存储过程是一种拥有名称的PL/SQL块,是用户在操作Oracle数据库时最常使用的程序块之一。

使用存储过程可以将流程控制语句、SQL语句、游标等组合在一起,通常用于开发常用的数据库功能。

存储过程一旦被创建就会存储在数据库中,其特点是一次编写,可以多次调用执行。

用户可以将经常要执行的操作或任务写入存储过程中,以便于下次直接调用。

存储过程除了能够在数据库中执行外,还可以使用Java、C#等编程语言调用。

使用存储过程极大的节省了开发人员的时间,也提高了执行程序的效率。

2、存储过程的语法创建存储过程的语法格式与创建匿名块的语法格式类似,存储过程也包括声明部分、执行体部分与异常处理部分。

与匿名块不同的是,存储过程需要指定程序块名称与程序块的参数,创建存储过程需要使用CREATE PROCEDURE语句,其(2)pro_name:指定存储过程的名称,如果数据库中已经存在了相同名称的存储过程,可以使用or replace语句覆盖掉原有的存储过程。

(3)pro_name:指定存储过程的参数,存储过程可以没有参数,也可以传入多个参数。

(4)var_statement:存储过程声明部分,可以用于声明程序中所使用的参数。

(5)main_body_code:存储过程的主体部分,可以编写流程控制语句、SQL语句、游标等。

如果需要执行存储过程则需要使用EXECUTE语句,使用EXECUTE语句执行存储过程的语法格式为:“EXECUTE pro_name[(param1,param2…)];”。

3、存储过程的创建与使用4、show error存储过程中如果出现了语法格式错误,在创建时数据库就会提示“Warning: Procedure created with compilation errors”,如果想要查看存储过程中的错误信息可以使用SHOW ERROR语句。

当执行SHOW ERROR 语句后,就会输出错5、调用存储过程存储过程除了可以使用EXECUTE关键字执行外,还可以在其他子程序与匿名块6、存储过程中的参数1、in参数IN是一种输入类型的参数,该参数由调用者传入,只能够在储存过程内部使用,这种参数模式是最常用的,也是存储过程默认的参数模式。

oracle--存储过程--存储函数--触发器

oracle--存储过程--存储函数--触发器

存储过程和存储函数:指存储在数据库中供所有用户程序调用的子程序叫存储过程、存储函数。

语法:create [or replace] PROCEDURE 过程名(参数列表)ASPLSQL子程序体;存储过程实例:存储过程的调用:方法一:set serveroutput onbeginraisesalary(7369);end;/方法二:set serveroutput onexec raisesalary(7369);函数(Function)为一命名的存储程序,可带参数,并返回一计算值。

函数和过程的结构类似,但必须有一个RETURN子句,用于返回函数值。

函数说明要指定函数名、结果值的类型,以及参数类型等。

语法:CREATE [OR REPLACE] FUNCTION 函数名(参数列表)RETURN 函数值类型ASPLSQL子程序体;示例:函数的调用:declarev_sal number;beginv_sal:=queryEmpSalary(7934);dbms_output.put_line('salary is:' || v_sal);end;/在java语言中调用存储过程:存储过程:什么时候使用存储过程/存储函数?如果只有一个返回值,用存储函数;否则,就用存储过程。

在out参数中使用游标:声明包结构:创建包体:在Java语言中访问游标类型的out参数:触发器:数据库触发器是一个与表相关联的、存储的PL/SQL程序。

每当一个特定的数据操作语句(Insert,update,delete)在指定的表上发出时,Oracle自动地执行触发器中定义的语句序列。

触发器的类型语句级触发器在指定的操作语句操作之前或之后执行一次,不管这条语句影响了多少行。

行级触发器(FOR EACH ROW)触发语句作用的每一条记录都被触发。

在行级触发器中使用old和new伪记录变量, 识别值的状态。

创建触发器:CREATE [or REPLACE] TRIGGER 触发器名{BEFORE | AFTER}{DELETE | INSERT | UPDATE [OF 列名]}ON 表名[FOR EACH ROW [WHEN(条件) ] ]PLSQL 块示例1:限制非工作时间向数据库插入数据示例二:确认数据(检查emp表中sal 的修改值不低于原值)运行效果:触发器的作用:触发器可用于数据确认实施复杂的安全性检查做审计,跟踪表上所做的数据操作等数据的备份和同步。

oracle 存储过程优秀例子

oracle 存储过程优秀例子

oracle 存储过程优秀例子Oracle存储过程是一种在数据库中存储并可以被重复调用的程序单元。

它可以用于实现复杂的业务逻辑,提高数据库的性能和安全性。

下面列举了十个优秀的Oracle存储过程例子。

1. 用户注册存储过程该存储过程可以用于用户注册过程的验证和处理。

它可以检查用户提交的信息是否有效,并将用户信息插入到用户表中。

如果有错误或重复信息,它会返回相应的错误消息。

2. 商品库存更新存储过程该存储过程用于处理商品出库和入库的操作。

它会更新商品表中的库存数量,并记录相应的操作日志。

如果库存不足或操作失败,它会返回错误消息。

3. 订单生成存储过程该存储过程用于生成订单并更新相关表的信息。

它可以检查订单的有效性,计算订单总金额,并将订单信息插入到订单表和订单明细表中。

如果有错误或重复订单,它会返回相应的错误消息。

4. 日志记录存储过程该存储过程用于记录系统的操作日志。

它可以根据传入的参数,将操作日志插入到日志表中,并记录操作的时间、操作人和操作内容。

这样可以方便后续的审计和故障排查。

5. 数据备份存储过程该存储过程用于定期备份数据库中的重要数据。

它可以根据预设的时间间隔,将指定表的数据导出到备份表中,并记录备份的时间和备份人。

这样可以保证数据的安全性和可恢复性。

6. 数据清理存储过程该存储过程用于定期清理数据库中的过期数据。

它可以根据预设的条件,删除指定表中的过期数据,并记录清理的时间和清理人。

这样可以减少数据库的存储空间和提高查询性能。

7. 权限管理存储过程该存储过程用于管理数据库中的用户权限。

它可以根据传入的参数,为指定用户或角色分配或撤销相应的权限。

同时,它可以记录权限的变更历史,以便审计和权限回溯。

8. 数据统计存储过程该存储过程用于统计数据库中的数据。

它可以根据预设的条件,查询指定表中的数据,并根据统计规则生成相应的统计报表。

这样可以方便用户对数据进行分析和决策。

9. 数据导入存储过程该存储过程用于将外部数据导入到数据库中。

oracle存储过程

oracle存储过程

学习的时候要静下心去学习,不要心浮气躁。

其中找了一些网上的资料和自己的理解,再做以实践,由于存储过程内容是比较多的,我这里只能做个入门,希望大家能自己深入学习。

-- 文中这个符号,等于注释的意思1.基本结构CREATE OR REPLACE PROCEDURE 存储过程名字(参数1 IN 数据类型,参数2 IN 数据类型) IS变量1 数据类型;变量2 数据类型;BEGIN********* --存储过程的业务,也就是你想要做的事END 存储过程名字上面的大写字母是保留字,数据类型有很多,说几个基本的,以后靠大家自己去学习,比如:NUMBER,V ARCHAR,V ARCHAR2,这里的等于符号是:= 这里定义变量的方式比较独特采用的是变量数据类型;egt_name V ARCHAR2(100);t_age NUMBER;如何给变量赋值t_name := 'aaaaaaa';t_age := 10;2.SELECT INTO STA TEMENT将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)例子:BEGINselect col1,col2 into 变量1,变量2 FROM 表名where xxx;WHEN NO_DA TA_FOUND THENxxxx;END;3.IF 判断IF V_TEST=1 THENBEGINdo something --这句是你要处理的自己业务END;END IF;4.WHILE循环WHILE V_TEST=1 LOOPBEGINXXXXEND;END LOOP;5.变量赋值V_TEST := 123;6.用for in 使用cursorCREATE OR REPLACE PROCEDURE TEST(name in number)ISCURSOR cur IS select * FROM xxx; --这里是定义一个游标,把查询结果放入游标中,--游标就象指针,大家可以这么去理解BEGINFOR cur_result in cur LOOPBEGINV_SUM :=cur_result.列名;END LOOP;END;看看下面的例子CREATE OR REPLACE PROCEDURE TEST(name in number)isV_SUM varchar2(200);cursor cur is select * from LAD_USER;BEGINfor V_RESULT in cur LOOPBEGINV_SUM := V_er_Name;END;end LOOP;DBMS_OUTPUT.put_line(V_SUM); --输出命令END TEST;7.带参数的cursorCURSOR C_USER(C_ID NUMBER) IS select NAME FROM USER where TYPEID=C_ID;OPEN C_USER(变量值);LOOPFETCH C_USER INTO V_NAME;EXIT FETCH C_USER%NOTFOUND;do somethingEND LOOP;CLOSE C_USER;8.用pl/sql developer debug连接数据库后建立一个Test WINDOW在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试9.运行我第一次学习的时候很苯,连存储过程都没创建就去执行调用命令,请大家别和我一样。

oracle存储过程实例详解

oracle存储过程实例详解

oracle存储过程实例详解Oracle 存储过程实例详解:1. 什么是存储过程?Oracle 存储过程是一种类似于子程序或函数的数据库对象,在数据库中完成特定任务,其能大大加快数据库操作的响应时间。

Oracle存储过程功能表现为一个静态数据库对象,它可以接受参数,在每次执行制定的任务时还可以返回结果。

它也可以根据参数进行多次执行,以便对数据进行多次处理。

2. Oracle 存储过程的使用步骤(1)创建存储过程:使用CREATE PROCEDURE 语句创建存储过程,指定参数,SQL语句或控制结构;(2)调用存储过程:通过使用 CALL 语句调用该存储过程。

(3)定义变量:为Oracle 存储过程定义变量;(4)使用 OUT 参数:处理 OUT 参数,其所提供的数据将被程序处理;(5)处理返回值:在Oracle存储过程中返回值可以被处理;(6)删除存储过程:使用DROPPROCEDURE 语句删除存储过程;3. Oracle 存储过程的优点(1)提高运行性能:Oracle 存储过程能够提高数据库查询性能,并利用该存储过程重复运行减少数据库操作;(2)高安全性:由于Oracle存储过程运行在数据库中,因此可以很好地保证安全性;(3)实现更高级的功能:Oracle存储过程支持流程控制语句、变量以及丰富的函数。

4. Oracle 存储过程的实例以下是一个 Oracle 存储过程示例:CREATE OR REPLACE PROCEDURE employees_by_department(p_department_id IN employees.department_id%TYPE)ISBEGINSELECT last_name, salaryINTO l_last_name, l_salaryFROM employeesWHERE department_id = p_department_id;DBMS_OUTPUT.PUT_LINE('Last name: ' || l_last_name);DBMS_OUTPUT.PUT_LINE('Salary: ' || l_salary);END;这个 Oracle 存储过程 employees_by_department,用于根据部门 ID 查询某部门员工的最后一个名字和工资,最后将结果输出到DBMS_OUTPUT 对象中。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验八存储过程的使用一、实验目的1、熟练掌握存储过程的定义及使用二、实验要求1、实验前做好上机实验的准备,针对实验内容,认真复习与本次实验有关的知识,完成实验内容的预习准备工作;2、能认真独立完成实验内容;3、实验后做好实验总结,根据实验情况完成实验报告。

三、实验内容创建图书管理库的图书、读者和借阅三个基本表的表结构:图书表:BOOK (BOOK_ID NUMBER(10),SORT V ARCHAR2(10),BOOK_NAME V ARCHAR2(50),WRITER V ARCHAR2(10),OUTPUT V ARCHAR2(50),PRICE NUMBER(3));读者表READER (READER_ID NUMBER(3),COMPANY V ARCHAR2(10),NAME V ARCHAR2(10),SEX V ARCHAR2(2),GRADE V ARCHAR2(10),ADDR V ARCHAR2(50));借阅表BORROW (READER_ID NUMBER(3),BOOK_ID NUMBER(10),BORROW_DA TE DA TE);插入数据:BOOK表:insert into book values(445501,'TP3/12','数据库导论','王强','科学出版社',17.90); insert into book values(445502,'TP3/12','数据库导论','王强','科学出版社',17.90); insert into book values(445503,'TP3/12','数据库导论','王强','科学出版社',17.90); insert into book values(332211,'TP5/10','计算机基础','李伟','高等教育出版社',18.00); insert into book values(112266,'TP3/12','FoxBASE','张三','电子工业出版社',23.60); insert into book values(665544,'TS7/21','高等数学','刘明','高等教育出版社',20.00); insert into book values(114455,'TR9/12','线性代数','孙业','北京大学出版社',20.80); insert into book values(113388,'TR7/90','大学英语','胡玲','清华大学出版社',12.50); insert into book values(446601,'TP4/13','数据库基础','马凌云','人民邮电出版社',22.50); insert into book values(446602,'TP4/13','数据库基础','马凌云','人民邮电出版社',22.50); insert into book values(446603,'TP4/13','数据库基础','马凌云','人民邮电出版社',22.50); insert into book values(449901,'TP4/14','FoxPro大全','周虹','科学出版社',32.70); insert into book values(449902,'TP4/14','FoxPro大全','周虹','科学出版社',32.70); insert into book values(118801,'TP4/15','计算机网络','黄力钧','高等教育出版社',21.80); insert into book values(118802,'TP4/15','计算机网络','黄力钧','高等教育出版社',21.80); READER表:insert into reader values(111,'信息系','王维利','女','教授','1号楼424');insert into reader values(112,'财会系','李立','男','副教授','2号楼316');insert into reader values(113,'经济系','张三','男','讲师','3号楼105');insert into reader values(114,'信息系','周华发','男','讲师','1号楼316');insert into reader values(115,'信息系','赵正义','男','工程师','1号楼224');insert into reader values(116,'信息系','李明','男','副教授','1号楼318');insert into reader values(117,'计算机系','李小峰','男','助教','1号楼214');insert into reader values(118,'计算机系','许鹏飞','男','助工','1号楼216');insert into reader values(119,'计算机系','刘大龙','男','教授','1号楼318');insert into reader values(120,'国际贸易','李雪','男','副教授','4号楼506');insert into reader values(121,'国际贸易','李爽','女','讲师','4号楼510');insert into reader values(122,'国际贸易','王纯','女','讲师','4号楼512');insert into reader values(123,'财会系','沈小霞','女','助教','2号楼202');insert into reader values(124,'财会系','朱海','男','讲师','2号楼210');insert into reader values(125,'财会系','马英明','男','副教授','2号楼212');BORROW表:insert into borrow values(112,445501,'19-3月-2006');insert into borrow values(125,332211,'12-2月-2006');insert into borrow values(111,445503,'21-8月-2006');insert into borrow values(112,112266,'14-3月-2006');insert into borrow values(114,665544,'21-10月-2006');insert into borrow values(120,114455,'02-11月-2006');insert into borrow values(120,118801,'18-10月-2006');insert into borrow values(119,446603,'12-11月-2006');insert into borrow values(112,449901,'23-10月-2006');insert into borrow values(115,449902,'21-8月-2006');insert into borrow values(118,118801,'10-9月-2006');完成以下各题:1、创建一个不带参数据的存储过程,统计并输出2006年每个月份的图书借出的册数。

输出结果如下:2、将上面的存储过程修改为带参的存储过程,根据输入的年份,统计并输出该年份每个月份的图书借出的册数。

详细代码如下:执行存储过程:输出结果如下:3、创建一个带参的存储过程,根据输入的读者的姓名,输出该读者的借书情况,包括借书的日期、书名、出版社、单价及应归还的日期(假设最长借期为30天)。

相关文档
最新文档