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;

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

  1. 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 只能在包内部使用。

  1. 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;

  1. 注:ref cursorOracle旧版本中使用的数据类型,用这种对象的缺点在于必须在包中定义;而现在用 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. java 实现HTTP连接(HTTPClient)

    在实习中,使用到了http连接,一直理解的很模糊,特地写个分析整理篇.分析不到位的地方请多多指教. Http 目前通用版本为 http 1.1 . Http连接大致分为2种常用的请求——GET,POS ...

  2. Codeforces Round #280 (Div. 2) A , B , C

    A. Vanya and Cubes time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  3. form组件的总结

    1.form组件(******) 局部钩子 全局钩子 ''' 实例化时: self.fields={ "username":"字段规则对象", "pa ...

  4. javascript是一种面向对象语言吗?如果是,您在javascript中是如何实现继承的呢

    ·oop(面向对象程序设计)中最常用到的概念有 1.对象,属性,方法 1>(对象:具体事物或抽象事物,名词) 2>(属性:对象的特征,特点,形容词) 3>(方法:对象的动作,动词) ...

  5. 实例说明Java中的null(转)

    让我们先来看下面的语句: String x = null; 1. 这个语句到底做了些什么?  让我们回顾一下什么是变量,什么是变量值.一个常见的比喻是 变量相当于一个盒子.如同可以使用盒子来储存物品一 ...

  6. JDBC批量插入blob数据

    图片从接口读取后是base64的字符串,所以转成byte数组进行保存. 我们一般保存数据的话,都是基本数据,对于这些图片数据大部分会将图片保存成Blob,Clob等. Blob存储的是二进制对象数据( ...

  7. Centos7+httpd+fastcgi安装提示错误

    搭建的环境: centos7 Apache/2.4.6 fastcgi2.4.6 rails4 在安装fastcgi的时候遇到了问题: 问题: ...... In file included from ...

  8. WPF绑定数据源之RelativeSource

    Command="{Binding ConfirmRegisterCommand}" CommandParameter="{Binding RelativeSource= ...

  9. JAVA实现多线程的四种方式

    JAVA多线程实现方式: 1.继承Thread类(无返回值) 2.实现Runnable接口(无返回值) 3.实现Callable接口,通过FutureTask包装器来创建Threak线程(有返回值) ...

  10. 02-THREE.JS 辅助线使用

    <!DOCTYPE html> <html> <head> <title></title> <script src="htt ...