PL/SQL高级应用

动态SQL

在PL/SQL中,不能直接执行DDL(create,alter,drop),得使用动态SQL,当然,除了DDL,动态SQL也可以执行DML(select,insert,update,delete)

语法:

EXECUTE IMMEDIATE '动态SQL语句'
[INTO define_variable_list]
[USING bind_argument_list];

例子:

--创建一个表
declare
v_sql string(200);
begin
v_sql := '
create table my_diagrams(
diagram_descr VARCHAR2(40),
diagram_no integer,
)
';
execute immediate v_sql;
end;
/ --动态赋值,插入数据
--后面的数值可以使用变量
execute immediate 'INSERT INTO employee VALUES(:eptno, :ename)' USING 1010,'stars';
--相当于insert into employee(eptno,ename) values(1010,stars) --把查询到的员工编号以及员工姓名赋值给两个变量,使用动态赋值
execute immediate 'select empno,ename from employee where sal=:sal' INTO v_empno,v_ename USING 1010;

目录对象

创建目录对象表示文件系统的某个文件夹,需要sysdba授权:

grant create any directory to scgs;
--语法
create directory SCGS_SQL_DIR
as 'directory_path' drop directory DIR_NAME;--删除目录对象 --创建目录对象
create directory MY_IMG_DIR
as 'Q:\img';

LOB类型(大数据类型)

BLOB

按二进制来存储的,存放图片,文件,音乐

CLOB

直接存储文字的,文章或者是较长的文字

BFILE

一个二进制数据,相当于一个指针,指向某个文件,不属于数据库管理

  • BFILE字段指向的文件不是数据库的一部份,只能在数据库外维护
  • 对BFILE字段操作要使用BFILENAME函数
  • 读取BFILE字段需要使用DBMS_LOB包

存放图片

  1. 用bfilename()函数定位文件
--此方法返回一个bfile对象,第二步需要使用
bfilename($dir_name$,$file_name$)
  1. 以只读方式打开文件:dbms_lob.open()
--mode模式选择dbms_lob包中提供的常量
dbms_lob.open($bfile$,$mode$)
  1. 插入数据,预先用empty_blob()填充字段值,并将该字段关联到blob变量
  2. 调用dbms_lob.loadfromfile(dest_lob, src_lob, amount)函数将bfile对象的数据加载到关联的blob变量
  3. 关闭文件:dbms_lob.close()
declare
src_bfile bfile;
dest_file blob;
v_amount number;
begin
-- 1. 用bfilename()函数定位文件,此函数返回bfile对象(文件定位器)
--oracle10g文件名可以使用中文,oracle11g好像使用中文会出错?
src_bfile := bfilename('GLLG_IMG_DIR','priscilla chan.jpg'); --2.以只读方式打开文件:dbms_lob.open()
dbms_lob.open(src_bfile,dbms_lob.file_readonly); --3. 插入数据,预先用empty_blob()填充字段值,并将该字段关联到blob变量
--diagram是该表中的一个列名
insert into my_diagrams values('永远是你的陈慧娴',1,empty_blob()) returning diagram into dest_file; --4. 调用dbms_lob.loadfromfile(dest_lob, src_lob, amount)函数将bfile对象的数据加载到关联的blob变量
v_amount := dbms_lob.getlength(src_bfile); --得到图片文件的大小
dbms_lob.loadfromfile(dest_file,src_bfile,v_amount); --5. 关闭文件:dbms_lob.close()
dbms_lob.close(src_bfile);
commit;
end;
/

存放文本文件

步骤与上面一样,加载数据的函数参数有些不同,是把bfile文件的数据加载到了clob

declare
src_file bfile;
dest_file clob;
v_amount number;
v_dest_offset number := 1;
v_src_offset number := 1;
v_lang_context number := dbms_lob.default_lang_ctx;
v_warning number;
begin
-- 1. 用bfilename()函数定位文件
src_file := bfilename('GLLG_SQL_DIR','oracle.sql'); --2. 以只读方式打开文件:dbms_lob.open()
dbms_lob.open(src_file,dbms_lob.file_readonly); --3. 插入数据,预先用empty_clob()填充字段值,并将该字段关联到blob变量
insert into my_book values(2,'oracle所有章节',empty_clob()) returning book_file into dest_file; v_amount := dbms_lob.getlength(src_file); --4. 调用 dbms_lob.loadclobfromfile(...有8个参数...)函数将bfile对象的数据加载到关联的blob变量
dbms_lob.loadclobfromfile(dest_lob => dest_file,
src_bfile => src_file,
amount => v_amount,
dest_offset => v_dest_offset,
src_offset => v_src_offset,
bfile_csid => dbms_lob.default_csid,
lang_context => v_lang_context,
warning => v_warning);
-- 检查错误
IF v_warning = DBMS_LOB.WARN_INCONVERTIBLE_CHAR THEN
DBMS_OUTPUT.PUT_LINE('字符转换错误!');
END IF; --5. 关闭文件:dbms_lob.close()
dbms_lob.close(src_file);
commit;
end;
/

oracle学习笔记(十七) PL/SQL高级应用的更多相关文章

  1. Oracle学习笔记之PL/SQL编程

           SQL(Structure Query Language)的含义是结构化查询语句,最早由Boyce和Chambedin在1974年提出,称为SEQUEL语言.1976年,IBM公司的Sa ...

  2. Oracle学习笔记之四,SQL语言入门

    1. SQL语言概述 1.1 SQL语言特点 集合性,SQL可以的高层的数据结构上进行工作,工作时不是单条地处理记录,而对数据进行成组的处理. 统一性,操作任务主要包括:查询数据:插入.修改和删除数据 ...

  3. Oracle学习DaySix(PL/SQL续)

    一.游标 在 PL/SQL 程序中,对于处理多行记录的事务经常使用游标来实现.游标是一个指向上下文的句柄( handle)或指针.通过游标,PL/SQL 可以控制上下文区和处理语句时上 下文区会发生些 ...

  4. Oracle学习DayFive(PL/SQL)

    一.PL/SQL简介  PL/SQL 是 Procedure Language & Structured Query Language 的缩写.PL/SQL 是对 SQL 语言存储过程语言的扩 ...

  5. Oracle学习(十一):PL/SQL

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/v123411739/article/details/30231659 1.知识点:能够对照以下的录屏 ...

  6. Oracle学习(二)SQL高级--表数据相关

    SQL高级语句 top / limit / rownum / percent (前XXX条数据) --top(SQL Server / MS Access) select top 条数 from 表; ...

  7. 吴裕雄--天生自然ORACLE数据库学习笔记:PL/SQL编程

    set serveroutput on declare a ; b ; c number; begin c:=(a+b)/(a-b); dbms_output.put_line(c); excepti ...

  8. Oracle学习笔记(7)——高级查询(1)

    在学习高级查询之前,我们先了解一下怎样查看Oracle数据库中的全部表.由于我们要使用到Oracle数据库中SCOTT用户下的几张表(这些表是Oracle数据库自带的表). 分组查询 分组函数的概念: ...

  9. Oracle学习(四)SQL高级--表优化相关(序列、视图等)

    INDEX(索引) 可以在表中创建索引,以便更加快速高效地查询数据. 用户无法看到索引,它们只能被用来加速搜索/查询. PS:更新一个包含索引的表需要比更新一个没有索引的表花费更多的时间,这是由于索引 ...

  10. Oracle学习笔记_02_基本SQL

    1.select语句 (1)语法 SELECT *|{[DISTINCT] column|expression [alias],...} FROM table; (2)示例: 选择全部列 SELECT ...

随机推荐

  1. C++ std::stack 基本用法

    #include <iostream> #include <string> #include <stack> // https://zh.cppreference. ...

  2. python连接sqlite3

    一.了解sqlite sqlite是一种嵌入式数据库,它的数据库就是一个文件.由于SQLite本身是用C写的,而且体积很小,所以经常被集成到各种应用程序中,甚至在IOS和Android的APP中都可以 ...

  3. 用dotnet core搭建web服务器(三)ORM访问数据库

    访问传统sql数据库,大家以前都是用sql语句去查询.这些年流行orm方法 ORM是对象关系映射的简拼,就是用一个对象(class)去表示数据的一行,用对象的成员去表述数据的列 dotnet 官方很早 ...

  4. form表单中的button自动刷新页面问题

    form表单中如果存在button的话,有可能会出现一个问题:点击button,触发了页面的自动刷新事件. 原因是因为<button>标签默认的类型是submit,即默认的button点击 ...

  5. .NET轻松实现支付宝服务窗网页授权并获取用户相关信息

    前言: 最近在开发一个商业街区的聚合扫码支付功能,其中需要用到的有支付宝,微信两种支付方式,当然对于开发微信支付而已作为自己的老本行已经比较熟悉了,然而对于我来说支付宝支付还是头一次涉及到.这次项目中 ...

  6. spring boot项目记录--日志处理

    微信点餐用到的日志框架:slf4j(门面)+logback(框架) @RunWith(SpringRunner.class) @SpringBootTest @Slf4j public class L ...

  7. Java每日一面(Part1:计算机网络)[19/10/13]

    作者:晨钟暮鼓c个人微信公众号:程序猿的月光宝盒 1.说说TCP三次握手 1.0 在此之前,什么是TCP? ​ TCP(传输控制协议) ​ 1.面向连接的,可靠的,基于字节流的传输层通信协议 ​ 2. ...

  8. C++ 深入浅出工厂模式(进阶篇)

    介绍 前文初始篇C++ 深入浅出工厂模式(初始篇),主要阐述了简单工厂模式.工厂方法模式和抽象工厂模式的结构.特点和缺陷等.以上三种方式,在新增产品时,要么修改工厂类,要么需新增具体的工厂类,说明工厂 ...

  9. 应届生offer指南

    通用技术 1.一般公司对应届生都要考察编程能力,所以应聘之前先刷刷题.我做面试官出的编程题两年没有变过.就是这道

  10. dedecmsV5.7 arclist标签同时取出主表和附表里的数据

    {dede:arclist}{/dede:arclist}标签默认取出来的是主表x_archives中的数据,如果要取出附表中的数据,需要满足两个条件: 指定channelid属性(注意:channe ...