zoukankan      html  css  js  c++  java
  • oracle 存储过程

    1,procedure 是一个可以用编程的方式来操作SQL的集合;

    存储过程的优点?

    • 执行效率很高,因为存储过程是预编译的,即创建时编译,而SQL语句是执行一次,编译一次。调用存储过程可以大大减少同数据库的交互次数。
    • 降低网络通信量,因为存储过程执行的时候,只需要call存储过程名,不需要传递大量的SQL语句。 
    • 有利于复用。

    存储过程的缺点?

    • 移植性非常差,如果在oracle上写的存储过程,移植到mysql需要修改。
    • 代码可读性差,实现一个简单的逻辑,代码会非常长。

    存储过程的用途?

    • 造测试数据:可以使用存储过程,往表里造几百万条数据。
    • 数据同步:两个表之间按照一定的业务逻辑进行数据同步。
    • 数据挖掘。

    存储过程注意事项?

    • 数据量大的时候(10万+),一定要做压力测试,有些存储过程在大数据量的情况下才会出现问题。
    • 如果插入或者更新的次数比较多,为了提高效率,可以执行一万次,再commit一次。
    • 如果先插入记录,没有commit,再对这条记录进行更新,会引起死锁。如果先后对同一笔记录进行更新,又没有commit,也会引起死锁。因为后一条语句会等待前一条语句提交。如果出现这种情况,则需要一条条commit。
    • 不要忘记在存储过程里写commit。

    2,Oracle什么时候需要commit?

    DML语言,比如update,delete,insert等修改表中数据的需要commit;
    DDL语言,比如create,drop等改变表结构的,就不需要写commit(因为内部隐藏了commit,可以这么理解吧暂时);

    要是在该commit的地方你不commit,那么在不同的终端处会出现数据的不一致现象;

    DDL语句执行完成时,DDL语句会被自动提交,不能回滚(rollback)

    当执行DDL语句时,在每一条语句前后,oracle都将提交当前的事务。如果用户使用insert命令将记录插入到数据库后,执行了一条DDL语句(如create
    table),此时来自insert命令的数据将被提交到数据库;

    当执行DML命令如果没有提交,将不会被其他会话看到。除非在DML命令之后执行了DDL命令或DCL命令,或用户退出会话,或终止实例,此时系统会自动
    发出commit命令,使未提交的DML命令提交;

    3,数据库语句

    01,DDL  :
    Data Definition Language

    CREATE - to create objects in the database

    ALTER - alters the structure of the database

    DROP - delete objects from the database

    TRUNCATE - remove all records from a table, including all spaces allocated for the records are removed

    COMMENT - add comments to the data dictionary

    RENAME - rename an object

    DML:

    Data Manipulation Language

    SELECT - retrieve data from the a database

    INSERT - insert data into a table

    UPDATE - updates existing data within a table

    DELETE - deletes all records from a table, the space for the records remain

    MERGE - UPSERT operation (insert or update)

    CALL - call a PL/SQL or Java subprogram

    EXPLAIN PLAN - explain access path to data

    LOCK TABLE - control concurrency

    DCL:

    Data Control Language

    GRANT - gives user's access privileges to database

    REVOKE - withdraw access privileges given with the GRANT command

    数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。

    加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。

    在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两 种基本的锁类型来对数据库的事务进行并发控制。



    Oracle数据库的锁类型

    根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(data locks,数据锁),用于保护数据的完整性;DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internal locks and latches),保护数据库的内部结构。

    DML锁的目的在于保证并发情况下的数据完整性,。在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。

    当Oracle 执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。 这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括了SS、SX、S、X 等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。

    在数据行上只有X锁(排他锁)。在 Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行 DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX锁被释放,其他会话才可以加锁。

    当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,产生ORA-60的错误。这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等。

  • 相关阅读:
    Java Web 网络留言板2 JDBC数据源 (连接池技术)
    Java Web 网络留言板3 CommonsDbUtils
    Java Web ConnectionPool (连接池技术)
    Java Web 网络留言板
    Java Web JDBC数据源
    Java Web CommonsUtils (数据库连接方法)
    Servlet 起源
    Hibernate EntityManager
    Hibernate Annotation (Hibernate 注解)
    wpf控件设计时支持(1)
  • 原文地址:https://www.cnblogs.com/ruiy/p/procedure.html
Copyright © 2011-2022 走看看