先上一张实用的图:用于转义字符的。

SQL> select chr(42) ||'is what?' from dual;

CHR(42)||
---------
*is what?

想转义哪个就转义哪个字符。

转义单引号的方法:1.使用两个单引号;2使用chr函数。
SQL> select '"It''s a pen",she said.'from dual;

'"IT''SAPEN",SHESAID.'
----------------------
"It's a pen",she said.

绑定变量的目的是重复利用SQL语句。
VARIABLE bd VARCHAR2(100)
BEGIN
:bd:='hello you!'; --绑定变量实用的时候要在前面加一个:号, :=是赋值。
END;

PRINT bd;

一、预定义PL/SQL数据类型

1,标量类型(Scalar,就是标准的数据类型)

2,复合类型(Composite)复合类型包含了能够被单独操作的内部组件
3,引用类型(Reference)引用类型类似于3G语言中的指针
4,LOB类型(Large Object)LOB类型的值就是一个Lob定位器。
标量类型
  数字型:
    BINARY_INTEGER 存储有符号整数,
    PLS_INTEGER 存储有符号整数采用硬件运算,速度更快。
    BINARY_FLOAT 单精度浮点数,
    BINARY_DOUBLE双精度浮点数,
    NUMBER存储整数或小数,范围送1E-130到1.0E126.
  字符型:
    CHAR 定长字符串,最大长度为32767字节,
    VARCHAR 变长字符串,最大长度为32767字节,
    RAW存储二进制数据或字节串,比较像VARCHAR2类型,但PL/SQL不解析它,
    NCHAR存储定长国家字符集数据,
    NVARCHAR2变长国家字符集数据,
    LONG存储二进制数据或二进制字符串,最大长度是32760字节,已逐渐被LOB替换,不建议使用,
    LONG RAW 逐渐被LOB替换。
    ROWID 存储行的逻辑地址
    UROWID存储行的物理地址
  布尔型 BOOLEAN(真TRUE 假 FALSE)
  日期型:
    DATE 日期时间,
    TIMESTAMP时间戳,比DATE更加精确,
    TIMESTAMP WITH TIME ZONE 有时区的时间戳
    TIMESTAMP WITH LOACL ZONE 本地时区的时间戳
    INTERVAL YEAR TO MONTH 存储时间间隔,单位是年和月,
    INTERVAL DAY TO SECOND 单位是天和秒。

Composite类型:
  NESTED TABLE 嵌套表
  VARRAY 可变数组(变长数组)
  TABLE 表(这里不是普通的表,是一种数据类型)
  RECORD 记录
Reference类型:
  REF CURSOR 游标类型
LOB类型:
  BFILE 存储二进制对象,实际内容存放在操作系统的文件中
  BLOB存储大的二进制数据
  CLOB 存储大的字符数据
  NCLOB 存储大的国家字符集数据

二、用户自定义PL/SQL子类型

其实就是其他数据类型的子集。
格式:
SUBTYPE 子类型的名字 IS 基本数据类型 [(constraint)] [NOT NULL];
DELCARE
SUBTYPE sub_num IS NUMBER(5,1);
v2 sub_num;
BEGIN
NULL;
END;
here,sub_num就是NUMBER的一个子类型,并且成为了一种新的数据类型,使用这个新的数据类型可以定义变量v2。
在PL/SQL中使用SELECT语句,必须把查询结果赋予变量,into后面指定变量的名字
eg,SELECT ID,NAME INTO v_id,v_name FROM tt;
在PL/SQL中可以直接使用DML语句(insert、update、delete)和事物控制语句(commit、rollback)等

自定义异常:
PRAGMA EXCEPTION_INIT(execption_name,-Oracle_error_number);
有三种方式触发异常:
1,由oracle自动触发异常;
2,使用RAISE语句手工触发;
3,调用存储过程RAISE_APPLICATION_ERROR手工触发。
DECLARE
myecp EXCEPTION;
BEGIN
...
RAISEmyecp;
...
EXCEPTION WHEN myecp THEN
....
dbms_output.put_line('myecp error,....');
END;

DECLARE
myecp2 EXCEPTION;
PRAGMA EXCEPTION_INIT(myecp2,-20002);
BEGIN
RAISE_APPLICATION_ERROR(-20002,'data is out of list');
EXCEPTION when myecp2 THEN
DBMS_OUTPUT.PUT_LINE('Error code:' || SQLCODE ||' '||SQLERRM);
END;
Error code:-20002 ORA-20002: data is out of list

PL/SQL 过程已成功完成。
游标:
如果对多行数据进行处理,则要用到游标。一个游标是一个指定的私有SQL区(Private SQL Area)的句柄,或者是一个命名的私有SQL区,这片区域存放解析过的语句 和其他信息。
游标分为显式游标和隐式游标。
隐式游标又叫SQL游标,是在执行插入DML操作(INSERT、DELETE、UPDATE)和SELECT语句返回单条记录时由PL/SQL自动、隐含定义。隐式游标由PL/SQL自动定义、自动打开、自动关闭、不需要用户的参与。
游标属性用于返回DML和DDL执行的信息。四大属性:%FOUND、%NOTFOUND、%ISOPEN、%ROWCOUNT。%ROWCONUT的结果为整数,其他为BOOLEAN型。
%FOUND 用于判断DML语句是否该表了行,(或者判断SELECT INTO是否返回了一行或多行数据);
%NOTFOUND与found相反;
%ISOPEN,判断游标是否打开,隐式游标自动关闭,该值永远是False。
%ROWCOUNT 判断DML语句影响了多少行。

BEGIN
DELETE FROM myorder;
IF SQL%FOUND THEN
COMMIT;
ElSE
DBMS_OUTPUT.PUT_LINE('not commit');
END IF;
END;

BEGIN
INSERT INTO myorder VALUES
(12,'rice','rice that is nice');
DBMS_OUTPUT.PUT_LINE (TO_CHAR(SQL%ROWCOUNT));
END;
/

显示游标:
定义 CURSOR cursor_name IS SELECT_statement;
eg,
DECLARE
CURSOR ct IS SELECT ORDER_NAME FROM myorder;
name VARCHAR2(20);
BEGIN
OPEN ct;
LOOP

FETCH ct INTO name;
EXIT WHEN ct%NOTFOUND OR ct%NOTFOUND IS NULL;
DBMS_OUTPUT.PUT_LINE('the name is:'||to_char(name));

END LOOP;
CLOSE ct;
END;
/
the name is:rice
the name is:apple
the name is:cup

PL/SQL 过程已成功完成。

Oracel引入FOR循环,优点在于,忽略了显式的打开游标、关闭游标、从游标中提取数据等的过程。使用隐式游标,系统隐含定义了一个%ROWYTPE类型的记录。
FOR record_name IN
(cursor_name) | (query_difinition)
LOOP
statements;
END LOOP;
(query_difinition)表示如果不指定游标的名字,可以指定一个查询。
eg,
DECLARE
CURSOR ct IS SELECT ORDER_NAME FROM myorder;
name VARCHAR2(20);
BEGIN
FOR item in ct
LOOP
DBMS_OUTPUT.PUT_LINE(item.order_name);
END LOOP;
END;
/
运行结果:
rice
apple
cup
PL/SQL 过程已成功完成。

CREATE OR REPLACE PROCEDURE p_cur(p_phone1 NUMBER) --p_phone1 is the phone
AS
v_id student.id%TYPE;
v_name student.name%TYPE;
v_phone student.phone%TYPE;

CURSOR c_s(p_phone2 NUMBER) IS
SELECT id,name,phone
FROM student
WHERE phone=p_phone2;

BEGIN
OPEN c_s(p_phone1);
LOOP
FETCH c_s INTO v_id,v_name,v_phone;
EXIT WHEN c_s%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_id ||' '||v_name||' '||v_phone);
END LOOP;
CLOSE c_s;
END;
SQL> SELECT * FROM student;

ID NAME PHONE
---------- ---------- ----------
2 cat 1234
1 pig 2341201
1 Ding 1234

已选择3行。
该procedure的目的是要把phone=‘1234’的行打印出来。

SQL> EXEC p_cur('1234');--‘1234’是传入的参数。
2 cat 1234
1 Ding 1234

PL/SQL 过程已成功完成。

游标变量
其实就是指针,只是这个指针可以指向不同的查询工作区(Query Work Area),而普通游标(显示游标)总是指向相同的查询工作区。
简单的说,游标变量是一个变量,这个变量可以动态指向不同的游标,因此称为动态游标;显示游标则称为静态游标。
游标变量可以作为函数和存储过程的参数。
1 定义:
定义CURSOR类型的指针,然后再声明游标变量。
TYPE ref_type_name IS REF CURSOR [return return_type]
return_type是可选的,用于指定游标变量返回值的类型,它必须是一个记录类型(RECORD)或行类型(ROWTYPE),如果有返回类型,称之’强REF CURSOR‘,若使用强REF CURSOR,只允许把游标变量与特定查询进行关联。反之,’弱REF CURSOR‘,可以关联任何查询。

触发器是基于table、view、schema、database的,据此可以分为:
行级触发器和语句级触发器(Row Trigger,Statement Trigger)
BEFORE和AFTE
R触发器
复合触发器(Compound Trigger)
INSTEAD OF触发器
系统级触发器(Triggers on System Event)
用户级触发器(Triggers on User Events)

 1 CREATE OR REPLACE PROCEDURE p_cursor (choice INT) AS
2 TYPE newcursor_type IS REF CURSOR;
3 v_cursor newcursor_type;
4 v_rec test_order%ROWTYPE;
5 BEGIN
6 IF choice = 1 THEN
7 OPEN v_cursor FOR
8 SELECT * FROM test_order;
9 ELSIF choice = 2 THEN
10 OPEN v_cursor FOR
11 SELECT * FROM fitness_member;
12 ELSIF choice = 3 THEN
13 OPEN v_cursor FOR
14 SELECT * FROM student;
15 END IF;
16
17 LOOP
18 FETCH v_cursor
19 INTO v_rec;
20 EXIT WHEN v_cursor%NOTFOUND;
21 DBMS_OUTPUT.PUT_LINE(v_rec.name);
22 END LOOP;
23 CLOSE v_cursor;
24 END;

执行:

SQL> EXEC p_cursor(1);
phone
pen

PL/SQL 过程已成功完成。

动态SQL 解决DDL语句编译出错的问题:

1 CREATE OR REPLACE PROCEDURE  create_table
2 AS
3 Pstring VARCHAR2(2000);
4 BEGIN
5 Pstring := 'CREATE TABLE tp(id int, name VARCHAR2(20))';
6 EXECUTE IMMEDIATE Pstring;
7 END;

EXECUTE create_table;

表即可创建成功。

Oracle 学习PL/SQL的更多相关文章

  1. Oracle中PL/SQL简介、基本语法以及数据类型

    Oracle中PL/SQL简介.基本语法以及数据类型 一.PL/SQL简介. Oracle PL/SQL语言(Procedural Language/SQL)是结合了结构化查询和Oracle自身过程控 ...

  2. Oracle中PL/SQL的执行部分和各种流程控制

    Oracle中PL/SQL的执行部分和异常部分 一.PL/SQL的执行部分. 赋值语句. 赋值语句分两种,一种是定义一个变量,然后接收用户的IO赋值:另一种是通过SQL查询结果赋值. 用户赋值举例: ...

  3. 使用oracle 的 PL/Sql 定时执行一个存储过程

    CSDN日报20170322--<关于软件研发的一些体会总结> 同步博客至 CSDN ,让更多开发者看到你的文章 看微博技术大咖解析互联网应用架构实战 使用oracle 的 PL/Sql ...

  4. Oracle之PL/SQL学习笔记

    自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整理了一下,给大家分享,有不足之处还望大家 ...

  5. 基于oracle 的PL/SQL编程 -变量使用

    1. 需要开启的服务:  本机安装的oracle ,默认是开机启动服务的,开机时间太慢,关闭了,需要手动打开: OracleDBConsoleorcl OracleOraDb10g_home1iSQL ...

  6. 【SQL】Oracle的PL/SQL语法及其拓展数据类型总结

    PL/SQL语法 PL/SQL程序由三部分组成,声明部分.执行部分.异常处理部分. 模板: DECLARE /*变量声明*/ BEGIN /*程序主体*/ EXCEPTION /*异常处理部分*/ E ...

  7. Oracle实践--PL/SQL表分区的基础

    PL/SQL基础入门之表分区 PL/SQL:过程语言(Procedure  Language)和结构化语言(Structured Query Language)结合而成的编程语言.是对SQL的扩展.支 ...

  8. C#(在WeBAPI)获取Oracle(在PL/SQL)游标类型的存储过程(用到了RefCursor)

    需求:WebAPI服务端,通过Oracle数据库的存储过程,获取数据. 在PL/SQL 建立存储过程:(先来最简单的,就是把整个表都查出来) create or replace procedure S ...

  9. 【Oracle】PL/SQL 显式游标、隐式游标、动态游标

    在PL/SQL块中执行SELECT.INSERT.DELETE和UPDATE语句时,Oracle会在内存中为其分配上下文区(Context Area),即缓冲区.游标是指向该区的一个指针,或是命名一个 ...

随机推荐

  1. Qt 使用大神插件快速创建树状导航栏

    前言 本博客仅仅记录自己的采坑过程以及帮助网友避坑,方便以后快速使用自定义控件,避免重复出错. 下载插件 大神 Github Qt 自定义控件项目地址:https://github.com/feiya ...

  2. MongoDB与MySQL效率对比

    本文主要通过批量与非批量对比操作的方式介绍MongoDB的bulkWrite()方法的使用.顺带与关系型数据库MySQL进行对比,比较这两种不同类型数据库的效率.如果只是想学习bulkWrite()的 ...

  3. 如何保证redis中存放的都是热点数据

    当redis使用的内存超过了设置的最大内存时,会触发redis的key淘汰机制,在redis 3.0中有6种淘汰策略: noeviction: 不删除策略.当达到最大内存限制时, 如果需要使用更多内存 ...

  4. PTA7-2 愿天下有情人都是失散多年的兄妹

    呵呵.大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人.父母.祖父母.曾祖父母.高祖父母)则不可通婚.本题就请你帮助一对有情人判断一下,他们究竟是否可以成婚? 输入格式: 输入 ...

  5. 关于 RocketMQ ClientID 相同引发的消息堆积的问题

    首先,造成这个问题的 BUG RocketMQ 官方已经在 3月16号 的这个提交中修复了,这里只是探讨一下在修复之前造成问题的具体细节,更多的上下文可以参考我之前写的 <RocketMQ Co ...

  6. 一文带你吃透CLR垃圾回收机制

    前言 今天我们来共同学习一下CLR的垃圾回收机制,这对我们写出健壮性的代码很有帮助,也许有人会认为多此一举,认为垃圾回收交给CLR就行,我不用关心这个,诚然,大多数情况下是这样的,但是,我们今天讨论的 ...

  7. Hibernate数据校验简介

    我们在业务中经常会遇到参数校验问题,比如前端参数校验.Kafka消息参数校验等,如果业务逻辑比较复杂,各种实体比较多的时候,我们通过代码对这些数据一一校验,会出现大量的重复代码以及和主要业务无关的逻辑 ...

  8. 一个非常好用的IDEA插件,用于填充set

    对于对接三方接口总有一堆字段参数,如在入参时需要赋值,将请求参数封装成一个pojo实体类,然后需要为其set,调用许多setter方法,如果一行行去编写很麻烦,...能不能节省一下我仅存的生产力呀.. ...

  9. layui某个字段不让页面显示显示

    <script src="/layuiadmin/layui/layui.js"></script> <script> layui.config ...

  10. 寒武纪加速平台(MLU200系列) 摸鱼指南(四)--- 边缘端实例程序分析

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...