http://www.cnblogs.com/huyong/archive/2011/05/10/2041951.html#_Toc15837

SQL语言只是访问、操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发。PL /SQL是一种高级数据库程序设计语言,该语言专门用于在各种环境下对ORACLE数据库进行访问。由于该语言集成于数据库服务器中,所以PL/SQL代码可以对数据进行快速高效的处理。除此之外,可以在ORACLE数据库的某些客户端工具中,使用PL/SQL语言也是该语言的一个特点。

提示:在 PL/SQL中只能用 SQL语句中的 DML 部分,不能用 DDL 部分,如果要在PL/SQL中使用DDL(如CREATE  table  等)的话,只能以动态的方式来使用。

pl/sql source program的基本单元是块
PL/SQL程序由三个块组成,即声明部分、执行部分、异常处理部分。
declare,begin,exception,end4个关键字来分隔三个块

PL/SQL块可以分为三类:
1. 无名块或匿名块(anonymous):动态构造,只能执行一次,可调用其它程序,但不能被其它程序调用。
2. 命名块(named):是带有名称的匿名块,这个名称就是标签。
3. 子程序(subprogram):存储在数据库中的存储过程、函数等。当在数据库上建立好后可以在其它程序中调用它们。
4. 触发器(Trigger):当数据库发生操作时,会触发一些事件,从而自动执行相应的程序。
5. 程序包(package):存储在数据库中的一组子程序、变量定义。在包中的子程序可以被其它程序包或子程序调用。但如果声明的是局部子程序,
则只能在定义该局部子程序的块中调用该局部子程序。

一个pl/sql子程序是一个命名的pl/sql块,可以重复调用的

提示:  一般不要把变量名声明与表中字段名完全一样,如果这样可能得到不正确的结果.

列名不要与变量名一样 name是列名,name1是变量名
DECLARE
   name1 varchar2(20) :='ccc';
BEGIN
  DELETE FROM e1 WHERE name=name1;
END;

select * from e1;
select * from e1 where name='ccc';
DELETE FROM e1 WHERE name='ccc';

DECLARE
   Row_id ROWID;
   info    VARCHAR2(40);
BEGIN
  INSERT INTO scott.dept VALUES (90, '财务室', '海口')
  RETURNING rowid, dname||':'||to_char(deptno)||':'||loc
  INTO row_id, info;
  DBMS_OUTPUT.PUT_LINE('ROWID:'||row_id);
  DBMS_OUTPUT.PUT_LINE(info);
END;

================================================

/***********************************************/
/* 文件名: test.sql                  */
/* 说 明:
       一个简单的插入测试,无实际应用。*/
/* 作 者: EricHu                     */
/* 时 间: 2011-5-9                  */
/***********************************************/
DECLARE
  v_ename   VARCHAR2(20) := 'Bill';
  v_sal       NUMBER(7,2) :=1234.56;
  v_deptno   NUMBER(2) := 10;
  v_empno   NUMBER(4) := 8888;
BEGIN
  INSERT INTO emp ( empno, ename, JOB, sal, deptno , hiredate )
  VALUES (v_empno, v_ename, 'Manager', v_sal, v_deptno,
            TO_DATE('1954.06.09','yyyy.mm.dd') );
  COMMIT;
END;

select * from emp;

=======================================

/***********************************************/
/* 文件名: test_deletedata.sql      */
/* 说 明:
       简单的删除例子,不是实际应用。 */
/* 作 者: EricHu                     */
/* 时 间: 2011-5-9                  */
/***********************************************/
DECLARE
  v_ename   VARCHAR2(20) := 'Bill';
  v_sal       NUMBER(7,2) :=1234.56;
  v_deptno   NUMBER(2) := 10;
  v_empno   NUMBER(4) := 8888;
BEGIN
  INSERT INTO emp ( empno, ename, JOB, sal, deptno , hiredate )
  VALUES (v_empno, v_ename, 'Manager', v_sal, v_deptno,
            TO_DATE('1954.06.09','yyyy.mm.dd') );
  COMMIT;
END;
DECLARE
  v_empno   number(4) := 8888;
BEGIN
  DELETE FROM emp WHERE empno=v_empno;
  COMMIT;
END;
select * from emp;

================================================

create table StudentInformation(
id number(20) not null primary key,
name varchar2(10) not null,
sex varchar2(2),
address varchar2(20),
hobby varchar(20));
declare
 maxrecords constant int:=180000;
 i int :=1009;
begin
 for i in 120000..maxrecords loop
 insert into STUDENTINFORMATION("ID","NAME",SEX,ADDRESS,HOBBY)
 values(i,TO_CHAR('99'+i),'男','山东临沂','打篮球');
 end loop;
 dbms_output.put_line(' 成功录入数据! ');
 commit;
end;

===========================================

存储过程

http://www.cnblogs.com/chinafine/articles/1776085.html

1。预编译,已优化,效率较高。避免了SQL语句在网络中传输然后再解释的低效率。
2。如果公司有专门的DBA,写存储过程可以他来做,程序员只要按他提供的接口调用就好了。这样分开来做,比较清楚。
3。修改方便。嵌入在程序中的SQL语句修改比较麻烦,而且经常不能肯定该改的是不是都改了。SQLSERVER上的存储过程修改就比较方便,直接改掉该存储过程,调用它的程序基本不用动,除非改动比较大(如改了传入的参数,返回的数据等)。
4。会安全一点。不会有SQL语句注入问题。

当然,也有缺点。特别是业务逻辑比较复杂时,全用存储过程来写,估计也累的够呛。
1。SQL存储过程执行起来比SQL命令文本快得多。当一个SQL语句包含在存储过程中时,服务器不必每次执行它时都要分析和编译它。
2。调用存储过程,可以认为是一个三层结构。这使你的程序易于维护。如果程序需要做某些改动,你只要改动存储过程即可
3。你可以在存储过程中利用Transact-SQL的强大功能。一个SQL存储过程可以包含多个SQL语句。你可以使用变量和条件。这意味着你可以用存储过程建立非常复杂的查询,以非常复杂的方式更新数据库。

存储过程的能力大大增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
  * 可保证数据的安全性和完整性。
  # 通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。
  # 通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。
  * 在运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。这种已经编译好的过程可极大地改善SQL语句的性能。由于执行SQL语句的大部分工作已经完成,所以存储过程能以极快的速度执行。
  * 可以降低网络的通信量。
  * 使体现企业规则的运算程序放入数据库服务器中,以便:
  # 集中控制。
 
 #
当企业规则发生变化时在服务器中改变存储过程即可,无须修改任何应用程序。企业规则的特点是要经常变化,如果把体现企业规则的运算程序放入应用程序中,则
当企业规则发生变化时,就需要修改应用程序工作量非常之大(修改、发行和安装应用程序)。如果把体现企业规则的运算放入存储过程中,则当企业规则发生变化
时,只要修改存储过程就可以了,应用程序无须任何变化。

命令行下查看存储过程与函数内容

user_source或all_source

SQL> select * from user_source where type='PROCEDURE';

SQL> select * from user_source where type='FUNCTION';

ALL_SOURCE中有以下5种类型
1 FUNCTION
2 JAVA SOURCE
3 PACKAGE
4 PACKAGE BODY
5 PROCEDURE

Oracle supplies many PL/SQL packages with the Oracle server
to extend database functionality and provide PL/SQL access to SQL features.
You can use the supplied packages when creating your applications or for ideas in creating your own stored procedures.

This manual covers the packages provided with the Oracle database server.

Packages supplied with other products, such as Oracle Developer or the Oracle Application Server, are not covered.
Note that not every package or type described in this manual or elsewhere in the
Oracle Database Documentation Library is installed by default. In such cases, the
documentation states this and explains how to install the object. Run this query as a
suitably privileged user:

A package is an encapsulated collection of related program objects stored together in
the database. Program objects are procedures, functions, variables, constants, cursors,
and exceptions.

http://www.itpub.net/thread-1830016-1-1.html  dimensions这个模式对象类型

dbms_compression包的使用方法

#################################

select decode(
  dbms_compression.get_compression_type(
    ownname => 'KYC_ACC',
    tabname => 'ACCT_ACCOUNT',
    row_id => 'AAAYFlAAKAAAAKWAAR'),
  1, 'no compression',
  2, '33',
  3, '44',
  4, '55',
  '66'
) compression_type from dual;

#################################

set serveroutput on;
declare
  v_rlt number(8) :=-3;
begin
  <<fst_loop>>
  loop
    dbms_output.put_line('v_rlt ='||v_rlt);
    v_rlt:=v_rlt+1;
    exit fst_loop when v_rlt>3;
  end loop;
    dbms_output.put_line('loop循环结束');
end;
/

####################################

declare
   v_rlt number(8):=-3;
begin
    <<fst_loop>>
    loop
      dbms_output.put_line('v_rlt = '||v_rlt);
      v_rlt:=v_rlt+1;
      if v_rlt > 3 then
       dbms_output.put_line('变量的值已经大于3,当前值为'||v_rlt);
       exit fst_loop;
      end if;
    end loop fst_loop;
      dbms_output.put_line('LOOP循环已经结束!');
end;
/

=================================

在worksheet中直接运行,并可以输出结果

set serveroutput on
declare
  cursor c1 is
    select last_name from employees
    where rownum<11
    order by last_name;
  name employees.last_name%type;
begin
  open c1;
  loop
    fetch c1 into name;
    exit when c1%notfound or c1%notfound is null;
    dbms_output.put_line(c1%rowcount || '. ' ||name);
    if c1%rowcount=5 then
      dbms_output.put_line('---Fetched 5th row ---');
    end if;
  end loop;
  close c1;
end;
/

=================================

set serveroutput on
declare
  cursor c1 is
    select last_name,salary from employees
    where rownum<11
    order by last_name;
  my_ename employees.last_name%type;
  my_salary employees.salary%type;
begin
  open c1;
  loop
    fetch c1 into my_ename,my_salary;
    if c1%notfound then
      exit;
    else
      dbms_output.put_line('Name= '||my_ename||' , salary= '||my_salary);
    end if;
  end loop;
end;
/

oracle-pl/sql之一的更多相关文章

  1. ORACLE PL/SQL编程详解

    ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...

  2. [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)

    原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...

  3. ORACLE PL/SQL编程之八:把触发器说透

    原文:ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之八: 把触发器说透 大家一定要评论呀,感谢!光发表就花了我将近一个下午. 本篇主要内容如下: 8.1 触发器类型 ...

  4. [推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)

    原文:[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不殆) [推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/S ...

  5. ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)

    原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!)   继上篇:ORACLE P ...

  6. [推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆)

    原文:[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程详解之三: PL/SQL流程控制语句(不给规则,不成方圆) ...

  7. [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)

    原文:[推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]ORACLE PL/SQL编程之四: 把游标说透(不怕做不到,只怕想不到) 继上两篇:ORACLE PL ...

  8. 【强烈强烈推荐】《ORACLE PL/SQL编程详解》全原创(共八篇)--系列文章导航

    原文:[强烈强烈推荐]<ORACLE PL/SQL编程详解>全原创(共八篇)--系列文章导航 <ORACLE PL/SQL编程详解> 系列文章目录导航 ——通过知识共享树立个人 ...

  9. [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)

    原文:[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) [推荐]ORACLE PL/SQL编程详解之一: PL/SQL 程序设计简介(千里之行,始于足下 ...

  10. [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)

    原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日 ...

随机推荐

  1. Ubuntu 修改 /etc/resolv.conf 被清空 或重启不生效解决

    sudo gedit /etc/NetworkManager/NetworkManager.conf 注释掉 dns=dnsmasq [main] plugins=ifupdown,keyfile,o ...

  2. 3-D models provided some resources

    http://d-earth.jamstec.go.jp/GAP_P4/ http://ds.iris.edu/ds/products/emc-earthmodels/

  3. MVC4中使用Uploadify3.2

    你使用过 GMail 中附件上传吗?带有上传进度,可以取消正在进行的上传,使用 Uploadify 插件,你也可以做到. Uploadify 是 JQuery 一个著名的上传插件,利用 Flash 技 ...

  4. request的响应时间elapsed和超时timeout

    前言:requests发请求时,接口的响应时间,也是我们需要关注的一个点,如果响应时间太长,也是不合理的 1.获取接口请求的响应时间  r.elapsed.total_seconds() import ...

  5. day 67 django 之ORM 增删改查基础

    一 操作基础前提准备 1. 新建django 项目 mysite  子项目app01 ,选择好做路径. 2  .2-1在app01 下面models 中引用 模块 from  django.db im ...

  6. linux系统中对SSD硬盘优化的方法

    在测试虚拟机往分布式存储中写数据的最大性能时,做的一些系统修改 1.ext4文件系统在SSD硬盘是最快的 2.查看当前系统支持的IO调度算法 dmesg | grep -i scheduler 3.查 ...

  7. python day05字典

    一.字典 1.字典的结构: a={key:value,key2:value},key是不可变的,value是可变的. 例子:dic = {123: 456, True: 999, "id&q ...

  8. JAVA AES加密解密

    import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java ...

  9. 基于CART的回归和分类任务

    CART 是 classification and regression tree 的缩写,即分类与回归树. 博主之前学习的时候有用过决策树来做预测的小例子:机器学习之决策树预测--泰坦尼克号乘客数据 ...

  10. Dalvik源码阅读笔记(二)

    DVM 类加载原理: DEX 文件加载到内存中 DvmDex 结构后,还没有完成类的解析工作,我们将 DEX 中的类填充到 ClassObject 结构的过程称为类加载. ClassObject 用来 ...