pl/sql
Posted 阳光-源泉
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
/
以上是关于pl/sql的主要内容,如果未能解决你的问题,请参考以下文章