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的错误。这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等。

  • 相关阅读:
    RAID
    js 网页右下角提示框
    程序方式301
    c# ListView 虚拟模式 相关操作
    asp显示出错信息
    servu 9.3.0.1破解
    Linux下红色闪烁文件问题
    服务器实现定时开关机
    php进主页出现:HTTP 错误 500(Internal Server Error):服务器尝试执行请求时遇到了意外情况。
    怎样使用yum只下载一个包而不安装呢?
  • 原文地址:https://www.cnblogs.com/ruiy/p/procedure.html
Copyright © 2011-2022 走看看