Oracle实验4(实验报告)-PL_SQL程序的设计说明
ORACLE_PLSQL程序设计
ORACLE_PLSQL程序设计Oracle PL/SQL是一种强大的编程语言,用于开发Oracle数据库的存储过程、触发器、函数和包。
本篇文章将探讨Oracle PL/SQL程序设计的基本概念、语法和功能,以及一些最佳实践和编程技巧。
PL/SQL是Oracle数据库的内置编程语言,它结合了SQL语句和面向过程的语言特性,可以实现复杂的业务逻辑和数据处理。
PL/SQL程序是在数据库服务器上执行的,它可以访问和操作数据库中的数据,并返回结果。
PL/SQL程序由块组成,一个块是一组PL/SQL语句的逻辑单元。
块由关键字BEGIN和END包围,可以包含变量声明、控制结构、异常处理和SQL语句等。
PL/SQL变量是用来存储和操作数据的命名对象,它可以是标量类型(如整数、字符、日期等)、集合类型(如数组、表)或记录类型。
变量可以在块内部声明,并且可以被块内的其他语句引用。
PL/SQL控制结构用于根据条件执行特定的代码块。
常见的控制结构有IF-THEN、IF-THEN-ELSE、CASE等。
这些控制结构可以根据条件执行不同的代码块,增强了程序的灵活性和可读性。
异常处理是PL/SQL程序设计的重要部分。
当出现意外情况或错误时,异常处理机制可以捕获异常并采取相应的措施。
PL/SQL提供了TRY-CATCH结构来处理异常,可以在CATCH块中编写相应的异常处理代码。
PL/SQL还支持存储过程、触发器和函数等数据库对象的定义和使用。
存储过程是一种一次性地执行一系列操作的程序,触发器是在数据库中发生特定事件时自动执行的程序,函数是返回一个值的程序。
这些数据库对象可以帮助我们实现复杂的业务逻辑和数据操作。
在PL/SQL程序设计中,有一些最佳实践和编程技巧值得注意。
首先,要注意代码的可读性和可维护性,良好的命名约定、适当的缩进和注释可以提高代码的可读性。
其次,需要注意异常处理,正确处理和记录异常可以提高程序的稳定性和可靠性。
PL SQL编程实验
西安邮电大学(计算机学院)课内实验报告实验:PL/SQL编程实验课程:大型数据库系统班级:学号:学生姓名:任课教师:一、实验目的(1)了解PL/SQL语言的结构。
(2)了解PL/SQL变量和常量的声明和使用方法。
(3)学习条件语句的使用方法。
(4)学习分支语句的使用方法。
(5)学习循环语句的使用方法。
(6)学习使用Oracle系统函数。
二、实验内容(1)练习条件语句的使用方法。
(2)练习分支语句的使用方法。
(3)练习循环语句的使用方法。
(4)练习使用Oracle系统函数。
三、实验前准备首先要了解PL/SQL语言是结构化程序设计语言。
块(Block)是PL/SQL程序中最基本的结构,所有PL/SQL程序都是由块组成的。
PL/SQL的块由变量声明、程序代码和异常处理代码3部分组成。
在PL/SQL中,常量和变量在使用前必须声明,可以使用DECLARE对变量进行声明。
四、实验步骤1.使用条件语句条件语句格式:IF <条件表达式> THEN<执行语句> …… <执行语句n>[ELSIF <条件表达式> THEN<执行语句> …… <执行语句n>……ELSE<执行语句>]END IF;执行下列程序,观察结果:SET ServerOutput ON;DECLARENum INTEGER := -11;BEGINIF Num < 0 THENdbms_output.put_line('负数');ELSIF Num >0 THENdbms_output.put_line('正数');ELSEdbms_output.put_line('0');END IF;END;2.使用分支语句分支语句格式:CASE <变量>WHEN <表达式1> THEN 值1WHEN <表达式2> THEN 值2……WHEN <表达式n> THEN 值nELSE 值n + 1END;执行下列程序,观察结果:SET ServerOutput ON;DECLAREvarDAY INTEGER := 3;Result VARCHAR2(20);BEGINResult := CASE varDAYWHEN 1 THEN '星期一'WHEN 2 THEN '星期二'WHEN 3 THEN '星期三'WHEN 4 THEN '星期四'WHEN 5 THEN '星期五'WHEN 6 THEN '星期六'WHEN 7 THEN '星期七'ELSE '数据越界'END;dbms_output.put_line(Result);END;3.使用循环语句(1)循环语句格式1:LOOP<程序块1>IF <条件表达式> THENEXITEND IF<程序块2>END LOOP;执行下列程序,观察结果:SET ServerOutput ON;DECLAREv_Num INTEGER := 1;v_Sum INTEGER := 0;BEGINLOOPv_Sum := v_Sum + v_Num;dbms_output.put_line(v_Num);IF v_Num = 3 THENEXIT;END IF;dbms_output.put_line(' + ');v_Num := v_Num + 1;END LOOP;dbms_output.put_line(' = ');dbms_output.put_line(v_Sum);END;(2)循环语句格式2:LOOP<程序块1>EXIT WHEN <条件表达式><程序块2>END LOOP;执行下列程序,观察结果:SET ServerOutput ON;DECLAREv_Num INTEGER := 1;v_Sum INTEGER := 0;BEGINLOOPv_Sum := v_Sum + v_Num;dbms_output.put_line(v_Num);EXIT WHEN v_Num = 3;dbms_output.put_line(' + ');v_Num := v_Num + 1;END LOOP;dbms_output.put_line(' = ');dbms_output.put_line(v_Sum); END;(3)循环语句格式3:WHILE <条件表达式>LOOP<程序块>END LOOP;执行下列程序,观察结果:SET ServerOutput ON;DECLAREv_Num INTEGER := 1;v_Sum INTEGER := 0;BEGINWHILE v_Num <= 3LOOPv_Sum := v_Sum + v_Num;dbms_output.put_line(v_Num);IF v_Num < 3 THENdbms_output.put_line(' + ');END IF;v_Num := v_Num + 1;END LOOP;dbms_output.put_line(' = ');dbms_output.put_line(v_Sum); END;(4)循环语句格式4:FOR <循环变量> IN <初始值> ..<终止值>LOOP<程序块>END LOOP;执行下列程序,观察结果:SET ServerOutput ON;DECLAREv_Num INTEGER;v_Sum INTEGER := 0;BEGINFOR v_Num IN 1..3LOOPv_Sum := v_Sum + v_Num;dbms_output.put_line(v_Num);IF v_Num < 3 THENdbms_output.put_line(' + ');END IF;END LOOP;dbms_output.put_line(' = ');dbms_output.put_line(v_Sum);END;4.使用系统函数常用函数有:数值型函数,字符型函数,日期型函数,统计函数五、实验结果六.评价分析及心得体会通过本次试验我学会了条件语句,分支语句,及循环语句的使用方法。
Oracle PL SQL编程教程说明书
About the T utorialPL/SQL is a combination of SQL along with the procedural features of programming languages. It was developed by Oracle Corporation in the early 90's to enhance the capabilities of SQL.PL/SQL is one of three key programming languages embedded in the Oracle Database, along with SQL itself and Java.This tutorial will give you great understanding on PL/SQL to proceed with Oracle database and other advanced RDBMS concepts.AudienceThis tutorial is designed for Software Professionals, who are willing to learn PL/SQL Programming Language in simple and easy steps. This tutorial will give you great understanding on PL/SQL Programming concepts, and after completing this tutorial, you will be at an intermediate level of expertise from where you can take yourself to a higher level of expertise.PrerequisitesBefore proceeding with this tutorial, you should have a basic understanding of software basic concepts like what is database, source code, text editor and execution of programs, etc. If you already have an understanding on SQL and other computer programming language, then it will be an added advantage to proceed.Copyright & DisclaimerCopyright 2018 by Tutorials Point (I) Pvt. Ltd.All the content and graphics published in this e-book are the property of Tutorials Point (I) Pvt. Ltd. The user of this e-book is prohibited to reuse, retain, copy, distribute or republish any contents or a part of contents of this e-book in any manner without written consent of the publisher.We strive to update the contents of our website and tutorials as timely and as precisely as possible, however, the contents may contain inaccuracies or errors. Tutorials Point (I) Pvt. Ltd. provides no guarantee regarding the accuracy, timeliness or completeness of our website or its contents including this tutorial. If you discover any errors on our website or inthistutorial,******************************************iT able of ContentsAbout the Tutorial (i)Audience (i)Prerequisites (i)Copyright & Disclaimer (i)Table of Contents ................................................................................................................................... i ii PL/SQL — OVERVIEW . (1)Features of PL/SQL (1)Advantages of PL/SQL (1)PL/SQL — ENVIRONMENT SETUP (3)Text Editor (14)PL/SQL — BASIC SYNTAX (15)PL/SQL — DATA TYPES (19)PL/SQL Scalar Data Types and Subtypes (19)PL/SQL Numeric Data Types and Subtypes (20)PL/SQL Character Data Types and Subtypes (21)PL/SQL Boolean Data Types (22)PL/SQL Datetime and Interval Types (22)PL/SQL Large Object (LOB) Data Types (23)PL/SQL User-Defined Subtypes (24)NULLs in PL/SQL (25)PL/SQL — VARIABLES (26)Variable Declaration in PL/SQL (26)Initializing Variables in PL/SQL (27)Variable Scope in PL/SQL (28)iiAssigning SQL Query Results to PL/SQL Variables (29)PL/SQL — CONSTANTS AND LITERALS (31)Declaring a Constant (31)The PL/SQL Literals (32)PL/SQL — OPERATORS (34)Arithmetic Operators (34)Relational Operators (36)[Comparison Operators (39)Logical Operators (44)PL/SQL Operator Precedence (46)PL/SQL — CONDITIONS (49)IF-THEN Statement (50)IF-THEN-ELSE Statement (53)IF-THEN-ELSIF Statement (55)CASE Statement (56)Searched CASE Statement (58)Nested IF-THEN-ELSE Statements (60)PL/SQL — LOOPS (62)Basic Loop Statement (63)WHILE LOOP Statement (65)FOR LOOP Statement (66)Reverse FOR LOOP Statement (68)Nested Loops (69)Labeling a PL/SQL Loop (71)The Loop Control Statements (72)iiiEXIT Statement (73)The EXIT WHEN Statement (75)CONTINUE Statement (77)GOTO Statement (80)PL/SQL — STRINGS (83)Declaring String Variables (83)PL/SQL String Functions and Operators (84)PL/SQL — ARRAYS (89)Creating a Varray Type (89)PL/SQL — PROCEDURES (94)Parts of a PL/SQL Subprogram (94)Creating a Procedure (95)Executing a Standalone Procedure (96)Deleting a Standalone Procedure (97)Parameter Modes in PL/SQL Subprograms (98)Methods for Passing Parameters (100)PL/SQL — FUNCTIONS (103)Creating a Function (103)Calling a Function (104)PL/SQL Recursive Functions (106)PL/SQL — CURSORS (108)Implicit Cursors (108)Explicit Cursors (110)Declaring the Cursor (112)Opening the Cursor (112)ivFetching the Cursor (112)Closing the Cursor (112)PL/SQL — RECORDS (114)Table-Based Records (114)Cursor-Based Records (115)User-Defined Records (116)PL/SQL — EXCEPTIONS (120)Syntax for Exception Handling (120)Raising Exceptions (121)User-defined Exceptions (122)Pre-defined Exceptions (123)PL/SQL — TRIGGERS (126)Creating Triggers (126)Triggering a Trigger (129)PL/SQL — PACKAGES (130)Package Specification (130)Package Body (130)Using the Package Elements (131)PL/SQL — COLLECTIONS (138)Index-By Table (139)Nested Tables (141)Collection Methods (144)Collection Exceptions (145)vPL/SQL — TRANSACTIONS (147)Starting and Ending a Transaction (147)Committing a Transaction (147)Rolling Back Transactions (148)Automatic Transaction Control (149)PL/SQL — DATE & TIME (150)Field Values for Datetime and Interval Data Types (150)The Datetime Data Types and Functions (151)The Interval Data Types and Functions (155)PL/SQL — DBMS OUTPUT (157)DBMS_OUTPUT Subprograms (157)PL/SQL — OBJECT-ORIENTED (160)Instantiating an Object (161)Member Methods (161)Using Map method (162)Using Order method (164)Inheritance for PL/SQL Objects (166)Abstract Objects in PL/SQL (168)viPL/SQL7The PL/SQL programming language was developed by Oracle Corporation in the late 1980s as procedural extension language for SQL and the Oracle relational database. Following are certain notable facts about PL/SQL:∙PL/SQL is a completely portable, high-performance transaction-processing language. ∙PL/SQL provides a built-in, interpreted and OS independent programming environment. ∙PL/SQL can also directly be called from the command-line SQL*Plus interface . ∙Direct call can also be made from external programming language calls to database. ∙PL/SQL's general syntax is based on that of ADA and Pascal programming language. ∙ Apart from Oracle, PL/SQL is available in TimesTen in-memory database and IBM DB2.Features of PL/SQLPL/SQL has the following features:∙PL/SQL is tightly integrated with SQL. ∙It offers extensive error checking. ∙It offers numerous data types. ∙It offers a variety of programming structures. ∙It supports structured programming through functions and procedures. ∙It supports object-oriented programming. ∙ It supports the development of web applications and server pages. Advantages of PL/SQLPL/SQL has the following advantages:∙ SQL is the standard database language and PL/SQL is strongly integrated with SQL. PL/SQL supports both static and dynamic SQL. Static SQL supports DML operations and transaction control from PL/SQL block. In Dynamic SQL, SQL allows embedding DDL statements in PL/SQL blocks.PL/SQL — OverviewPL/SQL8∙PL/SQL allows sending an entire block of statements to the database at one time. This reduces network traffic and provides high performance for the applications.∙PL/SQL gives high productivity to programmers as it can query, transform, and update data in a database.∙PL/SQL saves time on design and debugging by strong features, such as exception handling, encapsulation, data hiding, and object-oriented data types.∙Applications written in PL/SQL are fully portable.∙PL/SQL provides high security level.∙PL/SQL provides access to predefined SQL packages.∙PL/SQL provides support for Object-Oriented Programming.∙PL/SQL provides support for developing Web Applications and Server Pages.PL/SQL 9In this chapter, we will discuss the Environment Setup of PL/SQL. PL/SQL is not a stand-alone programming language; it is a tool within the Oracle programming environment. SQL* Plus is an interactive tool that allows you to type SQL and PL/SQL statements at the command prompt. These commands are then sent to the database for processing. Once the statements are processed, the results are sent back and displayed on screen.To run PL/SQL programs, you should have the Oracle RDBMS Server installed in your machine. This will take care of the execution of the SQL commands. The most recent version of Oracle RDBMS is 11g. You can download a trial version of Oracle 11g from the following link: Download Oracle 11g Express EditionYou will have to download either the 32-bit or the 64-bit version of the installation as per your operating system. Usually there are two files. We have downloaded the 64-bit version. You will also use similar steps on your operating system, does not matter if it is Linux or Solaris. ∙win64_11gR2_database_1of2.zip ∙ win64_11gR2_database_2of2.zipAfter downloading the above two files, you will need to unzip them in a single directory database and under that you will find the following sub-directories:Step 1Let us now launch the Oracle Database Installer using the setup file. Following is the first screen. You can provide your email ID and check the checkbox as shown in the following screenshot. Click the Next button.PL/SQL — Environment Setup10Step 2You will be directed to the following screen; uncheck the checkbox and click the Continue button to proceed.11Just select the first option Create and Configure Database using the radio button and click the Next button to proceed.12We assume you are installing Oracle for the basic purpose of learning and that you are installing it on your PC or Laptop. Thus, select the Desktop Class option and click the Next button to proceed.13Provide a location, where you will install the Oracle Server. Just modify the Oracle Base and the other locations will set automatically. You will also have to provide a password; this will be used by the system DBA. Once you provide the required information, click the Next button to proceed.14Again, click the Next button to proceed.15Click the Finish button to proceed; this will start the actual server installation.16This will take a few moments, until Oracle starts performing the required configuration.17Here, Oracle installation will copy the required configuration files. This should take a moment:18Once the database files are copied, you will have the following dialogue box. Just click the OK button and come out.19Upon installation, you will have the following final window.Final StepIt is now time to verify your installation. At the command prompt, use the following command if you are using Windows:You should have the SQL prompt where you will write your PL/SQL commands and scripts:PL/SQL20T ext EditorRunning large programs from the command prompt may land you in inadvertently losing some of the work. It is always recommended to use the command files. To use the command files: ∙Type your code in a text editor, like Notepad, Notepad+, or EditPlus, etc.∙Save the file with the .sql extension in the home directory.∙Launch the SQL*Plus command prompt from the directory where you created your PL/SQL file.∙Type @file_name at the SQL*Plus command prompt to execute your program.If you are not using a file to execute the PL/SQL scripts, then simply copy your PL/SQL code and right-click on the black window that displays the SQL prompt; use the paste option to paste the complete code at the command prompt. Finally, just press Enter to execute thecode, if it is not already executed.PL/SQL21In this chapter, we will discuss the Basic Syntax of PL/SQL which is a block-structured language; this means that the PL/SQL programs are divided and written in logical blocks of code. Each block consists of three sub-parts:Every PL/SQL statement ends with a semicolon (;). PL/SQL blocks can be nested within other PL/SQL blocks using BEGIN and END . Following is the basic structure of a PL/SQL block: PL/SQL — Basic Syntax22The 'Hello World' ExampleThe end; line signals the end of the PL/SQL block. To run the code from the SQL command line, you may need to type/ at the beginning of the first blank line after the last line of the code. When the above code is executed at the SQL prompt, it produces the following result: The PL/SQL IdentifiersPL/SQL identifiers are constants, variables, exceptions, procedures, cursors, and reserved words. The identifiers consist of a letter optionally followed by more letters, numerals, dollar signs, underscores, and number signs and should not exceed 30 characters.By default, identifiers are not case-sensitive . So you can use integer or INTEGER to represent a numeric value. You cannot use a reserved keyword as an identifier.The PL/SQL DelimitersA delimiter is a symbol with a special meaning. Following is the list of delimiters in PL/SQL:2324The PL/SQL CommentsProgram comments are explanatory statements that can be included in the PL/SQL code that you write and helps anyone reading its source code. All programming languages allow some form of comments.The PL/SQL supports single-line and multi-line comments. All characters available inside any comment are ignored by the PL/SQL compiler. The PL/SQL single-line comments start with the delimiter -- (double hyphen) and multi-line comments are enclosed by /* and */.When the above code is executed at the SQL prompt, it produces the following result:PL/SQL Program UnitsA PL/SQL unit is any one of the following:∙PL/SQL block∙Function∙Package∙Package bodyPL/SQL25∙Procedure∙Trigger∙Type∙Type bodyEach of these units will be discussed in the following chapters.PL/SQL26End of ebook previewIf you liked what you saw…Buy it from our store @ https://。
PL SQL编程 Oracle数据库实验报告
PL/SQL编程【实验目的】1.熟悉PL/SQL的数据类型和书写规则2.熟悉控制结构和游标的使用3.编写和运行函数、过程和触发器【实验内容】编写脚本文件,调试运行脚本文件,并记录结果。
1.在SQL*Plus中编写一个PL/SQL块,功能用于打印学生信息在DECLARE部分完成:(1)建立学生信息记录类型stu_record_type,包括学号,姓名,性别,籍贯,学习成绩和活动成绩。
均为可变长字符类型(2)编写本地子过程:学生信息打印过程PrintStuRecord,把(1)中定义的记录类型作为参数(3)定义学生信息记录变量stu_record在BEGIN…END部分完成:(1)为stu_record变量的各个元素赋值如下:学号:‘2001001’姓名:’李新’性别:‘m’籍贯:‘黑龙江省哈尔滨市’学习成绩:‘Excellent’活动成绩:‘Good’(2)对该变量的调用打印过程,输出到屏幕2.建立对bookinfo表的DML触发器,一旦bookinfo表发生了任何变化,立即触发,对bookinfo表的数据进行统计,结果存储在数据统计表中(1)如果没有则建立bookinfo表,选择建立在scott用户下,表结构为(bookno varchar2(36) Primary key,bookname varchar2(40) not null,authorname varchar2(10) not null,publishtime date,bookprice float)(2)建立数据统计表major_stats,包含两个字段:书的总数和作者的总数(3)创建触发器UpdateMajorStats,完成在bookinfo表中插入、删除和修改记录之后,对bookinfo表进行统计,结果存储在(2)建立的major_stats表中(4)在bookinfo表中插入、删除和更新信息,再查看major_stats表中数据的变化【实验结论】编写脚本文件,调试运行脚本文件,并记录结果。
Oracle数据库实验-PLSQL游标、过程、函数、包的使用
Oracle数据库实验-PLSQL游标、过程、函数、包的使用Oracle数据库基础实验5 PL/SQL游标、过程、函数、包的使用【实验学时】2学时【实验目的】1.了解PL/SQL语言中显式游标和隐式游标的概念和属性。
2.了解显式游标和隐式游标的差异。
3.掌握PL/SQL中cursor for循环的使用方法。
4.学会在PL/SQL程序中使用游标来解决实际问题。
5.学会在PL/SQL程序中进行异常处理的方法。
6.练习在PL/SQL中自定义异常。
7.理解过程和函数的作用。
8.学会编写过程、函数、包,并加以调用。
【实验内容】1.用显式游标编写程序,程序的功能是:计算每一个部门的平均工资。
注意异常的处理(例如,分母为0的异常)。
已写入文件afiedt.buf1 declare2 cursor c_dept is select * from dept order by deptno;3 cursor c_emp(p_dept emp.deptno%type)is selectename,sal from emp where deptno=p_dept4 order by ename;5 r_dept dept%rowtype;6 v_ename emp.ename%type;7 v_salary emp.sal%type;8 v_tot_salary emp.sal%type;9 begin10 open c_dept;11 loop12 fetch c_dept into r_dept;13 exit when c_dept%notfound;14dbms_output.put_line('department:'||r_dept.deptno||'-'||r_de pt.dname);15 v_tot_salary:=0;16 open c_emp(r_dept.deptno);17 loop18 fetch c_emp into v_ename,v_salary;19 exit when c_emp%notfound;20dbms_output.put_line('name:'||v_ename||'salary:'||v_salary);21 v_tot_salary:=v_tot_salary+v_salary;22 end loop;23 close c_emp;24 dbms_output.put_line('total salary fordept:'||v_tot_salary);25 end loop;26 close c_dept;27* end;SQL> /PL/SQL 过程已成功完成。
Oracle SQL PLSQL实验
实验1SQL*Plus的使用和基本SELECT语句实验要求(1)掌握SQL*Plus的基本使用(2)掌握SELECT语句的简单用法。
实验条件自我实践实验时间大约60分钟1.练习1 FOLLOW ME●时间20分钟●实验步骤(1)观看第1章教学视频。
(2)实践视频中的实例。
2.练习2●时间40分钟●实验步骤(1)登录到SQL*Plus,初始用户名为:SCOTT,口令为TIGER。
(2)分别显示EMP、DETP、SALGRADE表结构,并察看表中的数据。
(3)创建一个查询显示每个雇员的姓名、工作、受雇日期及雇员编号,并且要将雇员编号作为第一列显示。
最后将该SQL语句保存成文件p1q1.sql,并执行该脚本文件。
(4)将脚本文件p1q1.sql调取到SQL缓冲区,并将列标题设置为Emp #,Employee,Job及Hire Date,将该SQL语句保存成文件p1q2.sql,最后返回查询结果。
思考练习题1.SQL*Plus命令是用于访问数据库的吗?2.下面的SELECT语句能成功执行吗?SQL>SELECT ename,job,sal Salary2FROM emp;3.下面的语句有3处错误,请纠正它们。
SQL>SELECT empno,ename2Salary x 12 ANNUAL SALARY3FROM emp;4.创建一个查询从EMP表中检索出不重复的工作名称。
5.用一个逗号和一个空格将姓名和工作连接后作为一个整体输出,显示的列标题为Employee and Title。
6.创建一个查询,用逗号将表中所有字段的信息连接作为一个整体输出,输出的列标题为THE_OUTPUT。
实验2使用WHERE和ORDER BY子句实验要求(1)掌握WHERE子句的用法。
(2)掌握ORDER BY子句的用法。
实验条件自我实践实验时间大约60分钟1.练习1FOLLOW ME●时间20分钟●实验步骤(1)观看第2章教学视频。
《Oracle数据库》实验报告
实验二Oracle数据库开发环境下PL/SQL编程(2学时)【实验目的】(1)掌握PL/SQL 的基本使用方法。
(2)在SQL*PLUS环境下运行PL/SQL的简单程序。
(3)应用PL/SQL 解决实际问题【实验内容与步骤】一、实验内容:1、用PL/SQL实现:输入eno的值,显示emp表中对应记录的内容。
2、用PL/SQL完成:读入三个数,计算并输出它们的平均值及三个数的乘积。
3、对职工表emp中的雇员SCOTT提高奖金,若工种为MANAGER,则奖金提高其原来的20%;若工种为SALESMAN,则奖金提高其原来的15%;若工种为ANALYST,则奖金提高其原来的10%,其它都按原来的7%提高。
4、用PL/SQL块实现下列操作公司为每个职工增加奖金:若职工属于30号部门,则增加$150;若职工属于20号部门,则增加$250;若职工属于10号部门,则增加$350。
(提示:游标请自行阅读相关内容)DECLAREaddcomm m%type;CURSOR emp_cursor IS select deptno from emp;BEGINFOR emprec IN emp_cursor LOOPIF emprec.deptno=30 THEN addcomm:=150;ELSIF emprec.deptno=20 THEN addcomm:=250;ELSIF emprec.deptno=10 THEN addcomm:=350;END IF;Update empset comm=comm+ addcomm where deptno= emprec.deptno;END LOOP;COMMIT WORK;END;实验三PL/SQL触发器和存储过程(2学时)【实验目的】(1)了解触发器的类型。
(2)掌握PL/SQL触发器的使用方法。
(3)了解存储过程的使用方法。
(4)掌握存储过程的使用方法。
【实验内容】实验内容:1、编写一个数据库触发器,当任何时候某个部门从dept表中删除时,该触发器将从emp 表中删除该部门的所有雇员。
Oracle-实验4(实验报告)-PL-SQL程序设计
学期Oracle数据库应用技术实验报告选课序号:班级:学号:姓名:指导教师:史金余成绩:2017年月日目录PL/SQL程序设计1.实验目的◆掌握PL/SQL程序设计基本技巧,包括基本数据类型、表类型、数组类型、匿名程序块、控制语句、PL/SQL中使用SQL语句、游标、错误处理等。
◆熟悉和掌握PL/SQL中关于存储过程、函数、包和触发器程序设计技术。
2.实验内容实验平台:PL/SQL Developer或Oracle的其它客户端管理工具。
某餐饮系统数据库(加粗字段为主键,斜体字段为外键),请创建如下各数据表,并实现如下存储过程、函数、包和触发器等功能设计,将程序脚本保存到文本文件Source.sql中:(1)菜肴类别表MK(菜肴类别编号MKid,菜肴类别名称MkName),菜肴类别名称:鱼类、蔬菜类、凉菜类、肉类、主食类和酒水类等。
(2)菜单信息表MList(菜肴编号Mid,菜肴名称Mname,菜肴类别MKid,菜肴单价Mprice,菜肴成本单价Mcost,更新日期Mdate)。
(3)餐台类别表DK(餐台类别编号DKid,餐台类别名称DkName),餐台类别:包间和散台等。
(4)餐台信息表Dinfo (餐台编号Did,餐台名称Dname,餐台类别DKid,座位数Dseats,更新日期Ddate)。
(5)消费单主表C (消费单号Cid,餐台编号Did,消费开始时间StartTime,结账时间EndTime,消费金额合计Smoney,盈利金额合计SPsum),其中,消费金额合计=消费单明细表CList中该消费单号的所有消费记录的消费金额的合计,即SUM(消费金额)或SUM(菜肴单价×消费数量),盈利金额合计=消费单明细表CList中该消费单号的所有消费记录的盈利合计,即SUM((菜肴单价- 菜肴成本单价)×消费数量)。
(6)消费单明细表CList (消费单号Cid,序号Sid,菜肴编号Mid,菜肴名称Mname,消费数量Cqty,菜肴单价Mprice,菜肴成本单价Mcost,消费金额Cmoney) ,消费金额=消费数量×菜肴单价;消费数量为正数是正常点菜,消费数量为负数是退菜,消费数量为0是赠菜。
PL/SQL程序设计
PL/SQL程序设计PL/SQL是一种数据库编程语言,广泛应用于Oracle数据库管理系统中。
它是SQL的一种扩展,添加了过程性编程的特性,允许开发者创建更复杂、可重用的程序逻辑。
PL/SQL程序设计可以分为以下几个方面:1.PL/SQL的基本概念:PL/SQL是过程性语言和SQL结构的结合。
它使用块的概念,一个块由一个可选的声明部分、一个执行部分和一个可选的异常处理部分组成。
PL/SQL程序可以包含变量、常量、游标和异常处理等元素。
2.变量和数据类型:在PL/SQL中,可以通过声明变量来存储和操作数据。
PL/SQL中支持多种数据类型,包括基本的整型、字符型、日期型等,还可以自定义记录类型和表类型。
使用变量可以在程序中存储临时数据,进行运算和逻辑判断。
3.控制结构:PL/SQL支持多种控制结构,包括条件语句、循环语句和异常处理语句。
条件语句可以根据一些条件来执行不同的操作。
循环语句可以重复执行一段代码,直到满足退出条件为止。
异常处理语句用于捕获和处理运行时错误,保证程序的健壮性。
4.子程序:PL/SQL中的子程序可以是存储过程、函数或触发器。
存储过程是一段可重用的代码块,它可以在数据库中存储和调用。
函数是一个具有返回值的子程序,可以在SQL语句中使用。
触发器是与表相关联的特殊存储过程,当满足特定的条件时自动触发。
5.游标和异常处理:PL/SQL中的游标用于处理查询结果集。
游标可以使用循环语句来遍历结果集,并进行相应的操作。
异常处理是PL/SQL的一大特点,它可以有效地捕获和处理运行时错误。
在异常处理部分,可以指定对应不同类型错误的处理方式,例如日志记录、回滚事务等。
6.包和包体:PL/SQL中的包是一种逻辑上的封装,它可以包含变量、常量、游标和子程序等。
包体是包的实现部分,声明和定义了包中的各个元素。
使用包可以将相关的数据和逻辑组织在一起,提供更好的可维护性和可重用性。
7.异常处理和日志记录:在实际的PL/SQL开发中,异常处理是非常重要的。
Oracle数据库实验-PLSQL块结构,条件、循环语句的使用
Oracle数据库基础实验4 PL/SQL块结构,条件、循环语句的使用【实验学时】2学时【实验目的】1.学习匿名PL/SQL块的基本结构。
2.了解PL/SQL的基本数据类型。
3.掌握PL/SQL中变量和常量的定义方法。
4.学会在PL/SQL程序中使用复合数据类型:记录和集合。
5.学会使用select…into…语句返回一行数据。
6.练习在PL/SQL中使用DML语句和动态SQL语句。
7.熟练掌握PL/SQL中的选择和循环语句的使用。
【实验内容】1.定义一个PL/SQL块,向屏幕输出hello world!。
SQL> ed已写入文件afiedt.buf1 declare2 begin3 dbms_output.put_line('hello,world');4 exception5 when others then6 dbms_output.put_line('error');7 raise;8* end;SQL> /hello,worldPL/SQL 过程已成功完成。
2.定义一个PL/SQL块,将输入的字符串中大小写相互转换后向屏幕输出。
例如,输入abDCe,输出ABdcESQL> ed已写入文件afiedt.buf1 declare2 str1 varchar2(20):='&str1';3 str2 varchar2(2);4 str3 varchar2(20);5 len number(10);6 leng number(10);7 begin8 len:=1;9 leng:=length(str1);10 while len<=leng loop11 str2:=substr(str1,len,1);12 if str2>='a' and str2<='z' then13 str3:=str3||upper(str2);14 elsif str2>='A' and str2<='Z' then15 str3:=str3||lower(str2);16 end if;17 len:=len+1;18 end loop;19 dbms_output.put_line(str3);20* end;SQL> /输入str1 的值: ehhrfEdsd原值2: str1 varchar2(20):='&str1';新值2: str1 varchar2(20):='ehhrfEdsd';EHHRFeDSDPL/SQL 过程已成功完成。
实验6PLsql
实验4 PL/SQL程序实验一、实验目的理解PL/SQL程序结构,掌握Oracle的PL/SQL程序的编制与调试方法并理解Oracle 数据库中的异常处理。
二、实验要求实验任务1.编制各种控制结构的PL/SQL程序上机调试课堂中所讲述的所有例题按要求编制程序:根据SCOTT用户的emp表中的DEPTNO字段的值,为姓名为FAN的雇员修改工资,若部门号为10,则工资加100元;若部门号为20,则工资加300元,否则工资加400元。
2.编制带有异常处理的PL/SQL程序上机调试课堂中所讲述的所有带有异常处理的PL/SQL程序例题按要求编制程序:对SCOTT用户的EMP表中的每一个雇员按不同情况征收个人所得税。
将各雇员的雇员号(empno)、姓名(ename)及所得税(stax)存放于名为TAX的表中。
如果工资高于4000元,征收20%的税,并触发自定义的异常将该情况说明写入TAX的备注(memo)字段。
否则,均征收10%的税。
三、实验学时安排课堂内2学时完成实验所要求的所有内容。
四、实验内容与步骤1)选择【开始】/【程序】/【Oracle-OraHome92】/【ApplicationDevelopment】/【SQL*Plus】选项,出现SQL*Plus环境的登录界面,在用户名文本框中输入实验3的任务1中创建的用户名,口令文本框中输入实验3的任务1中创建的用户口令,在主机字符串文本框中输入配置好的网络服务名。
如图4-1所示。
图4-1 用创建的用户登录SQL*Plus2)登录到SQL*Plus 环境后,用EDIT 命令后接文件名来调用操作系统的文本编辑器(Windows2000/NT操作系统默认为记事本),如图4-2所示。
图4-2 在SQL*Plus 环境中使用EDIT 命令调用文本编辑器3)在文本编辑器中编写程序源代码,如图4-3所示。
图4-3 在文本编辑器中编写程序源代码4)存盘(文件默认扩展名为.sql,可以修改文件扩展名及保存路径,如果不做更改,默认保存在安装Oracle的路径下的\oracle\ora92\bin目录下)退出返回到SQL*Plus环境,用@或START文件名(如果更改过存放路径,在文件名前要指定存放的路径)执行,如图4-4所示。
oracle 第4章plsql编程
第二步:声明游标 游标的声明也放在declare块中,由标标名和希望执行的查询语句组 成 语法: CURSOR cursor_name IS select_statement 其中:cursor_name为游标名,select_statement为可执行的查询
语句
如: declare ..... CURSOR v_cursor_dept IS select * from scott.dept
示例:使用for in 枚举员工信息
declare cursor cursor_emp is select * from scott.emp; -- 1 定义游标 begin for m in cursor_emp -- 这行代码 包含了 打开游标 提取游标 loop dbms_output.put_line(m.ename||' '||m.empno); end loop; end;
控制语句
条件控制语句 if 条件 then 执行语句.... end if; if 条件 then 执行语句1.... elsif 条件 then 执行语句2.... end if;
if 条件 then 执行语句1.... else 执行语句2.... end if;
控制语句
循环控制语句 loop 执行语句.... [EXIT|EXIT When (条件)] end loop; while 条件 loop 执行语句.... end loop; for counter in [ reverse] value1..value2 loop 执行语句.... end loop; (reverse:对值从大到小执行循环)
游标的使用
第三步:打开游标 打开游标在begin(即PL/SQL的执行块中)的执行段中,打开游标 使用open语句 语法: OPEN cursor_name 其中:cursor_name为游标名
PLSQL程序设计主要内容PLS...
PL/SQL程序设计主要内容:PL/SQL 语言的基本特征、PL/SQL程序的结构、PL/SQL语言的控制结构、游标(cursor)编程、错误处理、存储过程和函数、创建包(Package)、触发器(Trigger)。
第一章PL/SQL 语言的基本特征1. 什么是PL/SQL?PL/SQL是Procedure Language & Structured Query Language 的缩写。
SQL SERVER:Transaction-SQL。
PL/SQL 可分为两种:数据库PL/SQL和工具PL/SQL。
两者的编程非常相似。
都具有编程结构、语法和逻辑机制。
主要介绍数据库PL/SQL内容。
工具PL/SQL用于Oracle的客户端开发工具。
工具PL/SQL另外还增加了用于支持工具(如ORACLE Forms)的句法,如:在窗体上设置按钮等。
Oracle的客户端开发工具Oracle iDS(Developer Studio)Release 2 (10.2)包括的软件:Oracle10g JDeveloper -JAVA开发工具Oracle10g Forms Developer -窗体开发Oracle10g Designer -数据库工具Oracle10g Software Configuration Manager -软件配置Oracle10g Reports Developer -报表开发Oracle10g Discoverer AdministratorOracle10g Warehouse Builder -数据仓库Oracle10g Business Intelligence Beans -商业智能2. PL/SQL 语言的特征支持SQL语言、支持面向对象编程、可移植、与Oracle集成。
PL/SQL程序不区分大小写。
字符串数据区分大小写。
3. PL/SQL 可用的SQL语句在PL/SQL中可以使用的SQL语句有:INSERT,UPDATE,DELETE,SELECT INTO,COMMIT,ROLLBACK,SAVEPOINT。
Oracle实验四上:PL SQL程序设计:控制结构和嵌入式SQL
《数据库开发技术》实验四
实验题目:PL/SQL程序设计:控制结构和嵌入式SQL
日期
2015-11-15
班级
计算机1301
姓名
实验环境:Win10+Oracle11g
实验内容与完成情况(记录所有的实验过程):
1.通过CASE语句判断7788雇员的工资等级后输出,工资等级划分条件是:3000(含)以上为高,1500(含)至3000为中,低于1500为低。
Sql语句:
set serveroutput on
declare
v_sum number;
v_iniNum number;
begin
v_sum :=ቤተ መጻሕፍቲ ባይዱ0;
v_iniNum := 12;
loop
v_sum := v_sum+v_iniNum;
v_iniNum := v_iniNum + 20;
exit when v_iniNum > 152;
/
效果截图:
方式二:
set serveroutput on
declare
v_nnumber;
begin
For v_n in 32..126 loop
Insert intod_asc(n, a )
Values
(v_n,CHR(v_n));
End loop;
end;
/
效果截图:
附加题:
*用PL/SQL的FOR循环输出以下实心三角形:
else '低'
end
into v_grade
PLSQL编程实验报告
PL/SQL编程实验报告班级:10网工三班学生姓名:谢昊天学号:1215134046实验目的和要求:(1) 掌握PL/SQL块结构、PL/SQL的基本语法、PL/SQL的控制结构。
(2) 掌握PL/SQL块中使用复合数据类型和游标的方法。
(3) 掌握PL/SQL异常处理技术。
(4) 掌握存储过程、存储函数、触发器高级数据库对象的基本作用。
(5) 掌握存储过程、存储函数、触发器的建立、修改、查看、删除操作。
实验内容:(1) 记录执行命令和操作过程中遇到的问题及解决方法,注意从原理上解释原因。
(2) 记录利用SQL*Plus或iSQL*Plus编写、执行PL/SQL程序的命令。
(3) 记录执行命令和操作过程中遇到的问题及解决方法,注意从原理上解释原因。
(4) 记录利用企业管理器管理存储过程、存储函数、触发器的方法。
(5) 记录利用SQL*Plus和iSQL*Plus管理存储过程、存储函数、触发器的命令。
实验步骤与调试过程:1、打开DOS命令窗口,在其中输入sqlplus system/system命令进入oracle数据库系统。
2、在SQLPLUS下输入create table business(bno char(10) primary key,bname char(50) not null,btype char(4),baddress char(20),btel char(13));,创建一个business表,3、用同样的方法新建hospital、card、staff、consume、insurance等表,使用“desc 报表名”查看表结构。
4、新建表staff_sq1,包含两列sno、sname,5、在SQLPLUS下输入alter table staff_sq1 rename to staff_sq10;,修改以表名。
6、创建基于医院名的索引,输入create index hospital_name_index on HOSPITAL(HNAME DESC);。
实验04 PLSQL基础
实验四PL/SQL基础一、实验目的及要求(1) 掌握PL/SQL语句块、PL/SQL的基本语法、PL/SQL的控制结构。
(2) 掌握PL/SQL块中使用复合数据类型和游标的方法。
(3) 掌握PL/SQL异常处理技术。
二、实验主要内容(1) 记录执行命令和操作过程中遇到的问题及解决方法,注意从原理上解释原因。
(2) 记录利用SQL*Plus编写、执行PL/SQL程序的命令。
(3) 记录执行命令和操作过程中遇到的问题及解决方法,注意从原理上解释原因。
(4) 记录利用SQL*Plus管理存储过程、存储函数、触发器的命令。
三、实验仪器设备在局域网环境下,有一台服务器和若干台客户机。
服务器成功安装Oracle 11g数据库服务器(企业版),客户机成功安装Oracle 11g客户端软件,网络服务配置正确,数据库和客户端正常工作。
四、实验步骤1、PL/SQL语句块定义一个包含声明、执行和异常处理的语句块查询EMP表中职工号7788的工资,输出工资的值并且如果工资小于3000那么把工资更改为3000,异常部分对NO_DA TA_FOUND异常进行处理,输出没有该员工。
如果想运行缓冲区的内容,那么可以用RUN命令或者/命令;serveroutput需要设置为on 2、变量、数据类型和系统函数的使用1)定义三个变量,一个变量的初始值为字符串‘你好,’第二个字符串赋值为‘我是XXX’,这里写上自己的名字,第三个变量为前两个变量中的字符串连接之后的结果。
输出第三个变量的值。
2)将自己的名字作为字符串求出其长度,将长度与数字2进行比较,如果不大于2,输出‘我的名字是两个字’。
3)定义三个变量,分别用来存储emp表中的ename,sal,job三个列的值,并对其进行输出;要求用两种方式实现(%type类型和非%type类型)。
4)创建一个记录类型v_record,类型包含v_name,v_salary,v_job,v_deptno等分量,要求记录类型中各个分量的数据类型和emp表中ename,sal,job,deptno列的数据类型一致(%type实现)。
PLSQL程序设计
PLSQL程序设计PL/SQL(Procedural Language/Structured Query Language)是一种编程语言,被广泛用于Oracle数据库管理系统中。
它结合了SQL的优势和过程化编程的能力,允许开发人员编写复杂的程序来处理和管理数据。
PL/SQL的程序设计主要包括声明变量、控制结构、循环语句、异常处理和存储过程等。
首先,PL/SQL允许开发人员在程序中声明变量,这些变量可以存储数据,以供程序使用。
在声明变量之后,可以对其进行赋值和引用。
PL/SQL支持多种数据类型,包括数字、字符、日期和布尔值等。
其次,PL/SQL提供了控制结构,可以根据不同的条件来执行不同的代码块。
常用的控制结构包括条件语句(IF-THEN-ELSE)、CASE语句和循环语句(FOR、WHILE)。
这些结构使得开发人员可以根据需要来控制程序的执行流程。
异常处理是PL/SQL的一个重要特性。
通过使用TRY-CATCH块,可以捕捉和处理程序中可能发生的异常。
开发人员可以定义自己的异常,并根据需要采取适当的措施来处理异常,例如记录日志、回滚事务等。
存储过程是PL/SQL的一个重要组成部分。
它允许开发人员将一组SQL语句封装为一个可重复使用的块,并且可以在数据库中进行存储,以便其他程序可以调用。
存储过程在提高性能、简化复杂操作和增强数据安全性方面具有广泛的应用。
此外,PL/SQL还提供了许多其他功能,如游标(用于处理查询结果集)、函数(用于返回单个值)和触发器(用于在数据发生变化时执行相应的操作)等。
这些功能使得开发人员可以更高效地处理和管理数据。
总结起来,PL/SQL是一种强大的程序设计语言,适用于处理和管理Oracle数据库中的数据。
它结合了SQL的优势和过程化编程的能力,在开发数据库应用程序时具有很大的优势。
通过灵活运用PL/SQL的各种功能,开发人员可以编写高效、可靠和安全的程序。
Oracle数据库 实验报告
在SQL*PLUS或PL/SQL Developer工具中编写PL/SQL的简单程序,熟悉PL/SQL的编程环境和代码结构。实现与Oracle数据库交互,并捕获和处理常见系统异常和用户自定义异常。
3.主要仪器设备及软件
1)PC
2)ORACLE数据库
-------------------------------------------------------------------------
实现下面功能:
使用游标实现:将某门课程高于平均分的学生的姓名,课程名,成绩格式化输出。
3.主要仪器设备及软件
1)PC
2)ORACLE数据库
-------------------------------------------------------------------------
实验一 了解ORACLE环境,使用ORACLE数据库实用工具
( 验证性实验 4学时)
1.目的要求:
了解ORACLE数据库的各个常用工具软件
2.实验内容:
在ORACEL数据库下使用SQL*PLUS ,SQL*PLUS Worksheet,PL/SQL Developer工具,企业管理器等实用工具与Oracle交互。并在企业管理器中观察ORACLE的底层存储原理。在PL/SQL Developer中书写简单的SQL语言。
3.主要仪器设备及软件
1)PC
2)ORACLE数据库
-------------------------------------------------------------------------
实验六 触发器,序列及同义词
( 验证性实验 6学时)
PL/SQL程序设计
PL/SQL程序设计PL/SQL是Oracle数据库中的编程语言,用于在数据库中创建存储过程、函数、触发器等数据库对象,以提供更高级的数据处理和业务逻辑功能。
下面将介绍一些PL/SQL的基本概念和用法,并通过示例演示其程序设计能力。
PL/SQL是一种结合了SQL和Procedural Language的编程语言,它允许在数据库中编写逻辑代码。
PL/SQL包括了一些基本的语法元素,如条件判断、循环语句、异常处理等,还可以使用SQL语句进行数据查询和数据操作。
PL/SQL程序有两种类型:匿名块和命名块。
匿名块是一段临时的、不可重复使用的代码,而命名块则是一段命名的代码,可以在其它代码中多次调用。
下面是一个例子,演示了如何使用PL/SQL创建一个匿名块:```plsqlDECLAREv_name VARCHAR2(100) := 'John';BEGINDBMS_OUTPUT.PUT_LINE('Hello, ' , v_name , '!');END;```在上面的例子中,我们声明了一个变量v_name,并将其赋值为'John'。
然后使用DBMS\_OUTPUT.PUT\_LINE函数将Hello, John!打印到控制台。
除了匿名块,PL/SQL还可以创建存储过程、函数和触发器等可重复使用的数据库对象。
下面是一个示例,演示了如何使用PL/SQL创建一个简单的存储过程:```plsqlCREATE OR REPLACE PROCEDURE get_employeep_employee_id IN NUMBER,p_department_id OUT NUMBER,p_salary OUT NUMBERISBEGINSELECT department_id, salary INTO p_department_id, p_salary FROM employeesWHERE employee_id = p_employee_id;END;```在上面的例子中,我们创建了一个名为get\_employee的存储过程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学期Oracle数据库应用技术实验报告选课序号:班级:学号:姓名:指导教师:史金余成绩:2017年月日目录1.实验目的 (1)2.实验容 (1)2.1 触发器设计 (2)2.2 存储过程、自定义函数设计 (2)2.3 程序包设计 (3)3.实验步骤 (3)3.1 创建表空间RESTAURANT,创建用户DINER (3)3.2 创建餐饮系统数据库的所有表,并向各表插入演示数据.. 43.3 完成【实验容】中的触发器、存储过程、函数和程序包等功能设计,将程序脚本保存到文本文件Source.sql中 (7)4.实验总结 (13)PL/SQL程序设计1.实验目的◆掌握PL/SQL程序设计基本技巧,包括基本数据类型、表类型、数组类型、匿名程序块、控制语句、PL/SQL中使用SQL语句、游标、错误处理等。
◆熟悉和掌握PL/SQL中关于存储过程、函数、包和触发器程序设计技术。
2.实验容实验平台:PL/SQL Developer或Oracle的其它客户端管理工具。
某餐饮系统数据库(加粗字段为主键,斜体字段为外键),请创建如下各数据表,并实现如下存储过程、函数、包和触发器等功能设计,将程序脚本保存到文本文件Source.sql中:(1)菜肴类别表MK(菜肴类别编号MKid,菜肴类别名称MkName),菜肴类别名称:鱼类、蔬菜类、凉菜类、肉类、主食类和酒水类等。
(2)菜单信息表MList(菜肴编号Mid,菜肴名称Mname,菜肴类别MKid,菜肴单价Mprice,菜肴成本单价Mcost,更新日期Mdate)。
(3)餐台类别表DK(餐台类别编号DKid,餐台类别名称DkName),餐台类别:包间和散台等。
(4)餐台信息表Dinfo (餐台编号Did,餐台名称Dname,餐台类别DKid,座位数Dseats,更新日期Ddate)。
(5)消费单主表C (消费单号Cid,餐台编号Did,消费开始时间StartTime,结账时间EndTime,消费金额合计Smoney,盈利金额合计SPsum),其中,消费金额合计=消费单明细表CList中该消费单号的所有消费记录的消费金额的合计,即SUM(消费金额)或SUM(菜肴单价×消费数量),盈利金额合计=消费单明细表CList中该消费单号的所有消费记录的盈利合计,即SUM((菜肴单价 - 菜肴成本单价)×消费数量)。
(6)消费单明细表CList (消费单号Cid,序号Sid,菜肴编号Mid,菜肴名称Mname,消费数量Cqty,菜肴单价Mprice,菜肴成本单价Mcost,消费金额Cmoney) ,消费金额=消费数量×菜肴单价;消费数量为正数是正常点菜,消费数量为负数是退菜,消费数量为0是赠菜。
2.1 触发器设计2.1.1 为消费单明细表CList定义一个触发器,每插入(INSERT)一条消费单明细记录(消费单号,序号,菜肴编号,消费数量),自动根据菜肴编号从菜单信息表MList中读取菜肴名称Mname、菜肴单价Mprice、菜肴成本单价Mcost,然后计算其消费金额(=消费数量×菜肴单价)、以及消费单主表C的消费金额合计、盈利金额合计。
编写相应的插入语句(INSERT)和查询语句(SELECT)测试该触发器效果。
2.1.2 为消费单明细表CList定义一个触发器,每更新UPDATE一条消费单明细表记录,自动修改其消费金额、以及消费单主表C的消费金额合计、盈利金额合计。
编写相应的更新语句(UPDATE)和查询语句(SELECT)测试该触发器效果。
2.1.3 为消费单明细表CList定义一个触发器,每删除DELETE一条消费单明细表记录自动修改其消费单主表C的消费金额合计、盈利金额合计。
编写相应的删除语句(DELETE)和查询语句(SELECT)测试该触发器效果。
2.1.4 将【2.1.1】、【2.1.2】、【2.1.3】三个触发器禁用disable,重新编写一个触发器实现这三个触发器的全部功能。
编写相应的插入语句(INSERT)、更新语句(UPDATE)、删除语句(DELETE)和查询语句(SELECT)测试该触发器效果。
2.2 存储过程、自定义函数设计2.2.1设计一个自定义函数fGetDTSum,实现统计某年份给定餐台类别的成本金额合计的功能,输入参数是统计年份和餐台类别,返回数据是成本金额合计。
成本金额=消费数量×菜肴成本单价。
求年份的函数为EXTRACT(YEAR FROM 日期字段),本题:统计年份= EXTRACT(YEAR FROM EndTime),EndTime为结账时间字段。
2.2.2设计一个存储过程pGetKindSum,实现统计某年份给定菜肴类别的盈利金额合计的功能,输入参数是统计年份和菜肴类别,输出参数是盈利金额合计。
盈利金额=消费数量× (菜肴单价 - 菜肴成本单价)。
2.2.3编写一段匿名PL/SQL程序块,调用函数fGetDTSum,输出2013年餐台类别名为“包间”的成本金额合计;调用存储过程pGetKindSum,输出2013年菜肴类别名为“鱼类”的盈利金额合计。
2.3 程序包设计2.3.1设计一个程序包,包名为pkSUM,包括并实现【2.2.1】和【2.2.2】的函数及存储过程功能,注意:先创建package,创建成功后,再创建包体package body。
2.3.2 设计一个匿名PL/SQL程序块,参照【2.2.3】调用【2.3.1】中程序包的函数和存储过程,输出2013年餐台类别名为“散台”的成本金额合计,输出2013年菜肴类别名为“蔬菜类”的盈利金额合计。
3.实验步骤(备注:如果用实验室微机,请从【3.2】开始做,登录用户DINER改为stu XX)3.1 创建表空间RESTAURANT,创建用户DINER3.1.2 用户SYSTEM登录Oracle3.1.3创建表空间RESTAURANT,大小10M。
CREATE TABLESPACE RESTAURANTDATAFILE'F:\RESTAURANT.ora'SIZE10MDEFAULT STORAGE(INITIAL10KNEXT50KMINEXTENTS1MAXEXTENTS99PCTINCREASE10)ONLINE;3.1.4 创建用户DINER,口令XXX,默认表空间RESTAURANT,给该用户授予角色权限CONNECT、RESOURCE。
CREATE USER DINER IDENTIFIED BY "wzl123" DEFAULT TABLESPACE RESTAURANT;GRANT CONNECT TO DINER;GRANT RESOURCE TO DINER;3.2 创建餐饮系统数据库的所有表,并向各表插入演示数据3.2.1启动PL/SQL Developer(或者启动SQL*PLUS、Enterprise ManagerConsole、浏览器模式的EM(企业管理器)等工具均可以),用户DINER登录Oracle。
3.2.2 创建实验容中的餐饮系统数据库的所有表(菜肴类别表MK、菜单信息表MList、餐台类别表DK、餐台信息表Dinfo、消费单主表C、消费单明细表CList)。
create table MK(MKid number,MkName varchar2(64),constraint pk_MKid primary key(MKid));create table MList(Mid number,Mname varchar2(64),MKid number references MK(MKid),Mprice number(8,2),Mcost number(8,2),Mdate date,constraint pk_Mid primary key(Mid));create table DK(DKid number,DkName varchar2(64),constraint pk_DKid primary key(DKid));create table Dinfo(Did number,Dname varchar2(64),DKid number references DK(DKid),Dseats number,Ddate date,constraint pk_Did primary key(Did));create table C(Cid number,Did number references Dinfo(Did),StartTime date,EndTime date,Smoney number(8,2),SPsum number(8,2),constraint pk_Cid primary key(Cid));create table CList(Sid number,Cid number references C(Cid),Mid number references MList(Mid),Mname varchar2(64),Cqty number,Mprice number(8,2),Mcost number(8,2),Cmoney number(8,2),constraint pk_Sid primary key(Sid));3.2.3依次向菜肴类别表MK、菜单信息表MList、餐台类别表DK、餐台信息表Dinfo插入足够多的演示数据。
insert into MK values(1,'鱼类');insert into MK values(2,'蔬菜类');insert into MK values(3,'凉菜类');insert into MK values(4,'肉类');insert into MK values(5,'主食类');insert into MK values(6,'酒水');insert into MList values(1,'鲤鱼',1,50.00,30.00,sysdate);insert into MList values(2,'三文鱼',1,120.00,80.00,sysdate); insert into MList values(3,'白菜',2,15.00,5.00,sysdate); insert into MList values(4,'土豆',2,12.00,4.00,sysdate); insert into MList values(5,'油麦菜',2,12.00,5.00,sysdate); insert into MList values(6,'凉拌黄瓜',3,5.00,3.00,sysdate); insert into MList values(7,'鸡肉',4,30.00,10.00,sysdate); insert into MList values(8,'米饭',5,1.50,0.50,sysdate); insert into MList values(9,'二锅头',6,50.00,30.00,sysdate);insert into DK values(1,'包间');insert into DK values(2,'散台');insert into Dinfo values(1,'1号包间',1,20,sysdate);insert into Dinfo values(2,'2号包间',1,30,sysdate);insert into Dinfo values(3,'3号包间',1,50,sysdate);insert into Dinfo values(4,'1号散台',2,8,sysdate);insert into Dinfo values(5,'2号散台',2,8,sysdate);insert into Dinfo values(6,'3号散台',2,15,sysdate);insert into C values(1,2,sysdate,sysdate,275,150);insert into C values(2,2,sysdate,sysdate,155,80);insert into C values(3,1,sysdate,sysdate,566,302);insert into C values(4,2,sysdate,sysdate,89,53);insert into C values(5,1,sysdate,sysdate,798,435);insert into CList values(1,1,2,'三文鱼',1,120.00,80.00,120.00);insert into CList values(2,1,5,'油麦菜',1,12.00,5.00,12.00);insert into CList values(3,1,9,'二锅头',2,50.00,30.00,100.00);3.3 完成【实验容】中的触发器、存储过程、函数和程序包等功能设计,将程序脚本保存到文本文件Source.sql中3.3.1 在PL/SQL Developer环境下,用户DINER登录Oracle3.3.2新建SQL窗口3.3.3 完成【2.1 触发器设计】(1)2.1.1CREATE OR REPLACE TRIGGER tri_CListBEFORE INSERT ON CList FOR EACH ROWDECLAREt_Smoney C.Smoney%type;t_SPsum C.SPsum%type;BEGIN--补全MlistSELECT Mname,Mprice,Mcost,:new.Cqty*MpriceINTO:new.Mname,:new.Mprice,:new.Mcost,:new.CmoneyFROM Mlist WHERE Mlist.Mid=:new.Mid;--计算Mlist的增加量SELECT NVL(SUM(Cqty*Mprice),0),NVL(SUM(Cqty*(Mprice-Mcost)),0)INTO v_Smoney,v_SPsum FROM Clist WHERE Clist.Cid=:new.Cid;--更新Cupdate C set Smoney=t_Smoney+:new.Cmoney,SPsum=t_SPsum+(:new.Cqty*(:new.Mprice-:new.Mcost)) where C.Cid=:new.Cid;END tri_CList;(2)2.1.2CREATE OR REPLACE TRIGGER tri_upCList BEFORE UPDATE ON CList FOR EACH ROWBEGINSELECT Mname,Mprice,Mcost INTO:new.Mname,:new.Mprice,:new.McostFROM Mlist WHERE Mlist.Mid=:new.Mid;:new.Cmoney:=NVL(:new.Cqty,:old.Cqty)*NVL(:new.Mprice,:old.Mprice);UPDATE C SET Smoney=Smoney-:old.Cmoney+:new.Cmoney,SPsum=SPsum-:old.Cqty*(:old.Mprice-:old.Mcost)+:new.Cqty*(:new.Mprice-:new.Mcost) WHERE C.Cid=:old.Cid;END tri_upCList;(3)2.1.3CREATE OR REPLACE TRIGGER tri_delCListBEFORE DELETE ON CList FOR EACH ROWBEGINUPDATE C SET C.Smoney=C.Smoney-:old.Cmoney,C.SPsum=C.SPsum-(:old.Cqty*(:old.Mprice-:old.Mcost))WHERE C.Cid=:old.Cid;END tri_delCList;(4)2.1.4CREATE OR REPLACE TRIGGER tri_allBEFORE INSERT OR UPDATE OR DELETEON CListFOR EACH ROWDECLAREt_Smoney C.Smoney%type;t_SPsum C.SPsum%type;BEGINIF INSERTING THENSelect Mname,Mprice,Mcost,:new.Cqty*Mpriceinto:new.Mname,:new.Mprice,:new.Mcost,:new.Cmoneyfrom Mlistwhere Mlist.Mid=:new.Mid;Select nvl(sum(Cqty*Mprice),0),nvl(sum(Cqty*(Mprice-Mcost)),0)into t_Smoney,t_SPsumfrom Clistwhere Clist.Cid=:new.Cid;update Cset Smoney=t_Smoney+:new.Cmoney,SPsum=t_SPsum+(:new.Cqty*(:new.Mprice-:new.Mcost)) where C.Cid=:new.Cid;ELSIF UPDATING THENselect Mname,Mprice,Mcostinto:new.Mname,:new.Mprice,:new.Mcostfrom Mlistwhere Mlist.Mid=:new.Mid;:new.Cmoney:=nvl(:new.Cqty,:old.Cqty)*nvl(:new.Mprice,:old.Mprice);Update C set Smoney=Smoney-:old.Cmoney+:new.Cmoney,SPsum=SPsum-:old.Cqty*(:old.Mprice-:old.Mcost)+:new.Cqty*(:new.Mprice-:new.Mcost) where C.Cid=:old.Cid;ELSEUPDATE C SETC.Smoney=C.Smoney-:old.Cmoney,C.SPsum=C.SPsum-(:old.Cqty*(:old.Mprice-:old.Mcost));END IF;END tri_all;3.3.4 完成【2.2 存储过程、自定义函数设计】(1)2.2.1CREATE OR REPLACE FUNCTION fGetDTSum(Cyear char,Ctable dk.dkname%type)RETURN C.spsum%TYPEAScons C.spsum%TYPE;BEGINselect nvl(sum(spsum),0)into cons from Cwhere did in(select did from dinfo where dkid in(select dkid from dk where dkname=Ctable))and(to_char(endtime,'YYYY')=Cyear);RETURN cons;EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('The data is invalid!');END fGetDTSum;(2)2.2.2CREATE OR REPLACE PROCEDURE pGetKindSum(Cyear char,Cname char,cons out clist.mcost%TYPE)ASBEGINselect nvl(sum(mprice-mcost),0)into cons from clist where mid in(select mid from mlist where mkid in(select mkid from mk where mkname=Cname))andcid in(select cid from C where to_char(endtime,'YYYY')=Cyear); EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('The data doesn’’t exists!'); END pGetKindSum;(3)2.2.3DECLAREcons1 C.spsum%TYPE;cons2 clist.mcost%TYPE;BEGINcons1:=fGetDTSum('2013','包间');pGetKindSum('2013','鱼类',cons2);DBMS_OUTPUT.PUT_LINE('cons1 '||cons1||'cons2 '||cons2||''); END;3.3.5完成【2.3 程序包设计】(1)2.3.1CREATE OR REPLACE PACKAGE pkSUMASFUNCTION fGetDTSum(Cyear char,Ctable dk.dkname%type)RETURN C.spsum%TYPE;PROCEDURE pGetKindSum(Cyear char,Cname char,cons out clist.mcost%TYPE);END pkSUM;CREATE OR REPLACE PACKAGE BODY pkSUMASCREATE OR REPLACE FUNCTION fGetDTSum(Cyear char,Ctable dk.dkname%type)RETURN C.spsum%TYPEAScons C.spsum%TYPE;BEGINselect nvl(sum(spsum),0)into cons from Cwhere did in(select did from dinfo where dkid in(select dkid from dk where dkname=Ctable))and(to_char(endtime,'YYYY')=Cyear);RETURN cons;EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('The data is invalid!');END fGetDTSum;CREATE OR REPLACE PROCEDURE pGetKindSum(Cyear char,Cname char,cons out clist.mcost%TYPE)ASBEGINselect nvl(sum(mprice-mcost),0)into cons from clistwhere mid in(select mid from mlist where mkid in(select mkid from mk where mkname=Cname))andcid in(select cid from C where to_char(endtime,'YYYY')=Cyear);EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('The data doesn’’t exists!');END pGetKindSum;END pkSUM;CREATE OR REPLACE PACKAGE BODY pkSUMASCREATE OR REPLACE FUNCTION fGetDTSum(Cyear char,Ctable dk.dkname%type)RETURN C.spsum%TYPEAScons C.spsum%TYPE;BEGINselect nvl(sum(spsum),0)into cons from Cwhere did in(select did from dinfo where dkid in(select dkid from dk where dkname=Ctable))and(to_char(endtime,'YYYY')=Cyear);RETURN cons;EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('The data is invalid!');END fGetDTSum;CREATE OR REPLACE PROCEDURE pGetKindSum(Cyear char,Cname char,cons out clist.mcost%TYPE)ASBEGINselect nvl(sum(mprice-mcost),0)into cons from clistwhere mid in(select mid from mlist where mkid in(select mkid from mk where mkname=Cname))andcid in(select cid from C where to_char(endtime,'YYYY')=Cyear);EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('The data doesn’’t exists!');END pGetKindSum;END pkSUM;(2)2.3.2DECLAREcons1 C.spsum%TYPE;cons2 clist.mcost%TYPE;BEGINcons1:=pkSUM.fGetDTSum1('2013','散台');pkSUM.pGetKindSum1('2013','蔬菜类',cons2);DBMS_OUTPUT.PUT_LINE('cons1:'||cons1||' cons2:'||cons2||'');END;4.实验总结这次实验让我学会了许多东西,比如PLSQL Developer的使用,高级PL/SQL 程序的编写,其中包括触发器,储存过程,自定义函数,匿名函数,程序包的设计与编写。