1、select 查询

单独的一条 select 语句 可以一次查询多条记录;但是在 pl/sql 块中,select语句只能 使用INTO子句;必须并且只能返回一行

2、EXECUTE IMMEDIATE。解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块。

注:

1. EXECUTE IMMEDIATE将不会提交一个DML事务执行,应该显式提交事务,如果通过EXECUTE IMMEDIATE处理DDL命令,它提交所有以前改变的数据

2. 不支持返回多行的查询。

3. 当执行SQL语句时,不要用分号,当执行PL/SQL块时,在其尾部用分号;

4.举例:execute immediate 'select count(1) from tempA';

3、存储过程

  定义在包内的存储子程序称为打包子程序;单独定义的存储子程序称为独立子程序;而在另外一个子程序或PL/SQL块内定义的存储子程序称为本地子程序,这样的子程序不能被其他应用程序调用,只供本地使用。

   in 类型参数  out 类型参数  in out 类型的参数
传递给子程序 返回给调用环境 传递给子程序,返回给调用环境
参数形式 常量 未初始化的变量 初始化的变量
使用时 默认类型 必须明确指定 必须明确指定

4、函数

格式:

create or replace function 函数名(参数1 参数类型,……) return 返回值类型
as
返回值变量 类型;
begin
……
return 返回值变量;
end;

  • 只能使用in模式参数传入参数值.
  • 必须要有返回类型,并且返回值必须要使用.

5、触发器

格式:

Create [or replace] trigger 触发器名
Before|after insert|delete|(update of 列名)
On 表名
[for each row]
begin
……
end;

For each row的意义是:在一次操作表的语句中,每操作成功一行就会触发一次;不写的话,表示是表级触发器,则无论操作多少行,都只触发一次;

触发器用到的表名  :new  、:old

特性 insert update delete
:old  null 有效 有效
:new 有效 有效 null

6、游标

分为 隐式游标、显式游标、动态游标;用到的属性

属性 类型 描述
%isopen boolean true:游标打开;false:游标未打开
%notfound boolean true:未提取到记录;false:提取到记录
%found boolean true:提取到记录;false:未提取到记录
%rowcount number 到目前为止,SQL语句通过游标提取到的总行数

SQL语句中 insert、delete、update 语句即是通过隐式游标完成的,它自动打开、自动关闭;

(1)显式游标:

  • 格式:

DECLARE
  变量 变量类型;
  CURSOR 游标名 IS select语句; --1、声明游标
BEGIN
  OPEN 游标名; --2、打开游标
  LOOP
    FETCH 游标名 INTO 变量; --3、从游标中循环提取数据
    EXIT WHEN 游标名%NOTFOUND;
    ……
  END LOOP;
  CLOSE 游标名;--4、关闭游标
END;

  • 通过使用For循环来读取游标中的数据

格式:

for 表示记录行的变量 IN 游标 loop 
 ……
end loop

  • 声明带参数的游标:

格式:CURSOR 游标名(参数名 类型) IS 使用参数的select语句;  打开游标 OPEN 游标名(参数值);

  • 可以通过游标来更新、删除数据,只需在声明游标时按如下设置:

格式:CURSOR 游标名 IS select语句 for update;  --for update 表示该游标可以用于更新、删除数据。

获取游标数据后:update 表名 set 字段名 = 变量*1.1 WHERE CURRENT OF 游标名;  --WHERE CURRENT OF 游标名; 表示游标当前指向的那行记录。

例:

create or replace procedure temp_1(deptid number) is
  emp_record emp%rowtype;  --声明行类型
  CURSOR emp_cursor IS SELECT * FROM emp where deptno = deptid for update;  --声明可以修改、删除数据的游标
begin
  for emp_record in emp_cursor loop
    dbms_output.put_line(emp_record.sal||' '||emp_record.ename);
    update emp set sal = emp_record.sal*1.1 WHERE CURRENT OF emp_cursor;--通过游标更改数据
    dbms_output.put_line(emp_record.sal||' '||emp_record.ename);
  end loop;
end temp_1;

(2)引用类型游标:可以向客户端返回结果集

声明类型格式: type 类型名 is ref cursor;

声明变量格式:变量名 变量类型;

7、包:是由存储在一起的相关对象组成的PL/SQL存储程序;由包头和包体两个独立的部分组成,需要分别定义;

包头与包体的关系:

  • 在包头声明过的是外部可以调用的过程、函数、变量;只在包体内定义而未在包头声明的的只能在包体内可见;
  • 在包中声明的时候,必须是前向声明的,也就是对象需要引用的另一个对象必须在前面首先声明;
  • 包头是必须存在的,包体是可选的;
  • 包头必须在包体前创建,否则创建不了包体;
  • 只在包头中包括公用变量、过程、函数的声明;
  • 包头:包头主要包含了包中出现的过程、函数的声明,但是不包括实际的代码部分;

格式:

CREATE [OR REPLACE] PACKAGE package_name{IS | AS}
  type_definition -- 类型定义
  procedure_specification -- 过程定义
  function_specification --函数定义
  variable_declaration --变量定义
  cursor_declaration -- 游标定义
END [ package_name];

例:

第一步:创建一个包头,包含一个普通的变量和一个过程。
CREATE OR REPLACE PACKAGE mypackage_1
is
  a number := 1;
  procedure mypro(x number,y number,z out number);
  function myfunc(x number)return number;
END mypackage_1;

第二步:使用包中定义的变量。
declare
begin
  dbms_output.put_line(mypackage_1.a);
  mypackage_1.a := 2;
  dbms_output.put_line(mypackage_1.a);
end;

第三步:重新启动sql*plus,然后输出mypackage_1.a的值。此时会发现,仍然是1。

  • 包体:是真正的过程、函数的执行部分定义

CREATE OR REPLACE PACKAGE body mypackage_1
is
  b number := 2;
  procedure mypro(x number,y number,z out number)
  is
    b number := 4;
    begin
    z := x*y;
  end;
  function myfunc(x number)return number
  is
    x1 number;
  begin
    x1 := b*x;
    return x1;
  end;
  function myfunc1(x number)return number
  is
    x1 number;
  begin
    x1 := b*x;
    return x1;
  end;
END mypackage_1;

第二步:在sql*plus里面调用使用包。
  分别输出包头中定义的变量,包体中定义的变量。
  begin
    dbms_output.put_line(mypackage_1.a);
    dbms_output.put_line(mypackage_1.b);
  end;

        结果:不能使用b,因为b是包体中定义的,不能在外部访问。

        调用myfunc/myfunc1函数。
        declare
        begin
          dbms_output.put_line(mypackage_1.myfunc1(2));
        end;
        结果:无法调用myfunc1,只能使用在包头中定义好的过程,函数等,在只在包体中定义的函数或过程等相当于private 只能在包内部使用。

8、返回多条记录:  
  • 创建包头;
  • 包头中用 type 声明引用类型游标;
  • 包头中声明带有 out 关键字的引用类型;
  • 在包体中用open for 打开引用游标;

第一步:创建包头

create or replace package testpage_1 is
  type my_cursor is ref CURSOR;--声明引用游标类型
  procedure mypro(arr out my_cursor);--声明过程
end testpage_1;

第二步:创建包体

create or replace package body testpage_1 is
  procedure mypro(arr out my_cursor)
  is
  begin
    open arr for SELECT * FROM employees;
  end;
end testpage_1;

注:ref cursor是Oracle旧版本中使用的数据类型,用这种对象的缺点在于必须在包中定义;而现在用 sys_refCursor类型,可以直接使用。

oracle——基础知识(二)未完的更多相关文章

  1. HTML基础知识(未完待续)

    一.HTML编辑工具:Sublime Text 二.HTML实体字符:1.( 空格):&nbsp: 2.(<) &lt: 3.(>)&gt: 4.(&)&a ...

  2. oracle 基础知识(二)-表空间

    一,表空间 01,表空间? Oracle数据库是通过表空间来存储物理表的,一个数据库实例可以有N个表空间,一个表空间下可以有N张表.有了数据库,就可以创建表空间.表空间(tablespace)是数据库 ...

  3. spring基础知识,未完待续

    https://blog.csdn.net/slow_wakler/article/details/54895508   http://www.runoob.com/design-pattern/ch ...

  4. 菜鸟脱壳之脱壳的基础知识(二) ——DUMP的原理

    菜鸟脱壳之脱壳的基础知识(二)——DUMP的原理当外壳的执行完毕后,会跳到原来的程序的入口点,即Entry Point,也可以称作OEP!当一般加密强度不是很大的壳,会在壳的末尾有一个大的跨段,跳向O ...

  5. Oracle基础知识汇总一

    Oracle基础知识 以下内容为本人的学习笔记,如需要转载,请声明原文链接   https://www.cnblogs.com/lyh1024/p/16720759.html oracle工具: SQ ...

  6. 图说Oracle基础知识(一)

    本文主要对Oralce数据库操作的基础知识进行一下梳理,以便进行归纳总结.适用于未使用过Oracle数据库的读者,或需要学习Oracle数据库方面的基础知识.如有不足之处,还请指正. 关于SQL介绍的 ...

  7. java 基础知识二 基本类型与运算符

    java  基础知识二 基本类型与运算符 1.标识符 定义:为类.方法.变量起的名称 由大小写字母.数字.下划线(_)和美元符号($)组成,同时不能以数字开头 2.关键字 java语言保留特殊含义或者 ...

  8. Dapper基础知识二

    在下刚毕业工作,之前实习有用到Dapper?这几天新项目想用上Dapper,在下比较菜鸟,这块只是个人对Dapper的一种总结. 2,如何使用Dapper?     首先Dapper是支持多种数据库的 ...

  9. python基础知识(二)

    python基础知识(二) 字符串格式化 ​ 格式: % 类型 ---- > ' %类型 ' %(数据) %s 字符串 ​ print(' %s is boy'%('tom')) ----> ...

  10. Java基础知识二次学习--第三章 面向对象

    第三章 面向对象   时间:2017年4月24日17:51:37~2017年4月25日13:52:34 章节:03章_01节 03章_02节 视频长度:30:11 + 21:44 内容:面向对象设计思 ...

随机推荐

  1. IOS 被拒 关于 iPhone running iOS 10.3.1 on Wi-Fi connected to an IPv6 network.

    问题: Guideline 2.1 - Performance Thank you for your resubmission. However, we discovered one or more ...

  2. Can't connect to MySQL server on 'localhost' (10061)的解决办法!

    Can't connect to MySQL server on 'localhost' (10061)的解决办法! http://blog.sina.com.cn/s/blog_52ebca1f01 ...

  3. QPushButton 响应回车 设置默认按钮

    ui.pushButton->setFocus(); //设置默认焦点 ui.pushButton->setShortcut( QKeySequence::InsertParagraphS ...

  4. sublime 编译C++

    http://www.yalewoo.com/sublime_text_3_gcc.html 这篇博客很强 完美解决在sublime里写C++无法输入的问题 sublime text 3配置c/c++ ...

  5. zoj 3965 Binary Tree Restoring(搜索)

    Binary Tree Restoring Time Limit: 1 Second      Memory Limit: 65536 KB      Special Judge Given two ...

  6. android中shape的属性

    <shape> <!– 实心 –> <solid android:color=”#ff9d77″/> <!– 渐变 –> <gradient an ...

  7. (转)根据ImageView的大小来压缩Bitmap,避免OOM

    本文转载于:http://www.cnblogs.com/tianzhijiexian/p/4254110.html Bitmap是引起OOM的罪魁祸首之一,当我们从网络上下载图片的时候无法知道网络图 ...

  8. 20165210 Java第一次实验报告

    20165210 第一次实验报告 实验内容 建立目录运行简单的Java程序 建立自己学号的目录 在上个目录下建立src,bin等目录 Javac,Java的执行在学号目录下 IDEA的调试与设置断点 ...

  9. Ajax做无刷新三级联动

    1.引入JS and Jquery包 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...

  10. Codeforces Round #276 (Div. 2)C. Bits(构造法)

    这道题直接去构造答案即可. 对于l的二进制表示,从右到左一位一位的使其变为1,当不能再变了(再变l就大于r了)时,答案就是l. 这种方法既可以保证答案大于等于l且小于等于r,也可以保证二进制表示时的1 ...