PL/SQL笔记

来源:互联网 发布:哒哒英语 知乎 编辑:程序博客网 时间:2024/06/06 03:19

create table myinfo (myname varchar2(10),passwd varchar(10));

基于以上表myinfo


PL/SQL(procedural language/sql):是oracle基于标准SQL语言的扩展,在PL/SQL中你可以嵌套sql语句、定义变量、定义常量、使用逻辑语句(条件语句,循环语句等)、使用例外处理各种错误例外(EXCEPTION)是一种PL/SQL标识符。如果运行PL/SQL块时出现错误或警告,则会触发例外,当触发例外时,默认情况下会终止PL/SQL块的执行,通过在PL/SQL块中引入例外处理部分。可以捕捉各种例外,并根据例外出现的情况进行相应的处理。类似java中的try catch),既然是扩展,当然会使得他的功能更加强大!

PL/SQL是强大的数据库过程语言!

重要的是:重要的是PL/SQL紧密的结合在Oracle数据库里面。

PL/SQL是Oracle数据库使用的三种语言的其中之一,另外两个是SQL和Java。

功能近似PL/SQL的程序语言和其他关系型数据库:Sybase ASE、Microsoft SQL Server的Transact-SQL,PostgreSQL数据库的PL/pgSQL(模仿PL/SQL)和IBM DB2的SQL PL[1],都符合ISO SQL的SQL/PSM标准。

---------------------------------------------------------------------------------------------------

pl/sql的优点:

提高应用程序的运行性能、模块化设计、减少网络传输量、提高安全性

(传统的数据库操作,我们想想:SQL语句写在java程序访问数据库,首先获得连接,编译SQL语句,使得数据库能够认识你的SQL语句,这里每次编译就浪费了一些时间,当数据访问量很大的时候,你的程序性能就比较差了!这里如果我们把某些操作写为一个过程,比如分页、转账过程(功能划分为一个模块,由专人负责维护……)。就可以使得我们的程序性能大大提高,从而数据库操作作为一个模块,当java程序调用时就是调用已经编译的SQL语句,所以在进行程序优化时可以考虑用存储过程进行优化。)

【当然还有其他有点好处,欢迎补充】

缺点:

当需要换数据库时,移植性存在缺陷

|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||


PL/SQL编写规范:

A:

单行注释:--

多行注释:/*……*/

B:

标识符的命名规范:

a.定义变量,建议用v_作为前缀, 例:v_sale

b.定义常量,建议用c_作为前缀,例:c_rate

c.定义游标,建议用_cursor作为后缀例:emp_cursor

d.定义例外,建议用e_作为前缀例:e_error

-----------------------------------------------------------------------------------

PL/SQL是以块为基本单位,块分类{主要有存储过程,函数,触发器,包}

块(block)的介绍:

上面说了,PL/SQL是以块为基本单位,,我们编写PL/SQL就是在编写块,简单的应用功能,我们可能只需要一个PL/SQL块就可以实现,复杂的功能就需要多个块了,块可以嵌套。

块由三部分组成:{定义部分、执行部分、例外处理部分},即:

declare (可选)

/*声明部分---定义常量、变量。游标、例外、复杂数据类型*/

begin (必须滴)

/*执行部分---需要执行的pl/sql语句和SQL语句*/

exception(可选的)

/*处理运行的各种错误*/

end;(必须滴)

编写一个简单的块先:

例子,

set serveroutput on; --打开输出选项begin dbms_output.put_line('hello,world'); --输出 hello worldend;/
例子,

declare v_name varchar2(10); --定义变量begin select myname into v_name where passwd=&pswd;dbms_output.put_line('这是字符串拼接:'||v_name);end;/
例子,外加显示密码:

declare v_name varchar2(10); --定义变量v_psw varchar2(10); begin select myname,passwd into v_name,v_psw where passwd=&psw;dbms_output.put_line('这是字符串拼接:'||v_name||' password is '||v_psw);end;/

这里都会弹出一个框,让输入就是psw的值,where passwd=&psw


例外的情况,如果查询不到数据呢?oracle中会抛出异常,

这里我们就可以使用例外了,Exception

declare v_name varchar2(10); --定义变量v_psw varchar2(10); begin select myname,passwd into v_name,v_psw where passwd=&psw;dbms_output.put_line('这是字符串拼接:'||v_name||' password is '||v_psw);--异常处理exceptionwhen no_data_found then dbms_output.put_line('未找到匹配数据');end;/



|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||


开始存储过程(存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。):

存储过程正是由PL/SQL编写的,并且是在oracle中的。

-------------------------实例分割线------------------------------

创建表:

create table myinfo (myname varchar2(30),passwd varchar(30));

创建过程:(过程名:sp_pro1)

create or replace procedure sp_pro1 is begin --执行部分insert into myinfo values('userone','123456');end;/

执行以上过程:procedure sp_pro1 Compiled.


过程创建成功!

接下来,调用过程的方式:

execute 过程名;

execute过程名;(parameter1,parameter2);(带参数的情况下)

call   过程名;

call   过程名;(parameter1,parameter2);(带参数的情况下)


execute sp_pro1;

execute sp_pro1;


执行结果显示:

anonymous block completed
MYNAME                         PASSWD                         
------------------------------ ------------------------------ 
userone                        123456                         
userone                        123456                         


2 rows selected

-------------------------------------带参数存储过程-------------

-- procedure with  parametercreate or replace procedure ps_pra(spname varchar2,spswd varchar2) is begin -- update optionupdate myinfo set myname=spname where passwd=spswd;end;/

执行结果:

MYNAME                         PASSWD                         
------------------------------ ------------------------------ 
mygod                          123456                         
mygod                          123456                         


2 rows selected

存储过程就是这样子了,最终我们调用存储过程还是通过java程序调用,否则就没啥意义,测试而已。

java中调用存储过程实例:

package pro.wh.test;import java.sql.CallableStatement;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;public class OrclConnection {public static void main(String[] args) {Connection con=null;try {Class.forName("oracle.jdbc.driver.OracleDriver");// 加载驱动try {// 获得连接con=DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.102:1521:orcl", "tempuser001", "123456");CallableStatement cs  =con.prepareCall("{call ps_pra(?,?)}");cs.setString(1, "seeyounext");cs.setString(2, "123456");cs.execute();cs.close();con.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}


select * from myinfo;


------------------------------ ------------------------------ 

seeyounext                     123456                         
seeyounext                     123456                         
seeyounext                     123456                         
seeyounext                     123456                         


4 rows selected


好,就酱紫



原创粉丝点击