posts - 120,  comments - 19,  trackbacks - 0

1.   简介

1.1     结构

DECLARE -- 定义

BEGIN  -- 执行部分

EXCEPTION  -- 例外处理

END;  -- 结束

 

set serveroutput on;
DECLARE v_ename VARCHAR2(
5
);
BEGIN
SELECT ename INTO v_ename FROM emp WHERE empno=&no;
dbms_output.put_line(
'¹ÍÔ±Ãû:'
|| v_ename);
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line(
'please input correct employees no!'
);
END;
/

 

1.2     块分类

<<outer>> <<inner>>

1.3     子程序

1.1.1       过程

执行特定的操作

  CREATE or replace PROCEDURE update_sal(nameVARCHAR2,newsal NUMBER)
IS
BEGIN
     UPDATE emp SET sal=newsal WHERE lower(ename)=lower(name);
END;
/

调用:

exec update_sal( 'SMITH' , 10 )
call update_sal(
'SMITH' , 800 )

1.1.2       函数

返回特定数据

CREATE or replace FUNCTION annual_income(nameVARCHAR2)
RETURNNUMBERIS
       annual_salary NUMBER(
7 , 2
);
BEGIN
SELECT sal*
12 + nvl(comm, 0
)  into annual_salary FROM emp WHERE lower(ename)=lower(name);
RETURN annual_salary;
END;
/

调用 :

SQL> VAR income NUMBER

SQL> CALL annual_income('scott') INTO : income;

调用完成。

SQL> print income

    INCOME

----------

     36000

1.1.3      

逻辑组合相关的过程和函数

-- 包规范
CREATE or replace PACKAGE emp_pkg IS
  PROCEDURE update_sal(nameVARCHAR2, newsal NUMBER);
  FUNCTION annual_income(nameVARCHAR2) RETURNNUMBER;
END;

-- 包体
CREATE or replace PACKAGE BODY emp_pkg IS
       PROCEDURE update_sal(nameVARCHAR2, newsal NUMBER)
       IS
       BEGIN
            UPDATE emp SET sal = newsal WHERE lower(ename) = lower(name);
       END;
      
       FUNCTION annual_income(nameVARCHAR2) RETURNNUMBER
       IS
         annual_salary NUMBER(
7 , 2 );
       BEGIN
            SELECT sal *
12 + nvl(comm, 0
) into annual_salary FROM emp WHERE lower(ename) = lower(name);
            RETURN annual_salary;
       END;
END;
/

调用:

SQL> call emp_pkg .update_sal('SMITH',1500);

Or

SQL> VAR income NUMBER

SQL> CALL emp_pkg . annual_income('scott') INTO : income;

调用完成。

SQL> print income

    INCOME

----------

     36000

1.4     触发器

     是隐含执行的存储过程。

create or replace trigger update_cascade
 afterupdateof deptno on dept
 foreachrow
begin
     update emp set deptno=:new.deptno
     where deptno=:old.deptno;
end;
/    

2.   定义并使用变量

1.5     标量变量

1.1.4       特殊变量说明

LONG(32760 字节 ) VARCHAR2(32767 字节 ) 类似,定义变长的字符串

LONG RAW 用于定义变长的二进制数据 (32760 字节 )

BINARY_INTEGER 定义整数,范围为: -2147483647~2147483647 ( 非表列使用 )

BOOLEAN TRUE/FALSE/NULL ( 非表列使用 )

BINARY_FLOAT/BINARY_DOUBLE ORACLE10 所有

1.1.5       定义使用

Identifier [CONSTANT] datatype [not null] [:= | default expr]

例如: v_valid BOOLEAN NOT NULL DEFAULT FALSE;

C_tax_rate CONSTANT NUMBER(3,2):=0.03;

V_ename emp.ename%TYPE;

1.6     复合变量

1.1.6       Pl/sql 记录

类似于高级语言中的结构

DECLARE
TYPE emp_record_type ISRECORD(
    name emp.ename%TYPE,
    salary emp.sal%TYPE,
  title emp.job%TYPE
);
emp_record emp_record_type;
BEGIN
     SELECT ename,sal,job INTO emp_record FROM emp WHERE empno=
7788 ;
     dbms_output.put_line(
' 雇员名 '
||emp_record.name);
end;
/    

1.1.7       Pl/sql

类似于高级语言中的数组,下标可以为负 , 个数无限制。

DECLARE
TYPE ename_table_type ISTABLEOF emp.ename%TYPE
     INDEXBYBINARY_INTEGER;
     ename_table ename_table_type;
BEGIN
     SELECT ename  INTO ename_table(-
1 ) FROM emp WHERE empno= 7788 ;
     dbms_output.put_line(
' 雇员名 ' ||ename_table(- 1
));
end;
/    

1.1.8       嵌套表

类似于高级语言中的数组,下标不可以为负,个数无限制。

CREATE OR REPLACE TYPE emp_type  ASOBJECT(
       nameVARCHAR2(
10
),
       salary NUMBER(
6 , 2
),
       hiredate DATE
);
/
CREATEORREPLACETYPE emp_array ISTABLEOF emp_type;
/

CREATEORREPLACEtable department(
       deptno NUMBER(
2
),
       dname VARCHAR2(
10
),
       employee emp_array      
)nestedtable employee storeas employee;

 

1.1.9       VARRAY

VARRAY 类似于嵌套表,它可以作为表列和对象类型属性的数据类型,个数有限制。

CREATE OR REPLACE TYPE article_type  ASOBJECT(
       title VARCHAR2(
30
),
       pubdate DATE
);
/
CREATEORREPLACETYPE article_array ISVARRAY(
20
) OF article_type;
/

CREATEORREPLACEtable author(
       idNUMBER(
6
),
       nameVARCHAR2(
10
),
       article article_array      
);

1.7     参照变量

用于存放数值指针的变量。使得应用程序共享相同对象,从而降低占用空间。

1.1.10 REF CURSOR

游标变量

DECLARE
  TYPE c1 ISREFCURSOR;
  emp_cursor c1;
  v_ename emp.ename%TYPE;
  v_sal   emp.sal%TYPE;
BEGIN
  OPEN emp_cursor FOR
    SELECT ename, sal FROM emp ;
--WHERE deptno = 10;
  LOOP
    FETCH emp_cursor
      INTO v_ename, v_sal;
    EXITWHEN emp_cursor%NOTFOUND;
    dbms_output.put_line(v_ename);
  ENDLOOP;
  CLOSE emp_cursor;
END;
/

1.1.11 REF obj_type

为了共享相同对象,可以用 ref 引用对象类型。

CREATE OR REPLACE TYPE home_type AS OBJECT(

       street VARCHAR2(50),city VARCHAR2(20),

       state VARCHAR2(20),zipcode VARCHAR2(6),

       owner VARCHAR2(10)

);

/

CREATE TABLE homes OF home_type;

INSERT INTO homes VALUES(' 呼伦北路 12 ',' 呼和浩特 ',' 内蒙 ','010010',' 马鸣 ');

INSERT INTO homes VALUES(' 呼伦北路 13 ',' 呼和浩特 ',' 内蒙 ','010010',' 秦斌 ');

CREATE TABLE person(

       id NUMBER(6) PRIMARY KEY,

       name VARCHAR2(10), addr REF home_type

);

INSERT INTO  person SELECT 1,' 马鸣 ',ref(p) FROM homes p WHERE p.owner=' 马鸣 ';

1.8     LOB 变量

内部 : CLOB BLOB NCLOB ;外部: BFILE

1.9     PL/SQL 变量

1.1.12 使用 sql*plus 变量

var namevarchar2( 10 )
begin
     select ename into :namefrom emp
     where empno=
7788
;
end;
/
print name  

 

1.1.13 使用 procedure Builder 变量

.createcharname length 10
begin
     select ename into :namefrom emp
     where empno=
7788 ;
end;
/
text_to.put_line(:name);  

1.1.14 使用 pro*c/c++ 变量

char name[ 10 ];
execsqlexecute
begin
     select ename into :namefrom emp
     where empno=
7788
;
end-exec;
printf(
' 雇员名: %s\n' ,name);


posted on 2006-08-29 08:52 阿成 阅读(339) 评论(0)  编辑  收藏 所属分类: 数据库

只有注册用户登录后才能发表评论。


网站导航: