PL/SQL
简介
q PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言
q PL/SQL 是对 SQL 的扩展
q 支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制结构
q 可用于创建存储过程、触发器和程序包,给SQL语句的执行添加程序逻辑
q 与 Oracle 服务器和 Oracle 工具紧密集成,具备可移植性、灵活性和安全性
优点
q 支持 SQL,在 PL/SQL 中可以使用:
q 数据操纵命令
q 事务控制命令
q 游标控制
q SQL 函数和 SQL 运算符
q 支持面向对象编程 (OOP)
q 可移植性,可运行在任何操作系统和平台上的Oralce 数据库
q 更佳的性能,PL/SQL 经过编译执行
q 会进行预编译
q 把整个PL/SQL块整体传给ORACLE服务器
q 与 SQL 紧密集成,简化数据处理。
q 支持所有 SQL 数据类型
q 支持 NULL 值
q 支持 %TYPE 和 %ROWTYPE 属性类型
q 安全性,可以通过存储过程限制用户对数据的访问
PL/SQL块是构成PL/SQL程序的基本单元
[DECLARE DECLARE
Declarations] 声明变量/游标/异常
BEGIN BEGIN
Executable statements 可执行代码
[EXCEPTION EXCEPTION
handlers] 异常处理代码
END; END;
BEGIN SELECT ename FROM emp WHERE empno = 7788; END;
SQL> ed SQL> /
BEGIN SELECT ename FROM emp WHERE empno = 7788; END;
ORA-06550:第3行,第3列: PLS-00428:在此 SELECT 语句中缺少 INTO 子句 |
DECLARE empname emp.ename%type; BEGIN SELECT ename into empname FROM emp WHERE empno = 7788; dbms_output.put_line(empname); END;
用户 . 表 . 列%type :取得列类型并映射为PL/SQL类型
SQL> ed SQL> /
SCOTT
PL/SQL procedure successfully completed
DECLARE empRecord emp%rowtype; BEGIN SELECT * into empRecord FROM emp WHERE empno = 7788; dbms_output.put_line(empRecord.ename||' '||empRecord.sal); END;
用户 . 表 %rowtype :行类型变量
SQL> ed SQL> /
SCOTT 3000
PL/SQL procedure successfully completed |
DECLARE empRecord emp%rowtype; BEGIN SELECT * into empRecord FROM emp; dbms_output.put_line(empRecord.ename||' '||empRecord.sal); EXCEPTION WHEN too_many_rows THEN dbms_output.put_line(sqlcode||' '||sqlerrm); WHEN others THEN dbms_output.put_line('EXCEPTION'); END;
SQL> ed SQL> /
-1422 ORA-01422: 实际返回的行数超出请求的行数
PL/SQL procedure successfully completed |
BEGIN CREATE TABLE HP(myname varchar2(18)); END;
SQL> ed SQL> /
BEGIN CREATE TABLE HP(myname varchar2(18)); END;
ORA-06550: 第 3 行, 第 4 列: PLS-00103: 出现符号 "CREATE"在需要下列之一时: begin case declare exit for goto if loop mod null pragma raise return select update while with <an identifier> <a double-quoted delimited-identifier> <a bind variable> << close current delete fetch lock insert open rollback savepoint set sql execute commit forall merge <a single-quoted SQL string> pipe |
BEGIN EXECUTE IMMEDIATE 'CREATE TABLE HP(myname varchar2(18))'; END;
SQL> ed SQL> /
PL/SQL procedure successfully completed
SQL> desc HP; Name Type Nullable Default Comments ------ ------------ -------- ------- -------- MYNAME VARCHAR2(18) Y |
DECLARE sqlStr varchar(200); empRec emp%rowtype; BEGIN sqlStr:='select * into empRec from emp where empno=:no'; EXECUTE IMMEDIATE sqlStr using 7788; dbms_output.put_line(empRec.ename||' '||empRec.empno); END;
SQL> ed SQL> /
DECLARE sqlStr varchar(200); empRec emp%rowtype; BEGIN sqlStr:='select * into empRec from emp where empno=:no'; EXECUTE IMMEDIATE sqlStr using 7788; dbms_output.put_line(empRec.ename||' '||empRec.empno); END;
ORA-00905: 缺少关键字 ORA-06512: 在line 7 |
DECLARE sqlStr varchar(200); empRec emp%rowtype; BEGIN sqlStr:='select * from emp where empno=:no'; EXECUTE IMMEDIATE sqlStr into empRec using 7788; dbms_output.put_line(empRec.ename||' '||empRec.empno); END;
SQL> ed SQL> /
SCOTT 7788
PL/SQL procedure successfully completed
|