oracle-pl/sql之一
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之一的更多相关文章
- ORACLE PL/SQL编程详解
ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...
- [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)
原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...
- ORACLE PL/SQL编程之八:把触发器说透
原文:ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之八: 把触发器说透 大家一定要评论呀,感谢!光发表就花了我将近一个下午. 本篇主要内容如下: 8.1 触发器类型 ...
- [推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)
原文:[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不殆) [推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/S ...
- ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)
原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!) 继上篇:ORACLE P ...
- [推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆)
原文:[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程详解之三: PL/SQL流程控制语句(不给规则,不成方圆) ...
- [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)
原文:[推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]ORACLE PL/SQL编程之四: 把游标说透(不怕做不到,只怕想不到) 继上两篇:ORACLE PL ...
- 【强烈强烈推荐】《ORACLE PL/SQL编程详解》全原创(共八篇)--系列文章导航
原文:[强烈强烈推荐]<ORACLE PL/SQL编程详解>全原创(共八篇)--系列文章导航 <ORACLE PL/SQL编程详解> 系列文章目录导航 ——通过知识共享树立个人 ...
- [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)
原文:[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) [推荐]ORACLE PL/SQL编程详解之一: PL/SQL 程序设计简介(千里之行,始于足下 ...
- [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)
原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日 ...
随机推荐
- 7 Serial Configuration 理解 (一)
reference : ug470- 7 series config.pdf 7系列器件有5种配置接口,每种配置接口对应一种或者多种配置模式和总线位宽.配置时序相对于引脚的CCLK,即使在内部产生C ...
- matlab中循环的使用
转载自 https://blog.csdn.net/ssure/article/details/30329601 matlab 中的while循环只有 while statement .... end ...
- elk之kibana
环境: centos7 jdk8 参考: https://www.elastic.co/guide/en/elasticsearch/reference/current/rpm.htmlhttp:// ...
- SQL注入之Sqli-labs系列第二十七关(过滤空格、注释符、union select)和第二十七A
开始挑战第二十七关(Trick with SELECT & UNION) 第二十七A关(Trick with SELECT & UNION) 0x1看看源代码 (1)与26关一样,这次 ...
- 20165228 2017-2018-2 《Java程序设计》第4周学习总结
20165228 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 子类与继承 子类的定义:使用关键词extends class 子类名 extends 父类名 ...
- Android Native Hook技术(一)
原理分析 ADBI是一个著名的安卓平台hook框架,基于 动态库注入 与 inline hook 技术实现.该框架主要由2个模块构成:1)hijack负责将so注入到目标进程空间,2)libbase是 ...
- skflow 分类与回归接口API 简单测试
skflow也即是 tf.contrib.learn, 是 TensorFlow 官方提供的另外一个对 TensorFlow 的高层封装,通过这个封装,用户可以和使用 sklearn 类似的方法使用 ...
- epoll c++封装
#ifndef _BFC_EPOLL_FLOW_HPP_ #define _BFC_EPOLL_FLOW_HPP_ #include <string.h> #include <err ...
- HDU - 5033: Building(单调栈 ,求一排高楼中人看楼的最大仰角)
pro:现在在X轴上有N个摩天大楼,以及Q个人,人和大楼的坐标各不相同,保证每个人左边和右边都有楼,问每个人能看到天空的角度大小. sol:不难想到就是维护凸包,此题就是让你模拟斜率优化,此处没有斜率 ...
- seo:与优化相关的熊掌号
可以做的有: 站点资源管理 天级收录(提交链接即可) 视频极速服务(暂只针对移动端体验优化)https://ziyuan.baidu.com/college/articleinfo?id=2411 原 ...