您的位置:首页 > 数据库 > Oracle

Oracle 10G -- Pl/sql 基础

2011-05-25 18:01 337 查看

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息