课程标准:

PLSQL程序编写:Hello World,程序结构,自变量,步骤操纵,游标卡尺.sql语句:定义,无参储存,有参储存(键入,輸出).JAVA启用储存sql语句.

1.PLSQL程序编写。

1.1.定义和目地。

什么叫PL/SQL?

PL/SQL(Procedure Language/SQL)PLSQL是Oracle对sql语言的全过程化拓展 (类似Basic)指在SQL指令语言表达中提升了全过程解决句子(如支系,循环系统等),使SQL语言表达具备全过程解决工作能力。

1.2.程序结构。

根据Plsql开发者专用工具的检测对话框建立程序流程模版,或是根据句子将其载入sql对话框。

提醒:PLSQL语言表达的具体情况是没法区别的。

PL/SQL能够分成三个一部分:申明一部分,可实行一部分和错误处理一部分。

-- Created on 2018/3/21 by ADMINISTRATOR DECLARE -- 申明自变量,游标卡尺。 I INTEGER;BEGIN -- 实行句子 --[错误处理]END;

DECLARE一部分用以申明自变量或游标卡尺(結果集种类自变量),假如程序流程中沒有自变量申明,能够省去。

1.3.你好世界

BEGIN --打印出hello world DBMS_OUTPUT.PUT_LINE('hello world');END;

在其中DBMS_OUTPUT是oracle内嵌包,等同于Java中的System.out,PUT_LINE()是被启用的方式,等同于println()方式。

您还可以在sqlplus中撰写和运作PLSQL程序流程:

SQL> BEGIN 2 3 --打印出hello world 4 5 DBMS_OUTPUT.PUT_LINE('hello world'); 6 7 END; 8 /PL/SQL 全过程已取得成功进行。

实行后,无法显示輸出結果。默认设置状况下,輸出选择项处在关掉情况。大家必须打开set serveroutput。

oracle存储过程入门详解-oracle存储过程语法-第1张图片在SQLPLUS中实行PLSQL程序流程必须在程序流程的结尾加上一个/来标识程序流程的完毕。

1.4.自变量

PLSQL程序编写中常用的自变量分成两大类:

一般基本数据类型(char,varchar2, date, number, boolean, long)独特变量类型(引入型自变量,纪录型自变量)

申明自变量的办法是。

用户标识符 变量类型(自变量长短) 比如: v_name varchar2(20);

1.4.1.一般自变量。

分派自变量有这两种方式:

立即赋值语句 := 例如: v_name := ‘zhangsan’句子取值,应用select …into … 取值:(英语的语法 select 值 into 自变量)

[实例]打印出工作人员的私人信息,包含名字,薪水和详细地址。

-- 打印出工作人员私人信息,包含: 名字,工资,详细地址DECLARE -- 名字 V_NAME VARCHAR2(20) := '张三'; -- 申明自变量立即取值 --工资 V_SAL NUMBER; --详细地址 V_ADDR VARCHAR2(200);BEGIN --在程序流程中立即取值 V_SAL := 1580; --句子取值 SELECT '上海传智播客' INTO V_ADDR FROM DUAL; --打印出自变量 DBMS_OUTPUT.PUT_LINE('名字:' || V_NAME || ',工资:' || V_SAL || ',详细地址:' ||V_ADDR);END;

1.4.2.引用类型自变量。

自变量的类别和长短在于表格中字段名的类别和长短。

根据表名和字段名%TYPE特定自变量的类别和长短,比如:v _ name emp.ename % TYPE

【实例】查看emp表格中7839号人的私人信息,打印出名字和薪水。

-- 查看emp表格中7839号人的私人信息,打印出名字和工资DECLARE -- 名字 V_NAME EMP.ENAME%TYPE; -- 申明自变量立即取值 --工资 V_SAL EMP.SAL%TYPE;BEGIN --查看表格中的名字和工资并取值给自变量 --留意查看的字段名和取值的自变量的次序,数量,种类要一致 SELECT ENAME, SAL INTO V_NAME, V_SAL FROM EMP WHERE EMPNO = 7839; --打印出自变量 DBMS_OUTPUT.PUT_LINE('名字:' || V_NAME || ',工资:' || V_SAL);END;

参照自变量的益处:

应用通用性变量定义方式,必须了解表中列的种类,而应用引用类型,则不用考虑到列的种类。应用%TYPE是一种非常不错的编写程序设计风格,因为它使PL/SQL更为灵便,更合适升级数据库查询界定。

1.4.3.纪录自变量。

接纳表格中的一整行纪录,等同于Java中的一个目标。

英语的语法:用户标识符表名%ROWTYPE,比如:v _ emp emp % rowtype

[实例]

并查看打印出7839号职工名字及薪水

-- 查看emp表格中7839号人的私人信息,打印出名字和工资DECLARE -- 纪录型自变量接纳一行 V_EMP EMP%ROWTYPE;BEGIN --纪录型自变量默认设置接纳表格中的一行数据信息,不可以特定字段名。 SELECT * INTO V_EMP FROM EMP WHERE EMPNO = 7839; --打印出自变量,根据用户标识符.特性的方法获得自变量中的值 DBMS_OUTPUT.PUT_LINE('名字:' || V_EMP.ENAME || ',工资:' || V_EMP.SAL);END;

假如有一个表有100个字段名,假如你的程序流程想要这100个字段名,假如用引入自变量一个一个的去申明,会尤其不便,而纪录自变量能够非常容易的处理这个问题。

不正确应用:

1.纪录的自变量只有储存一行详细的数据信息。

oracle存储过程入门详解-oracle存储过程语法-第2张图片2.回到的行过多,没法接受纪录的自变量。

oracle存储过程入门详解-oracle存储过程语法-第3张图片1.5.过程管理。

1.5.1.标准支系。

英语的语法:

BEGIN IF 标准1 THEN 实行1 ELSIF 标准2 THEN 实行 2 ELSE 实行3 END IF; END;

注:ELSIF。

[实例]分辨emp表格中是不是有20条之上的纪录,10到20条不同的纪录,或是10条下列的纪录。

DECLARE --申明自变量接纳emp表格中的纪录数 V_COUNT NUMBER;BEGIN --查看emp表格中的纪录数取值给自变量 SELECT COUNT(1) INTO V_COUNT FROM EMP; --分辨打印出 IF V_COUNT > 20 THEN DBMS_OUTPUT.PUT_LINE('EMP表格中的纪录数超出了20条为:' || V_COUNT || '条。'); ELSIF V_COUNT >= 10 THEN DBMS_OUTPUT.PUT_LINE('EMP表格中的纪录数在10~20条中间为:' || V_COUNT || '条。'); ELSE DBMS_OUTPUT.PUT_LINE('EMP表格中的纪录数在10条下列为:' || V_COUNT || '条。'); END IF;END;

1.5.2.循环系统。

ORACLE中有三种循环系统方式。大家这儿不进行,只详细介绍在其中一个:loop loop。

英语的语法:

BEGIN LOOP EXIT WHEN 撤出循环系统标准 END LOOP;END;

[实例]打印出数据1-10。

DECLARE --申明循环系统自变量并赋初始值 V_NUM NUMBER := 1;BEGIN LOOP EXIT WHEN V_NUM > 10; DBMS_OUTPUT.PUT_LINE(V_NUM); --循环系统自变量自增 V_NUM := V_NUM 1; END LOOP;END;

2.鼠标光标。

2.1.什么叫鼠标光标?

它用以临时性储存查看回到的几行数据信息(ResultSet,类似Java中Jdbc联接回到的ResultSet结合)。根据解析xml鼠标光标,您能够一行行浏览和事件处理集的数据信息。

游标卡尺的使用方法:申明->开启->载入->关掉。

2.2.英语的语法。

游标卡尺申明:

CURSOR游标卡尺名字[(主要参数目录)]是一个查看句子;

鼠标光标开启:

开启鼠标光标名字;

鼠标光标的值:

FETCH游标卡尺名字在自变量目录中;

鼠标光标关掉:

关掉鼠标光标名字;

2.3.鼠标光标的特性。

游标卡尺的特性传参形式的叙述。

在其中%NOTFOUND在游标卡尺中找不着原素时回到TRUE,一般用以分辨是不是撤出循环系统。

2.4.艺术创作和应用。

[实例]应用鼠标光标查看emp表格中全部职工的名字和薪水,并先后打印出出去。

--应用游标卡尺查看emp表格中全部职工的名字和薪水,并将其先后打印出出去。DECLARE --申明游标卡尺 CURSOR C_EMP IS SELECT ENAME, SAL FROM EMP; --申明自变量用于接纳游标卡尺中的原素 V_ENAME EMP.ENAME%TYPE; V_SAL EMP.SAL%TYPE;BEGIN --开启游标卡尺 OPEN C_EMP; --解析xml游标卡尺中的值 LOOP --根据FETCH句子获得游标卡尺中的值并取值给自变量 FETCH C_EMP INTO V_ENAME, V_SAL; --根据%NOTFOUND分辨是不是有值,有值打印出,沒有则撤出循环系统 EXIT WHEN C_EMP%NOTFOUND; DBMS_OUTPUT.PUT_LINE('名字:' || V_ENAME || ',工资:' || V_SAL); END LOOP; --关掉游标卡尺 CLOSE C_EMP;END;

实行結果:

oracle存储过程入门详解-oracle存储过程语法-第4张图片2.5.带主要参数的鼠标光标。

【实例】用鼠标光标查看打印出某单位职工的名字和薪水,运作时手动式键入单位号。

--应用游标卡尺查看并打印某单位的职工的名字和薪酬,单位序号为打开时手动式键入。DECLARE --申明游标卡尺传送主要参数 CURSOR C_EMP(V_EMPNO EMP.EMPNO%TYPE) IS SELECT ENAME, SAL FROM EMP WHERE EMPNO = V_EMPNO; --申明自变量用于接纳游标卡尺中的原素 V_ENAME EMP.ENAME%TYPE; V_SAL EMP.SAL%TYPE;BEGIN --开启游标卡尺并传送主要参数 OPEN C_EMP(10); --解析xml游标卡尺中的值 LOOP --根据%NOTFOUND分辨是不是有值,有值打印出,沒有则撤出循环系统 EXIT WHEN C_EMP%NOTFOUND; --根据FETCH句子获得游标卡尺中的值并取值给自变量 FETCH C_EMP INTO V_ENAME, V_SAL; DBMS_OUTPUT.PUT_LINE('名字:' || V_ENAME || ',工资:' || V_SAL); END LOOP; --关掉游标卡尺 CLOSE C_EMP;END;

留意:%NOTFOUND特性的初始值是FLASE,因此要留意分辨标准在循环过程中的部位。如果我们先分辨最终一条数据的值会在FETCH中打印出2次(默认设置是反复循环系统一次);

3.sql语句。

3.1.定义人物角色。

大家以前写的PLSQL程序流程能够对表的逻辑性开展计算,分辨和循环系统,可是不可以反复启用。

能够了解,以前任何的编码全是用main方式撰写的,这是一个密名程序流程。JAVA能够根据封裝目标和方式来处理器重难题。

PLSQL储存和器重PLSQL的工作流程,这种储存的PLSQL程序流程称之为sql语句。

sql语句的功效:

1.在开发设计程序流程中,针对特殊的业务流程作用,数据库查询会数次联接关掉(联接关掉十分消耗資源),因而必须对数据开展数次读写能力I/O,特性相对性较低。假如将这种服务项目放进PLSQL中,大家只须要在应用软件中启用PLSQL,就可以一次联接关掉数据库查询,能够大幅提高高效率。

2.甲骨文字官方网提议:不必把数据库操作放到程序流程里。大部分数据库查询的完成不容易有不正确,程序流程的运作也有可能有不正确。(假如实际操作数据库查询中的数据信息,能够有日志修复等特殊作用。).

3.2.英语的语法

CREATE OR REPLACE PROCEDURE 全过程名字[(主要参数目录)] ISBEGINEND [全过程名字];

依据主要参数的种类,大家将其分成三类:

l无主要参数。

l带键入主要参数。

l含有键入和輸出主要参数(传参)。

3.3.无主要参数储存。

3.3.1.建立储存。

根据Plsql Developer或句子建立sql语句:

oracle存储过程入门详解-oracle存储过程语法-第5张图片[实例]根据启用sql语句打印出hello world。

建立sql语句:

--根据启用sql语句打印出hello worldCREATE OR REPLACE PROCEDURE P_HELLO ISBEGIN DBMS_OUTPUT.PUT_LINE('hello world');END P_HELLO;

根据专用工具查验建立的sql语句:

oracle存储过程入门详解-oracle存储过程语法-第6张图片3.3.2.启用sql语句。

1.根据PLSQL程序流程启用:

BEGIN --立即键入启用sql语句的名字 P_HELLO;END P_HELLO;

2.根据SQLPLUS中的运行命令启用:

oracle存储过程入门详解-oracle存储过程语法-第7张图片提醒:在SQLPLUS中表明結果的前提条件是规定将serveroutput设定为on。

留意:

第一个难题:is和as是可互操作性的,应用哪一个并不重要。第二个难题:步骤中沒有declare关键词,句子块中采用了declare。

3.4.含有键入主要参数的sql语句。

【实例】查看并打印某职工的名字和薪水(如职工序号7839)-sql语句:总输项,启用时传到职工序号,开展控制面板全自动打印出。

--查看并打印某一职工(如7839号职工)的名字和工资--规定,启用的是传到职工序号,全自动控制面板打印出。CREATE OR REPLACE PROCEDURE P_QUERYNAMEANDSAL(I_EMPNO IN EMP.EMPNO%TYPE) IS --申明自变量接纳查看結果 V_ENAME EMP.ENAME%TYPE; V_SAL EMP.SAL%TYPE;BEGIN --依据客户传送的职工号查看名字和工资 SELECT ENAME, SAL INTO V_ENAME, V_SAL FROM EMP WHERE EMPNO = I_EMPNO; --打印出結果 DBMS_OUTPUT.PUT_LINE('名字:' || V_ENAME || ',工资:' || V_SAL);END P_QUERYNAMEANDSAL;

指令通话:

SQL> exec p_querynameandsal(7839);名字:KING,工资:5000PL/SQL 全过程已取得成功进行。

PLSQL程序流程启用:

BEGIN P_QUERYNAMEANDSAL(7839);END;

实行結果:

oracle存储过程入门详解-oracle存储过程语法-第8张图片3.5.含有輸出主要参数的sql语句。

[实例]键入职工序号以查看职工的信息内容(职工序号7839),并要求将薪水做为传参輸出给被启用的程序流程。

--键入职工号查看某一职工(7839号职工)信息内容,规定,将工资做为传参輸出,给启用的程序流程应用。CREATE OR REPLACE PROCEDURE P_QUERYSAL_OUT(I_EMPNO IN EMP.EMPNO%TYPE,O_SAL OUT EMP.SAL%TYPE) ISBEGIN SELECT SAL INTO O_SAL FROM EMP WHERE EMPNO = I_EMPNO;END P_QUERYSAL_OUT;

PLSQL程序流程启用:

DECLARE --申明一个自变量接纳sql语句的輸出主要参数 V_SAL EMP.SAL%TYPE;BEGIN P_QUERYSAL_OUT(7839, V_SAL); --留意主要参数的次序 DBMS_OUTPUT.PUT_LINE(V_SAL);END;

留意:启用时,主要参数应与界定主要参数的次序和种类一致。

3.7.JAVA程序流程启用sql语句。

规定:假如一个句子不可以完成結果集,例如多表查询或是繁杂逻辑性查看,我们可以挑选启用储存查看来获得你的結果。

3.7.1.剖析jdk API。

oracle存储过程入门详解-oracle存储过程语法-第9张图片您能够根据Connection目标的prepareCall方式启用sql语句。

oracle存储过程入门详解-oracle存储过程语法-第10张图片结果:Connection目标启用prepareCall方式传送转义的sql语句启用sql语句,键入主要参数立即启用set方式传送。在必须申请注册輸出主要参数以后,根据get方式实行并获得sql语句。主要参数目录的字符从1逐渐。

3.7.2.完成编码。

提前准备自然环境:

l 导进Oracle的jar包【实例】根据职工号查看职工的名字和薪酬package cn.itcast.oracle.jdbc;import oracle.jdbc.OracleTypes;import java.sql.CallableStatement;import java.sql.Connection;import java.sql.DriverManager;public class ProcedureTest { public static void main(String[] args) throws Exception { //1.载入推动 Class.forName("oracle.jdbc.driver.OracleDriver"); //2.得到联接目标 //2.1 设定联接字符串数组 String url ="jdbc:oracle:thin:@localhost:1521:xe" ; String name = "scott"; String password = "tiger"; Connection conn = DriverManager.getConnection(url, name, password); //3.获得句子目标 String sql = "{call p_querysal_out(?,?)}";//转义英语的语法,{call sql语句(主要参数目录)} CallableStatement call = conn.prepareCall(sql); //4.设定键入主要参数 call.setInt(1,7839); //5.申请注册輸出主要参数 call.registerOutParameter(2, OracleTypes.DOUBLE); //6.实行sql语句 call.execute(); //7.获得輸出主要参数 double sal = call.getDouble(2); System.out.println("工资:" sal); //8.释放出来資源 call.close(); conn.close(); }}

评论(0条)

刀客源码 游客评论