PLSQL程序结构
- 格式:doc
- 大小:241.50 KB
- 文档页数:3
PLSQL基本语法作者:gqk:1,什么是plsql: 是专⽤于Oracle服务器,在SQL基础之上,添加了⼀些过程化控制语句,叫PLSQL过程化包括有:类型定义,判断,循环,游标,异常或例外处理。
PLSQL强调过程2,Plsql语句块: PL/SQL程序都是以块(block)为基本单位,整个PL/SQL块分三部分:声明部分(⽤declare开头)执⾏部分(以 begin开头)其中执⾏部分是必须的,其他两个部分可选部分(以exception开头)结束:end--基本输出语句:BEGINdbms_output.put_line('hello,world');END;--基本输出语句BEGINdbms_output.put_line('hello,world');dbms_output.put_line(157);dbms_output.put_line(sysdate);dbms_output.put_line(true);--不能传⼊布尔值END;3,Plsql语句块分类: 匿名块:动态构造只执⾏⼀次(main)⼦程序:存储在数据库中的存储过程,函数及包等。
当在数据库建⽴好后可以在其他⼦程序中调⽤触发器:当数据库发⽣操作时,会触发⼀些事件,从⽽⾃动执⾏相应的程序4,Plsql中的变量类型:5,变量的使⽤: plsql中声明和执⾏部分要严格分开,在java中时先声明后写变量plsql中相反先声明在写数据类型: 变量在声明后没有赋值输出结果为空: 变量的声明和初始化:(boolean中只能声明不能输出)DECLAREi NUMBER(4) := 157;j NUMBER(6);c VARCHAR2(200) := 'HELLO,WORLD';d DATE := sysdate;b BOOLEAN := TRUE;BEGINj := 1000;--只能写在执⾏部分dbms_output.put_line('i=' || i);dbms_output.put_line('j=' || j);dbms_output.put_line('c=' || c);dbms_output.put_line('d=' || d);END;在声明快中对常量的声明: 变量名称【constant】 type 【not null】【:value】DECLAREc CONSTANT NUMBER(4) := 100;c2 NUMBER(4) NOT NULL := 101;BEGIN--c := 101; --常量不能重复赋值dbms_output.put_line('c=' || c);dbms_output.put_line('c2=' || c2);END; --空语句 NULL 执⾏语句中必须写东西DECLAREc CONSTANT NUMBER(4) := 100;c2 NUMBER(4) NOT NULL := 101;BEGINNULL;--空语句,作为占位符使⽤END; 6,PLSQL中使⽤sql: --更新100员⼯,⼯资增加1块钱 :(不能再执⾏块中直接输出select语句)声明变量:员⼯的编号声明变量:⼯资追加的钱数DECLAREv_empid BINARY_INTEGER := 100;v_money BINARY_INTEGER := 1;BEGINUPDATE employees SET salary=salary+v_moneyWHERE employee_id=v_empid;COMMIT;END;PLSQL中使⽤SQL语句的⼏种情况:DML或DCL语句:直接执⾏ 查询语句:SELECT...INTO 或者游标DDL语句:动态SQL执⾏ 7,SELECT...INTO...的使⽤:语法:SELECT 列1,列2,…… INTO 变量1,变量2,……--查询某个员⼯编号的姓名和⼯资:员⼯编号姓名⼯资 列和变量的顺序,个数必须保持⼀致(如果没有数据则会抛出异常,返回的结果超过⼀⾏也会有异常)DECLAREv_empid BINARY_INTEGER := 101;v_name VARCHAR2(50);v_salary NUMBER(8,2);BEGINSELECT last_name,salaryINTO v_name,v_salaryFROM employeesWHERE employee_id=v_empid;dbms_output.put_line(v_empid || ',' || v_name || ',' || v_salary);END;--查询某个员⼯编号的姓名,⼯资,⼊职⽇期,部门编号:(以上思路我们需要声明多个变量) DECLAREv_empid BINARY_INTEGER := 101;v_name VARCHAR2(50);v_salary NUMBER(8,2);v_hiredate DATE;v_deptid BINARY_INTEGER;BEGINSELECT last_name,salary,hire_date,department_idINTO v_name,v_salary,v_hiredate,v_deptidFROM employeesWHERE employee_id=v_empid;dbms_output.put_line(v_empid || ',' || v_name || ','|| v_salary || ',' || v_hiredate || ',' || v_deptid);END;java中处理多个数据我们可以封装为对象:plsql中可以声明记录类型:时把逻辑相关的数据作为⼀个单元存储起来:--记录类型record--查询某个员⼯编号的姓名,⼯资,⼊职⽇期,部门编号DECLARETYPE emp_record_type IS RECORD (empid BINARY_INTEGER := 102,ename VARCHAR2(50),salary NUMBER(8,2),hiredate DATE,deptid BINARY_INTEGER);e emp_record_type;BEGINSELECT employee_id,last_name,salary,hire_date,department_idINTO eFROM employeesWHERE employee_id=e.empid;dbms_output.put_line(e.empid);dbms_output.put_line(e.ename);dbms_output.put_line(e.salary);dbms_output.put_line(e.hiredate);dbms_output.put_line(e.deptid);END; --参照引⽤类型:参照已有的数据类型--参照引⽤类型--参照引⽤变量类型:变量名称%TYPE--参照引⽤表中的列类型:表名.列名%TYPE--参照引⽤表的记录类型:表名%ROWTYPE demo:DECLAREi NUMBER(4);j i%TYPE := 100;--参照i的类型k employees.employee_id%TYPE := 101;--参照员⼯表中员⼯编号的数据类型BEGINdbms_output.put_line('j=' || j);dbms_output.put_line('k=' || k);END;--查询某个员⼯编号的姓名,⼯资,⼊职⽇期,部门编号(参照类型)DECLARETYPE emp_record_type IS RECORD (empid employees.employee_id%TYPE := 102,ename st_name%TYPE,salary employees.salary%TYPE,hiredate employees.hire_date%TYPE,deptid employees.department_id%TYPE);e emp_record_type;BEGINSELECT employee_id,last_name,salary,hire_date,department_idINTO eFROM employeesWHERE employee_id=e.empid;dbms_output.put_line(e.empid);dbms_output.put_line(e.ename);dbms_output.put_line(e.salary);dbms_output.put_line(e.hiredate);dbms_output.put_line(e.deptid);END; --查询某个员⼯编号的姓名,⼯资,⼊职⽇期,部门编号(参照引⽤表的记录类型)DECLAREe employees%ROWTYPE;BEGINe.employee_id := 103;SELECT *INTO eFROM employeesWHERE employee_id=e.employee_id;dbms_output.put_line(e.employee_id);dbms_output.put_line(st_name);dbms_output.put_line(e.salary);dbms_output.put_line(to_char(e.hire_date,'yyyy-mm-dd'));dbms_output.put_line(e.department_id);END;--PLSQL表类型 /*TYPE ⾃定义类型名称 IS TABLE OF 元素类型INDEX BY BINARY_INTEGER;*/DECLARETYPE name_table_type IS TABLE OF VARCHAR2(50)INDEX BY BINARY_INTEGER;n name_table_type;BEGINn(-7) := 'tom';n(4) := 'jack';n(9) := 'rose';dbms_output.put_line('元素的长度:' || n.count);dbms_output.put_line(n(4));END; --表类型的常⽤属性DECLARETYPE name_table_type IS TABLE OF VARCHAR2(50)INDEX BY BINARY_INTEGER;n name_table_type;BEGIN--设置元素n(-5) := 'tom';n(3) := 'jack';n(17) := 'rose';n(23) := 'zhang';n(24) := 'wangwu';--删除指定下标的元素--n.delete(17);--删除⼀个范围的元素--n.delete(10,24);--删除所有元素--n.delete;--返回元素长度dbms_output.put_line('元素个数:' || n.count);--判断下标是否存在IF n.exists(17) THENdbms_output.put_line('true');ELSEdbms_output.put_line('false');END IF;--输出最⼩下标dbms_output.put_line(n.first);--输出最⼤下标dbms_output.put_line(st);--返回指定下标的元素dbms_output.put_line(n(3));--返回上⼀个或下⼀个存在的下标,如果没有,返回NULLdbms_output.put_line(n.next(10));dbms_output.put_line(n.prior(10));END;--BULK COLLECT INTO:把查询结果⼀次性赋给⼀个表类型的变量,下标⾃动从1开始递增 --查询所有的员⼯姓名,存储到⼀个表类型的变量中DECLARETYPE name_table_type IS TABLE OF VARCHAR2(50)INDEX BY BINARY_INTEGER;n name_table_type;BEGINSELECT last_name BULK COLLECT INTO nFROM employees;dbms_output.put_line('元素长度:' || n.count);dbms_output.put_line(n(2));END;--查询所有的员⼯信息,存储到⼀个表类型的变量中DECLARETYPE emp_table_type IS TABLE OF employees%ROWTYPEINDEX BY BINARY_INTEGER;e emp_table_type;BEGINSELECT * BULK COLLECT INTO eFROM employees;dbms_output.put_line('元素长度:' || e.count);dbms_output.put_line(e(2).last_name);dbms_output.put_line(e(3).salary);END; 8,DML语句返回值:--RETURNING语句:DML操作返回值赋给变量RETURN 列1,列2,... INTO 变量1,变量2,...--更新某个员⼯的⼯资,输出这个员⼯姓名,新⼯资DECLAREv_empid employees.employee_id%TYPE := 100;v_name st_name%TYPE;v_money employees.salary%TYPE := 1;v_salary employees.salary%TYPE;BEGINUPDATE employeesSET salary=salary+v_moneyWHERE employee_id=v_empidRETURNING last_name,salaryINTO v_name,v_salary;dbms_output.put_line('姓名:' || v_name);dbms_output.put_line('新⼯资:' || v_salary);END; --插⼊语句中使⽤RETURNING语句:DECLAREd dept%ROWTYPE;BEGININSERT INTO dept VALUES (50,'AA','BB')RETURN deptno,dname,loc INTO d;dbms_output.put_line(d.deptno);dbms_output.put_line(d.dname);dbms_output.put_line(d.loc);END; --删除语句中使⽤RETURNING语句DECLAREd dept%ROWTYPE;BEGINDELETE FROM deptWHERE deptno=50RETURN deptno,dname,loc INTO d;dbms_output.put_line(d.deptno);dbms_output.put_line(d.dname);dbms_output.put_line(d.loc);END; --DML操作返回多⾏数据--更新某个部门的员⼯的⼯资,返回被更新的员⼯姓名,新⼯资DECLARETYPE emp_record_type IS RECORD (ename st_name%TYPE,salary employees.salary%TYPE);TYPE emp_table_type IS TABLE OF emp_record_typeINDEX BY BINARY_INTEGER;e emp_table_type;BEGINUPDATE employeesSET salary=salary+1WHERE department_id=50RETURN last_name,salary BULK COLLECT INTO e; dbms_output.put_line('更新了' || e.count || '个员⼯'); dbms_output.put_line(e(1).ename || ',' || e(1).salary); END;。
plsql使用技巧PL/SQL(Procedural Language/Structured Query Language)是一种过程性的编程语言,用于Oracle数据库的开发和管理。
它结合了SQL语句和基于编程的语言元素,从而允许开发人员编写复杂的业务逻辑和数据处理程序。
以下是一些PL/SQL使用技巧,可以帮助您更好地利用这个强大的工具。
1. 使用块来组织代码:PL/SQL程序由一个或多个块组成,每个块由BEGIN和END语句包围。
使用块可以将相关的代码段组合在一起,并简化代码的调试和维护。
2. 使用异常处理来处理错误:PL/SQL提供了异常处理机制,可以捕获和处理程序中的错误。
通过使用异常处理,可以使程序更加健壮,并提供更好的用户体验。
3. 使用游标来处理查询结果:游标是一种用于操作查询结果的PL/SQL对象。
通过使用游标,可以对查询结果进行逐行处理,并执行各种操作,如插入、更新或删除。
4. 使用PL/SQL表来处理临时数据:PL/SQL提供了PL/SQL 表,这是一种在内存中存储数据的临时表。
使用PL/SQL表可以大大提高程序的性能,因为它们比数据库表更快。
5. 使用存储过程和函数来封装业务逻辑:存储过程和函数是PL/SQL程序的一种类型,它们允许将一系列SQL语句封装到一个可重用的代码块中。
使用存储过程和函数可以提高代码的可维护性和重用性。
6. 使用触发器来自动执行任务:PL/SQL触发器是与数据库表相关联的一种代码块,当满足特定条件时,会自动执行。
使用触发器可以实现自动化任务,如在插入、更新或删除行时执行某些操作。
7. 使用游程来优化数据处理:游程是一种PL/SQL特性,可以将一组记录作为一个单元处理,而不是逐行处理。
通过使用游程,可以大大提高程序的性能,尤其是当需要处理大量数据时。
8. 使用动态SQL来处理动态查询:PL/SQL提供了动态SQL的能力,这使得可以在运行时构建和执行SQL语句。
plsql用法,操作介绍PL/SQL是Oracle数据库中一种重要的编程语言,它提供了强大的数据处理和数据库操作能力。
本文将向大家介绍PL/SQL的用法和操作。
一、PL/SQL基础PL/SQL是一种过程化的编程语言,它可以在Oracle数据库中执行存储过程、函数、触发器和包等对象。
这些对象可以由用户自定义,并在数据库中存储,以供其他用户调用。
PL/SQL提供了丰富的数据类型、控制结构、函数和过程,使得开发者可以方便地编写复杂的数据库操作程序。
二、PL/SQL语法1. 声明语句:在PL/SQL中,需要先声明变量和常量,常见的声明语句有:变量声明(如:变量类型数据类型;),常量声明(如:CONST 常量名数据类型 = 值)。
2. 条件语句:PL/SQL支持多种条件语句,如IF-THEN-ELSE,CASE表达式等。
3. 循环语句:PL/SQL支持FOR循环、WHILE循环和LOOP循环等。
4. 异常处理:PL/SQL提供了异常处理机制,可以捕获和处理运行时出现的错误。
5. 函数和过程:PL/SQL支持定义函数和过程,可以对数据进行操作并返回结果。
三、PL/SQL操作1. 创建存储过程:可以使用CREATE PROCEDURE语句创建存储过程,指定过程的名称、参数和执行逻辑。
2. 调用存储过程:可以使用CALL语句调用存储过程,并传递参数。
3. 创建函数:可以使用CREATE FUNCTION语句创建函数,指定函数的名称、参数和返回值类型。
4. 调用函数:可以使用直接调用函数的方式或通过存储过程调用函数。
5. 创建触发器:可以使用CREATE TRIGGER语句创建触发器,用于在数据插入、更新或删除时触发特定的操作。
6. 修改和删除对象:可以使用ALTER PROCEDURE、DROP PROCEDURE、DROP FUNCTION等语句修改或删除已存在的PL/SQL对象。
四、示例以下是一个简单的PL/SQL程序示例,用于将输入的字符串转换为大写并输出:```plsqlDECLAREv_str VARCHAR2(100);v_upper VARCHAR2(100);BEGIN-- 获取输入字符串:in_str := 'hello world';v_str := :in_str;-- 将字符串转换为大写并输出v_upper := UPPER(v_str);DBMS_OUTPUT.PUT_LINE('转换后的字符串为: ' || v_upper);END;```在上述示例中,我们使用了DECLARE语句声明了两个变量v_str 和v_upper,分别用于存储输入的字符串和转换后的结果。
plsql常用方法在SQLPLUS下,实现中-英字符集转换alter session set nls_language='AMERICAN';alter session set nls_language='SIMPLIFIED CHINESE';主要知识点:一、有关表的操作1)建表create table test as select * from dept; --从已知表复制数据和结构create table test as select * from dept where 1=2; --从已知表复制结构但不包括数据2)插入数据:insert into test select * from dept;二、运算符算术运算符:+ - * / 可以在select 语句中使用连接运算符:|| select deptno|| dname from dept;比较运算符:> >= = != < <= like between is null in逻辑运算符:not and or集合运算符:intersect ,union,union all,minus要求:对应集合的列数和数据类型相同查询中不能包含long 列列的标签是第一个集合的标签使用order by时,必须使用位置序号,不能使用列名例:集合运算符的使用:intersect ,union,union all,minusselect * from emp intersect select * from emp where deptno=10 ;select * from emp minus select * from emp where deptno=10;select * from emp where deptno=10 union select * from emp where deptno in (10,20); --不包括重复行select * from emp where deptno=10 union all select * from emp where deptno in (10,20); --包括重复行三,常用ORACLE 函数sysdate为系统日期dual为虚表一)日期函数[重点掌握前四个日期函数]1,add_months[返回日期加(减)指定月份后(前)的日期]select sysdate S1,add_months(sysdate,10) S2,add_months(sysdate,5) S3 from dual;2,last_day [返回该月最后一天的日期]select last_day(sysdate) from dual;3,months_between[返回日期之间的月份数]select sysdate S1, months_between('1-4月-04',sysdate) S2,months_between('1-4月-04','1-2月-04') S3 from dual4,next_day(d,day): 返回下个星期的日期,day为1-7或星期日-星期六,1表示星期日select sysdate S1,next_day(sysdate,1) S2,next_day(sysdate,'星期日') S3 FROM DUAL5,round[舍入到最接近的日期](day:舍入到最接近的星期日)select sysdate S1,round(sysdate) S2 ,round(sysdate,'year') YEAR,round(sysdate,'month') MONTH ,round(sysdate,'day') DAY from dual6,trunc[截断到最接近的日期]select sysdate S1,trunc(sysdate) S2,trunc(sysdate,'year') YEAR,trunc(sysdate,'month') MONTH ,trunc(sysdate,'day') DAY from dual7,返回日期列表中最晚日期select greatest('01-1月-04','04-1月-04','10-2月-04') from dual二)字符函数(可用于字面字符或数据库列)1,字符串截取select substr('abcdef',1,3) from dual2,查找子串位置select instr('abcfdgfdhd','fd') from dual3,字符串连接select 'HELLO'||'hello world' from dual;4, 1)去掉字符串中的空格select ltrim(' abc') s1,rtrim('zhang ') s2,trim(' zhang ') s3 from dual2)去掉前导和后缀select trim(leading 9 from 9998767999) s1,trim(trailing 9 from 9998767999) s2,trim(9 from 9998767999) s3 from dual;5,返回字符串首字母的Ascii值select ascii('a') from dual6,返回ascii值对应的字母select chr(97) from dual7,计算字符串长度select length('abcdef') from dual8,initcap(首字母变大写),lower(变小写),upper(变大写)select lower('ABC') s1,upper('def') s2,initcap('efg') s3 from dual;9,Replaceselect replace('abc','b','xy') from dual;10,translateselect translate('abc','b','xx') from dual; -- x是1位11,lpad [左添充] rpad [右填充](用于控制输出格式)select lpad('func',15,'=') s1, rpad('func',15,'-') s2 from dual;select lpad(dname,14,'=') from dept;12, decode[实现if ..then 逻辑]select deptno,decode(deptno,10,'1',20,'2',30,'3','其他') from dept;三)数字函数1,取整函数(ceil 向上取整,floor 向下取整)select ceil(66.6) N1,floor(66.6) N2 from dual;2, 取幂(power) 和求平方根(sqrt)select power(3,2) N1,sqrt(9) N2 from dual;3,求余select mod(9,5) from dual;4,返回固定小数位数(round:四舍五入,trunc:直接截断)select round(66.667,2) N1,trunc(66.667,2) N2 from dual;5,返回值的符号(正数返回为1,负数为-1)select sign(-32),sign(293) from dual;四)转换函数1,to_char()[将日期和数字类型转换成字符类型]1) select to_char(sysdate) s1,to_char(sysdate,'yyyy-mm-dd') s2,to_char(sysdate,'yyyy') s3,to_char(sysdate,'yyyy-mm-dd hh12:mi:ss') s4,to_char(sysdate, 'hh24:mi:ss') s5,to_char(sysdate,'DAY') s6 from dual;2) select sal,to_char(sal,'$99999') n1,to_char(sal,'$99,999') n2 from emp2, to_date()[将字符类型转换为日期类型]insert into emp(empno,hiredate) values(8000,to_date('2004-10-10','yyyy-mm-dd')); 3, to_number() 转换为数字类型select to_number(to_char(sysdate,'hh12')) from dual; //以数字显示的小时数五)其他函数user:返回登录的用户名称select user from dual;vsize:返回表达式所需的字节数select vsize('HELLO') from dual;nvl(ex1,ex2):ex1值为空则返回ex2,否则返回该值本身ex1(常用)例:如果雇员没有佣金,将显示0,否则显示佣金select comm,nvl(comm,0) from emp;nullif(ex1,ex2):值相等返空,否则返回第一个值例:如果工资和佣金相等,则显示空,否则显示工资select nullif(sal,comm),sal,comm from emp;coalesce:返回列表中第一个非空表达式select comm,sal,coalesce(comm,sal,sal*10) from emp;nvl2(ex1,ex2,ex3) :如果ex1不为空,显示ex2,否则显示ex3如:查看有佣金的雇员姓名以及他们的佣金select nvl2(comm,ename,') as HaveCommName,comm from emp;六)分组函数max min avg count sum1,整个结果集是一个组1) 求部门30 的最高工资,最低工资,平均工资,总人数,有工作的人数,工种数量及工资总和select max(ename),max(sal),min(ename),min(sal),avg(sal),count(*) ,count(job),count(distinct(job)) ,sum(sal) from emp where deptno=30;2, 带group by 和having 的分组1)按部门分组求最高工资,最低工资,总人数,有工作的人数,工种数量及工资总和select deptno, max(ename),max(sal),min(ename),min(sal),avg(sal),count(*) ,count(job),count(distinct(job)) ,sum(sal) from emp group by deptno;2)部门30的最高工资,最低工资,总人数,有工作的人数,工种数量及工资总和select deptno, max(ename),max(sal),min(ename),min(sal),avg(sal),count(*) ,count(job),count(distinct(job)) ,sum(sal) from emp group by deptno having deptno=30;3, stddev 返回一组值的标准偏差select deptno,stddev(sal) from emp group by deptno;variance 返回一组值的方差差select deptno,variance(sal) from emp group by deptno;4, 带有rollup和cube操作符的Group Byrollup 按分组的第一个列进行统计和最后的小计cube 按分组的所有列的进行统计和最后的小计select deptno,job ,sum(sal) from emp group by deptno,job;select deptno,job ,sum(sal) from emp group by rollup(deptno,job);cube 产生组内所有列的统计和最后的小计select deptno,job ,sum(sal) from emp group by cube(deptno,job);七、临时表只在会话期间或在事务处理期间存在的表.临时表在插入数据时,动态分配空间create global temporary table temp_dept(dno number,dname varchar2(10))on commit delete rows;insert into temp_dept values(10,'ABC');commit;select * from temp_dept; --无数据显示,数据自动清除on commit preserve rows:在会话期间表一直可以存在(保留数据)on commit delete rows:事务结束清除数据(在事务结束时自动删除表的数据)1.0摘要//简要说明该文档内容SQL是用来访问关系型数据库一种通用语言,其执行特点是非过程化,即不用指明执行的具体方法和途径,而是简单的调用相应语句来直接取得结果即可。
oracle PL/SQL的基本构成,块结构和基本语法要求,数据类型,变量定义,运算符和函数关键字:oracle pl/sql基本构成块结构基本语法要求数据类型变量定义运算符函数特点PL/SQL语言是SQL语言的扩展,具有为程序开发而设计的特性,如数据封装、异常处理、面向对象等特性。
PL/SQL是嵌入到Oracle服务器和开发工具中的,所以具有很高的执行效率和同Oracle数据库的完美结合。
在PL/SQL模块中可以使用查询语句和数据操纵语句(即进行DML操作),这样就可以编写具有数据库事务处理功能的模块。
至于数据定义(DDL)和数据控制(DCL)命令的处理,需要通过Oracle提供的特殊的DMBS_SQL包来进行。
PL/SQL还可以用来编写过程、函数、包及数据库触发器。
过程和函数也称为子程序,在定义时要给出相应的过程名和函数名。
它们可以存储在数据库中成为存储过程和存储函数,并可以由程序来调用,它们在结构上同程序模块类似。
PL/SQL过程化结构的特点是:可将逻辑上相关的语句组织在一个程序块内;通过嵌入或调用子块,构造功能强大的程序;可将一个复杂的问题分解成为一组便于管理、定义和实现的小块。
块结构和基本语法要求PL/SQL程序的基本单元是块侣LOCK),块就是实现一定功能的逻辑模块。
一个PL/SQL 程序由一个或多个块组成。
块有固定的结构,也可以嵌套。
一个块可以包括三个部分,每个部分由一个关键字标识。
块中各部分的作用解释如下:⑴DECLARE :声明部分标志。
(2) BEGIN :可执行部分标志。
⑶EXCEPTION :异常处理部分标志。
⑷END ;:程序结束标志。
在以下的训练中,将使用函数DBMS_OUTPU「PUT_LINE显示输岀结果。
DBMS_OUTPUT是Oracle提供的包,该包有如下三个用于输出的函数,用于显示PL/SQL程序模块的输出信息。
第一种形式:DBMS_OUTPUT・PUT(字符串表达式);用于输出字符串,但不换行,括号中的参数是要输出的字符串表达式。
plsql使用方法PL/SQL是Oracle数据库的一种编程语言,它是Procedural Language/Structured Query Language(过程性语言/结构化查询语言)的缩写。
PL/SQL的主要作用是用于开发Oracle数据库应用程序,它可以在Oracle数据库内部直接执行存储过程、函数以及触发器等。
PL/SQL的使用方法1、PL/SQL语言的基本元素:变量、常量、运算符、条件语句和循环语句。
2、PL/SQL程序的结构:声明段、执行段和异常处理段。
3、定义变量和常量:DECLAREx NUMBER := 10; --定义变量x,并初始化为10y CONSTANT NUMBER := 20; --定义常量y,并初始化为20 BEGINNULL;END;/4、条件语句:IF boolean_expression THEN--执行一系列语句ELSEIF boolean_expression THEN--执行一系列语句ELSE--执行一系列语句END IF;5、循环语句:FOR loop_index IN [REVERSE] lower_limit..upper_limit LOOP --执行一系列语句END LOOP;WHILE boolean_expression LOOP--执行一系列语句END LOOP;LOOP--执行一系列语句EXIT WHEN boolean_expression; END LOOP;6、异常处理:BEGIN--执行一系列语句EXCEPTIONWHEN exception_name1 THEN --处理异常方式1WHEN exception_name2 THEN --处理异常方式2WHEN OTHERS THEN--处理所有其他异常情况END;7、使用游标:DECLARECURSOR cursor_name ISSELECT ...FROM ...WHERE ...;local_variable datatype;BEGINOPEN cursor_name;LOOPFETCH cursor_name INTO local_variable;EXIT WHEN cursor_name%NOTFOUND;--执行一系列语句END LOOP;CLOSE cursor_name;END;8、使用存储过程和函数:CREATE [OR REPLACE] PROCEDURE procedure_name [ (parameter [,parameter]) ]ISvariable datatype;...BEGIN--执行一系列语句EXCEPTION--处理异常END;CREATE [OR REPLACE] FUNCTION function_name [ (parameter [,parameter]) ]RETURN datatypeISvariable datatype;...BEGIN--执行一系列语句EXCEPTION--处理异常END;PL/SQL是Oracle数据库中非常实用的编程语言,它可以帮助我们开发高效、可靠和可重用的应用程序。
PL/SQL程序结构
一、实验学时:
2学时
二、实验类型:
验证性实验。
三、实验目的和主要内容:
掌握PL/SQL程序的各组成部分,掌握PL/SQL的控制结构。
主要内容包括:
1. 在SQL*Plus中定义PL/SQL块处理。
2. 在PL/SQL执行块中进行循环结构控制。
四、实验仪器设备和材料:
Intel 酷睿2双核计算机及其网络、Windows 2000/XP、Oracle 9i安装版。
五、实验方法和步骤:
1. 在SQL*Plus中使用PL/SQL块处理EMP表中职工号7788的职工,如果工资小于5000那么把工资更改为5000。
(1)首先采用SCOTT用户登录;
(2)查询7788员工的工资是多少;
(3)定义声明块和执行块,修改该员工工资;
(4)再查询该员工工资是多少;
DECLARE
v_sal NUMBER(7,2);
BEGIN
SELECT sal INTO v_sal FROM emp WHERE empno = 7788;
IF v_sal < 5000
THEN UPDATE emp SET sal = 5000 WHERE empno = 7788;
END IF;
END;
2.利用三种循环控制结构向表中插入150条记录。
(1)创建一张表,用来记录循环指针的值;
(2)利用LOOP循环向表中插入前50条记录;
(3)利用WHILE循环向表中插入51-100条记录;(4)利用FOR循环向表中插入101-150条记录;
(5)查看表中的信息。
(1)创建一张表,用来记录循环指针的值;
Create table temp_table (num_col number, info_colchar(10)); (2)利用LOOP循环向表中插入前50条记录;DECLARE
v_counter BINARY_INTEGER :=1;
BEGIN
LOOP
INSERT INTO temp_tablevalues(v_counter,’loop index’); v_counter := v_counter+1;
EXIT WHEN v_counter>50;
END LOOP;
END;
(3)利用WHILE循环向表中插入51-100条记录;DECLARE
v_counter BINARY_INTEGER :=1;
BEGIN
WHILE v_counter<100 LOOP
INSERT INTO temp_tablevalues(v_counter,’loop index’);
v_counter := v_counter+1;
END LOOP;
END;
(4)利用FOR循环向表中插入101-150条记录;
DECLARE
v_counter BINARY_INTEGER :=1;
BEGIN
FOR v_counter IN 101..150 LOOP
INSERT INTO temp_tablevalues(v_counter,’loop index’);
END LOOP;
END;
(5)查看表中的信息。
SLELECT * FROM TEMP_TABL
六、实验报告要求:
无需提交实验报告,在课堂上进行验证即可。