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. vivado对task和function的可综合支持

    手册UG901,对vivado可综合的语句支持进行了描述,HDL包括:verilog-2001,system-verilog,VHDL: verilog-2001扩展了对task和function的支 ...

  2. struts2应用

    1.处理表单数据 GreetingAction public class GreetingAction extends ActionSupport{ private String username; ...

  3. Linux文件系统命令 mkdir/rmdir

    命令名:mkdir 功能:创建一个文件夹,和touch的区别是,touch是创建一个文件,后面可以跟绝对路径和相对路径 eg: mkdir ren 命令名:rmdir 功能:删除一个文件夹

  4. HTML5触摸事件(touchstart、touchmove和touchend)

      HTML5中新添加了很多事件,但是由于他们的兼容问题不是很理想,应用实战性不是太强,所以在这里基本省略,咱们只分享应用广泛兼容不错的事件,日后随着兼容情况提升以后再陆续添加分享.今天为大家介绍的事 ...

  5. error_log

    对于我们做php开发的人员,上了生产环境,一定要把相关debug,display_errors错误提示等关掉.谁还难免不犯个错呢?这样能防止非致命性报错下,导致项目路径.数据库等信息泄漏. 问:那么问 ...

  6. mod_fcgid: HTTP request length 136136 (so far) exceeds MaxRequestLen (131072)

    原来是fastcgi模式下的设置问题,需要在配置文件.htaccess或者直接在apache的配置文件http.conf 中指明,如下: 查看官方说明有这么一句:Default: FcgidMaxRe ...

  7. 日期和API

    Java1.0对日期和时间的支持只能依赖java.util.Date类,年份的起始选择是1900你那,月份的起始是从0开始计算的.它的返回值中包含了JVM的默认市区CET,即中欧时间.在Java1.1 ...

  8. Notepad++同一窗口显示左右显示两份文档

    Notepad++同一窗口显示左右显示两份文档   直接打开一份文档,test1.txt 再打开第二份文档,test2.txt,会显示成这样: 两份文档是以标签的形式展示的,有时需要同时查看两份文档, ...

  9. 队列 c实现

    循环队列的数组实现 queue.h #ifndef _QUEUE_H_ #define _QUEUE_H_ #define SIZE 10 typedef int data_t; typedef st ...

  10. 2.7 多窗口、句柄(handle)

    2.7 多窗口.句柄(handle) 前言   有些页面的链接打开后,会重新打开一个窗口,对于这种情况,想在新页面上操作,就得先切换窗口了.获取窗口的唯一标识用句柄表示,所以只需要切换句柄,我们就能在 ...