本地动态 SQL

首先我们应该了解什么是动态 SQL,在 Oracle数据库开发 PL/SQL块中我们使用的 SQL

分为:静态 SQL语句和动态 SQL语句。所谓静态 SQL指在 PL/SQL块中使用的 SQL语句在编

译时是明确的,执行的是确定对象。而动态 SQL是指在 PL/SQL块编译时 SQL语句是不确定

的,如根据用户输入的参数的不同而执行不同的操作。编译程序对动态语句部分不进行处理,

只是在程序运行时动态地创建语句、对语句进行语法分析并执行该语句。

Oracle中动态 SQL可以通过本地动态 SQL来执行,也可以通过 DBMS_SQL包来执行。

下面就这两种情况分别进行说明:

一、本地动态 SQL

本地动态 SQL是使用 EXECUTE IMMEDIATE语句来实现的。

1、本地动态 SQL执行 DDL语句:

需求:根据用户输入的表名及字段名等参数动态建表。

create or replace procedure proc_test

(

table_name in varchar2, --表名

field1 in varchar2, --字段名

datatype1 in varchar2, --字段类型

field2 in varchar2, --字段名

datatype2 in varchar2 --字段类型

) as

str_sql varchar2(500);

begin

str_sql:=’create table ’||table_name||’(’||field1||’ ’||datatype1||’,’

||field2||’ ’||datatype2||’)’;

execute immediate str_sql; --动态执行 DDL语句

exception

when others then

null;

end ;

以上是编译通过的存储过程代码。下面执行存储过程动态建表。

SQL> execute proc_test(’dinya_test’,’id’,’number(8) not null’,’name’,’

varchar2(100)’);

PL/SQL procedure successfully completed

SQL> desc dinya_test;

Name Type Nullable Default Comments

---- ------------- -------- ------- --------

ID NUMBER(8)

NAME VARCHAR2(100) Y

SQL>

到这里,就实现了我们的需求,使用本地动态 SQL根据用户输入的表名及字段名、

字段类型等参数来实现动态执行 DDL语句。

2、本地动态 SQL执行 DML语句。

需求:将用户输入的值插入到上例中建好的 dinya_test表中。

create or replace procedure proc_insert

(

id in number, --输入序号

name in varchar2 --输入姓名

) as

str_sql varchar2(500);

begin

str_sql:=’insert into dinya_test values(:1,:2)’;

execute immediate str_sql
using id,name; --动态执行插入操作

exception

when others then

null;

end ;

执行存储过程,插入数据到测试表中。

SQL> execute proc_insert(1,’dinya’);

PL/SQL procedure successfully completed

SQL> select * from dinya_test;

ID NAME

1 dinya

在上例中,本地动态 SQL执行 DML语句时使用了 using子句,按顺序将输入的值绑

定到变量,如果需要输出参数,可以在执行动态 SQL的时候,使用 RETURNING INTO 子句,

如:

declare

p_id number:=1;

v_count number;

begin

v_string:=’select count(*) from table_name a where a.id=:id’;

execute immediate v_string
into v_count using p_id;

end ;

更多的关于动态 SQL中关于返回值及为输出输入绑定变量执行参数模式的问题,请

读者自行做测试。

二、使用 DBMS_SQL

使用 DBMS_SQL包实现动态 SQL的步骤如下:A、先将要执行的 SQL语句或一个语句

块放到一个字符串变量中。B、使用 DBMS_SQL包的 parse过程来分析该字符串。C、使用

DBMS_SQL包的 bind_variable过程来绑定变量。D、使用 DBMS_SQL包的 execute函数来执

行语句。

1、使用 DBMS_SQL包执行 DDL语句

需求:使用 DBMS_SQL包根据用户输入的表名、字段名及字段类型建表。

create or replace procedure proc_dbms_sql

(

table_name in varchar2, --表名

field_name1 in varchar2, --字段名

datatype1 in varchar2, --字段类型

field_name2 in varchar2, --字段名

datatype2 in varchar2 --字段类型

)as

v_cursor number; --定义光标

v_string varchar2(200); --定义字符串变量

v_row number; --行数

begin

v_cursor:=dbms_sql.open_cursor; --为处理打开光标

v_string:= ’ create table ’ ||table_name|| ’ ( ’ ||field_name1|| ’ ’

||datatype1||’,’||field_name2||’ ’||datatype2||’)’;

dbms_sql.parse(v_cursor,v_string,dbms_sql.native); --分析语句

v_row:=dbms_sql.execute(v_cursor); --执行语句

dbms_sql.close_cursor(v_cursor); --关闭光标

exception

when others then

dbms_sql.close_cursor(v_cursor); --关闭光标

raise;

end;

以上过程编译通过后,执行过程创建表结构:

SQL> execute proc_dbms_sql(’dinya_test2’,’id’,’number(8) not null’,’

name’,’varchar2(100)’);

PL/SQL procedure successfully completed

SQL> desc dinya_test2;

Name Type Nullable Default
Comments

---- ------------- -------- -------
--------

ID NUMBER(8)

NAME VARCHAR2(100) Y

SQL>

2、使用 DBMS_SQL包执行 DML语句

需求:使用 DBMS_SQL包根据用户输入的值更新表中相对应的记录。

查看表中已有记录:

SQL> select * from dinya_test2;

ID NAME

1 Oracle

2 CSDN

3 ERP

SQL>

建存储过程,并编译通过:

create or replace procedure proc_dbms_sql_update

(

id number,

name varchar2

)as

v_cursor number; --定义光标

v_string varchar2(200); --字符串变量

v_row number; --行数

begin

v_cursor:=dbms_sql.open_cursor; --为处理打开光标

v_string:=’update dinya_test2 a set a.name=:p_name where a.id=:p_id’;

dbms_sql.parse(v_cursor,v_string,dbms_sql.native); --分析语句

dbms_sql.bind_variable(v_cursor,’:p_name’,name); --绑定变量

dbms_sql.bind_variable(v_cursor,’:p_id’,id); --绑定变量

v_row:=dbms_sql.execute(v_cursor); --执行动态SQL

dbms_sql.close_cursor(v_cursor); --关闭光标

exception

when others then

dbms_sql.close_cursor(v_cursor); --关闭光标

raise;

end;

执行过程,根据用户输入的参数更新表中的数据:

SQL> execute proc_dbms_sql_update(2,’csdn_dinya’);

PL/SQL procedure successfully completed

SQL> select * from dinya_test2;

ID NAME

1 Oracle

2 csdn_dinya

3 ERP

SQL>

执行过程后将第二条的 name字段的数据更新为新值 csdn_dinya。这样就完成了使用

dbms_sql包来执行 DML语句的功能。

使用 DBMS_SQL中,如果要执行的动态语句不是查询语句,使用 DBMS_SQL.Execute或

DBMS_SQL.Variable_Value来执行,如果要执行动态语句是查询语句,则要使用

DBMS_SQL.define_column定义输出变量,然后使用 DBMS_SQL.Execute,

DBMS_SQL.Fetch_Rows, DBMS_SQL.Column_Value及 DBMS_SQL.Variable_Value来执行查询

并得到结果。

Oracle本地动态 SQL的更多相关文章

  1. Oracle中动态SQL详解(EXECUTE IMMEDIATE)

    Oracle中动态SQL详解(EXECUTE IMMEDIATE) 2017年05月02日 18:35:48 悠悠倾我心 阅读数:744 标签: oracle动态sqloracle 更多 个人分类:  ...

  2. oracle 存储过程 动态sql语句

    一.在oracle项目开发中越到问题: 在利用ODP向oracle中插入数据时,如果这样写:   insert into clobTable (id, story) values(1,'....'); ...

  3. oracle中动态SQL详解

    部分内容参考网上资料 1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情 ...

  4. oracle中动态SQL使用详细介绍

    Oracle编译PL/SQL程序块分为两个种:通常静态SQL采用前一种编译方式,而动态SQL采用后一种编译方式,需要了解的朋友可以参考下     1.静态SQLSQL与动态SQL Oracle编译PL ...

  5. 本地动态SQL

    (转自:http://blog.itpub.net/26622598/viewspace-718134) 一.什么是动态SQL 大多数PL/SQL都做着一件特殊的结果可预知的工作.例如,一个存储过程可 ...

  6. (转)Oracle中动态SQL详解

    本文转载自:http://www.cnblogs.com/gaolonglong/archive/2011/05/31/2064790.html 1.静态SQLSQL与动态SQL Oracle编译PL ...

  7. [转载]Oracle中动态SQL详解

    1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型:另外一 ...

  8. Oracle基础 动态SQL语句

    一.静态SQL和动态SQL的概念. 1.静态SQL 静态SQL是我们常用的使用SQL语句的方式,就是编写PL/SQL时,SQL语句已经编写好了.因为静态SQL是在编写程序时就确定了,我们只能使用SQL ...

  9. Oracle的动态SQL

    例1:传递表名,和Where条件删除数据 CREATE OR REPLACE PROCEDURE raise_emp_salary (column_value NUMBER, emp_column V ...

随机推荐

  1. php进一法取整、四舍五入取整、忽略小数等的取整数方法大全

    PHP取整数函数常用的四种方法,下面收集了四个函数:经常用到取整的函数,今天小小的总结一下!其实很简单,就是几个函数而已--主要是:ceil,floor,round,intval PHP取整数函数常用 ...

  2. AIX下RAC搭建 Oracle10G(五)安装oracle、建立监听

    AIX下RAC搭建系列 AIX下RAC搭建 Oracle10G(五)安装oracle.建立监听 环境 节点 节点1 节点2 小机型号 IBM P-series 630 IBM P-series 630 ...

  3. Android 常用Shell命令

    1.查询模拟器/设备实例 adb devices 2.从模拟器/设备中拷入或拷出文件(默认拷贝在执行目录) 从模拟器或者设备中复制文件或目录,使用(如下命): adb pull <remote& ...

  4. POJ 1927 Area in Triangle(计算几何)

    Area in Triangle 博客原文地址:http://blog.csdn.net/xuechelingxiao/article/details/40707691 题目大意: 给你一个三角形的三 ...

  5. Linux服务基础命令

    ---恢复内容开始--- 1简介: Linux的网络功能相当强悍,一时之间我们无法了解所有的文阿罗命令,在配置服务器基础环境时,先了解下网络参数设定命令. ifconfig     查询,设置网卡和i ...

  6. 全局Timestamp管理器 检测js执行时间

    随手写了个小工具,主要为了测试不同混淆程度的javascript脚本的加载速度1. [代码]Timestamp.js (function() { if (typeof this.Timestamp = ...

  7. python库学习笔记——爬虫常用的BeautifulSoup的介绍

    1. 开启Beautiful Soup 之旅 在这里先分享官方文档链接,不过内容是有些多,也不够条理,在此本文章做一下整理方便大家参考. 官方文档 2. 创建 Beautiful Soup 对象 首先 ...

  8. ML.NET

    ML.NET http://www.cnblogs.com/BeanHsiang/category/1218714.html 随笔分类 - 使用ML.NET实现NBA得分预测 摘要: 本文将介绍一种特 ...

  9. AutoIT: 对数据库的访问,数据提取操作

    #include<array.au3> $conn= ObjCreate("ADODB.Connection") $RS= ObjCreate("ADODB. ...

  10. 01_创建一个新的activity&activity配置清单文件

    今天开始学四大组件.今天是学Activity,然后是广播接收者,然后是服务,然后是内容提供者.四大组件,咱们一天一个.Activity就是跟用户交互的界面,大部分的应用都不会只有这么一个界面.创建多个 ...