- 浏览: 15601 次
- 性别:
- 来自: 深圳
最新评论
文章列表
以独立事务执行PL/SQL
为了以独立事务执行PL/SQL,要在存储程序中声明[PRAGMA AUTONOMOUS_TRANSACTION]语句。
这样就使得调用方的事务与存储程序的事务完全分离。
因此,即使调用方的事务回滚,存储程序方不受其影响。
同样,存储程序方的事务回滚,调用方也不受其影响。
create or replace procedure insert_emp (
v_emp_id in char,
v_emp_name in varchar2) as
pragma autonomous_transaction;
begin
...
PL/SQL的存储过程、函数、包等,默认以所有者的权限执行。
如果要以当前用户的权限执行的话,就要指定[AUTHID CURRENT_USER]。
示例1)以当前用户的权限执行存储过程[INSERT_DATA]。
CREATE OR REPLACE PROCEDURE INSERT_DATA (
EMP_ID IN VARCHAR2
EMP_NAME IN VARCHAR2)
AUTHID CURRENT_USER AS
BEGIN
INSERT INTO EMP VALUES (EMP_ID, EMP_NAME);
END INSERT_DATA;
/
...
在PL/SQL中,可以使用除了SUM、MAX之类的组函数以外的SQL函数。
(在PL/SQL内部的SQL语句中,仍然可以使用组函数)
此外,还可以使用PL/SQL独有的内置函数。比如错误通知函数(SQLCODE、SQLERRM)。
关于函数,请参考 SQL(DML)。
示例1)把日期数据转换为字符串数据加以显示。
declare
v_date date := sysdate;
v_str_date varchar2(8);
begin
dbms_output.enable(100000);
v_str_date := to_char(v_date,'YY ...
变量名 表名.列名%TYPE;定义与表的列的类型相同的变量。好处是表的列的类型发生变更的话,PL/SQL无需变更。即使列受到NOT NULL限制,变量也不受NOT NULL限制,可以赋值为NULL。变量名 表名%ROWTYPE;%ROWTYPE定义从表中取得的记录类型(作为一个整体)。
示例1)把变量"empname"定义为表[emp]的列[emp_name]的类型。
declare
empname emp.emp_name%type;
:
:
示例2)检索表[dept]的列[dept_id]的值为'D01'的记录。
declare
-- 声明%ROWTY ...
PL/SQL中的变量和常量的定义和赋值如下:
变量 数据类型 [NOT NULL];变量的定义变量名 数据类型 := 变量名;变量定义时代入初期值常量名 CONSTANT 数据类型 := 初始化值;常量的定义
示例1)声明varchar2(10)类型的变量[empname],赋值为'名字'。
declare
empname varchar2(10);
degin
:
empname := '名字';
:
end
示例2)声明varchar2(10)类型的变量[empname],赋予初始化值为'名字'。
declare
empname varchar2(10) ...
PL/SQL中可以使用的运算符如下:
+、-、*、/加、减、乘、除:=赋值=>结合(双竖线)连结**指数=、<、>、<=、>=、<>、!=、~=、^=、IS NULL、LIKE、BETWEEN、IN比较NOT、AND、OR逻辑非、逻辑与、逻辑或
→匿名块
→存储过程(PROCEDURE)
→存储函数(FUNCTION)
→存储包(PACKAGE)
→触发器(TRIGGER)
→PL/SQL的数据类型
→PL/SQL的运算符(计算、赋值、结合、连结、指数、比较)
→PL/SQL的变量和常量
→%TYPE属性和%ROWTYPE属性
→PL/SQL的内置函数 ...
数值类型
NUMBER(p,s)与数据库的NUMBER类型相同。p是精度,最大値为38,s是规模,表示小数点之后的位数,范围是-84~127。NUMBER(p)同上BINARY_INTEGER因为对NUMBER类型的数据无法直接进行算术运算,所以必须转变为二进制类型。指定范围是 -2147483647~2147483647 。不存储在数据库中,只用于计算PLS_INTEGER基本上与BINARY_INTEGER相同。如果计算溢出,就会发生错误。如果BINARY_INTEGER溢出,就被赋值为NUMBER类型。INTEGER、DEC、INT、DECIMAL、NUMERIC、DOUBLE PRECI ...
触发器的语法
CREATE OR REPLACE TRIGGER 触发器名
{ BEFORE | AFTER }
{ INSERT OR UPDATE OR DELETE }
ON 表1
[ FOR EACH ROW ]
{ AS | IS }
/* 声明部分 */
BEGIN
/* 可执行部分 */
EXCEPTION
/* 异常处理部分 */
END [触发器名];
表1被更新时执行BEGIN部分的处理。
●启动时刻
BEFORE : 表1被更新前启动触发器。
AFTER : 表1被更新后启动触发器。
●触发器事件语句
...
存储包的语法
●包规格部
CREATE OR REPLACE PACKAGE 包名 { AS | IS }
存储过程定义;
存储函数定义;
变量定义;
数据类型定义;
异常定义;
游标定义;
END [ 包名 ];
●包本体
CREATE OR REPLACE PACKAGE BODY 包名 { AS | IS }
针对包规格部の存储过程定义的程序;
针对包规格部の存储函数定义的程序;
只能在包本体内部调用的存储过程程序;
只能在包本体内部调用的存储函数程序;
END [包名];
存储包由包规格部和包本体两部分构成。
●包规格部
定义可以从包外部或包全 ...
存储函数的语法
CREATE OR REPLACE FUNCTION 函数名
[ (参数变量1 [ IN | OUT | INT OUT ] 数据类型,
:
参数变量n [ IN | OUT | INT OUT ] 数据类型) ]
RETURN 数据类型 { AS | IS }
/* 声明部分 */
BEGIN
/* 可执行部分 */
EXCEPTION
/* 异常处理部分 */
END [ 函数名 ];
与存储过程类似,不同之处是有返回值。
给返回值(RETURN)指定的数据类型,不可指定长度。
例)
× return char(2)
○ return c ...
存储过程的语法
CREATE OR REPLACE PROCEDURE 存储过程名
[ (参数变量1 [ IN | OUT | INT OUT ] 数据类型,
:
参数变量n [ IN | OUT | INT OUT ] 数据类型) ] { AS | IS }
/* 声明部分 */
BEGIN
/* 可执行部分 */
EXCEPTION
/* 异常处理部分 */
END [ 存储过程名 ];
与匿名块不同的是,存储过程无需DECLARE关键字。取而代之的是IS或者AS关键字。
给参数指定参数类型时,不可指定长度。
例)
× param1 in char(2) ...
匿名块的构成
DECLARE
/* 声明部分 */
BEGIN
/* 执行部分 */
EXCEPTION
/* 异常处理部分 */
END;
DECLARE
在匿名块内声明变量。
如果无需声明变量,则可以省略DECLARE。
BEGIN
编写SQL语句、控制逻辑等可执行的部分。
此部分是必需的。
EXCEPTION
为了应对程序内可能发生的异常,在此进行错误处理。
如果无需错误处理,则可以省略EXCEPTION。
END
表示匿名块的结束。
示例1 包含所有部分的匿名块
declare
dname varchar2(10);
beg ...