`

PL/SQL动态SQL用法

阅读更多

(好久以前根据网上的一篇文章修改的,不记得原文网址了。)

本文介绍了PL/SQL开发EXECUTE IMMEDIATE 和 DBMS_SQL两种动态SQL的用法。

以下为完整的package,可以直接拷贝到plsql中进行测试。

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

create or replace package SUNJC_TEST is
/*
* 动态SQL
* 在Oracle开发过程中,可以使用动态SQL来执行DDL语句、DML语句、事务控制语句及系统控制语句。
*/

/***************************************
* 使用EXECUTE IMMEDIATE动态SQL--DDL建表
***************************************/
procedure proc_test(table_name in varchar2, --表名
field1 in varchar2, --字段名
datatype1 in varchar2, --字段类型
field2 in varchar2, --字段名
datatype2 in varchar2 --字段类型
);

/***************************************
* 使用EXECUTE IMMEDIATE动态SQL--DDL建表
***************************************/
procedure proc_insert(p_id in number, --输入序号
p_name in varchar2 --输入姓名
);

/*************************************
* 使用DBMS_SQL包实现动态SQL--DDL建表
*************************************/
procedure proc_dbms_sql(table_name in varchar2, --表名
field_name1 in varchar2, --字段名
datatype1 in varchar2, --字段类型
field_name2 in varchar2, --字段名
datatype2 in varchar2 --字段类型
);

/***********************************
* 使用dbms_sql动态SQL,执行数据更新
************************************/
procedure proc_dbms_sql_update(p_id number, p_name varchar2);

/************************************
* 使用dbms_sql动态SQL,执行数据查询
************************************/
procedure proc_dbms_sql_query(p_id in varchar2);

end SUNJC_TEST;
/
create or replace package body SUNJC_TEST is

/***************************************
* 使用EXECUTE IMMEDIATE动态SQL--DDL建表
***************************************/
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
begin
str_sql := 'create table ' || table_name || '(' || field1 || ' ' ||
datatype1 || ',' || field2 || ' ' || datatype2 || ') ';
dbms_output.put_line(str_sql);
execute immediate str_sql; --动态执行DDL语句
exception
when others then
dbms_output.put_line(sqlerrm);
end;
end proc_test;

/***************************************
* 使用EXECUTE IMMEDIATE动态SQL--insert
***************************************/
procedure proc_insert(p_id in number, --输入序号
p_name in varchar2 --输入姓名
) as
str_sql varchar2(500);
v_count integer;
begin
str_sql := 'insert into dinya_test values(:1, :2)';
execute immediate str_sql
using p_id, p_name; --动态执行插入操作

str_sql := 'select count(*) from dinya_test a where a.id=:id and a.name=:name';
execute immediate str_sql
into v_count
using p_id, p_name;

dbms_output.put_line(v_count);

exception
when others then
null;
end proc_insert;

/****************************************************
* 使用DBMS_SQL包实现动态SQL--DDL建表
*A、先将要执行的SQL语句或一个语句块放到一个字符串变量中
*B、使用DBMS_SQL包的parse过程来分析该字符串
*C、使用DBMS_SQL包的bind_variable过程来绑定变量
*D、使用DBMS_SQL包的execute函数来执行语句
*****************************************************/
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 || ' ' || chr(10) || '(' ||
field_name1 || ' ' || datatype1 || ',' || chr(10) ||
field_name2 || ' ' || datatype2 || ') ';

dbms_output.put_line(v_string);

dbms_sql.parse(v_cursor, v_string, dbms_sql.native); --分析语句
v_row := dbms_sql.execute(v_cursor); --执行语句
dbms_output.put_line(v_row);
dbms_sql.close_cursor(v_cursor); --关闭游标
exception
when others then
dbms_sql.close_cursor(v_cursor); --关闭游标
raise;
end proc_dbms_sql;
/*
注意:
PL/SQL块中使用动态SQL执行DDL语句的时候与别的不同,
在DDL中使用绑定变量是非法的(bind_variable(v_cursor,’:p_name’,name)),
分析后不需要执行DBMS_SQL.Bind_Variable,直接将输入的变量加到字符串中即可。
另外,DDL是在调用DBMS_SQL.PARSE时执行的,所以DBMS_SQL.EXECUTE也可以不用,
即在上例中的v_row:=dbms_sql.execute(v_cursor)部分可以不要
*/

/***********************************
* 使用dbms_sql动态SQL,执行数据更新
***********************************/
procedure proc_dbms_sql_update(p_id number, p_name varchar2) as
v_cursor number; --定义游标
v_string varchar2(200); --字符串变量
v_row number; --行数
begin
v_cursor := dbms_sql.open_cursor; --打开游标
v_string := 'update dinya_test 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', p_name); --绑定变量
dbms_sql.bind_variable(v_cursor, ':p_id', p_id); --绑定变量

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

dbms_output.put_line(v_row);

dbms_sql.close_cursor(v_cursor); --关闭游标
exception
when others then
dbms_sql.close_cursor(v_cursor); --关闭游标
raise;
end proc_dbms_sql_update;

/************************************
* 使用dbms_sql动态SQL,执行数据查询
************************************/
procedure proc_dbms_sql_query(p_id in varchar2) as
v_cursor number; --定义游标
v_string varchar(200); --字符串变量
v_row number; --行数
v_id number;
v_name varchar(100);

begin
v_string := 'select id,name from dinya_test where id > :p_id';
v_cursor := dbms_sql.open_cursor; --打开游标
dbms_sql.parse(v_cursor, v_string, dbms_sql.native); --解析动态sql语句
dbms_sql.bind_variable(v_cursor, ':p_id', p_id); --绑定输入参数

--定义需要输出的变量(游标Id,顺序号,变量名称,变量长度)
dbms_sql.define_column(v_cursor, 1, v_id);
dbms_sql.define_column(v_cursor, 2, v_name, 100);

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

loop
exit when dbms_sql.fetch_rows(v_cursor) > 0; --在结果集中移动游标,如果未抵达末尾,返回1

dbms_sql.column_value(v_cursor, 1, v_id); --将当前行的查询结果写入上面定义的列中
dbms_sql.column_value(v_cursor, 2, v_name);

dbms_output.put_line(v_id || '-' || v_name); --输出结果
end loop;

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

exception
when others then
dbms_sql.close_cursor(v_cursor); --关闭游标
raise;
end proc_dbms_sql_query;

end SUNJC_TEST;
/


分享到:
评论

相关推荐

    pl/sql例题代码pl/sql例题代码pl/sql例题代码

    2. **数据类型**:PL/SQL有多种内置数据类型,如NUMBER、VARCHAR2、DATE等,理解这些数据类型及其用法是基础。 3. **流程控制**:包括IF-THEN-ELSE语句用于条件判断,CASE表达式提供更灵活的条件分支,以及FOR循环...

    oracle 9i pl/sql程序设计笔记

    ### Oracle 9i PL/SQL程序设计笔记精要 ...掌握PL/SQL的不同块类型及其使用方法对于开发高效、可靠的数据库应用程序至关重要。此外,熟悉存储过程和触发器的创建与使用,将有助于提升应用程序的性能和数据安全性。

    Oracle PL/SQL程序设计(第5版)(上下册)

    - **游标**:介绍游标的使用方法,包括隐式游标和显式游标,以及如何利用游标遍历查询结果。 #### 四、PL/SQL中的SQL - **SQL语句的执行**:介绍如何在PL/SQL代码中嵌入SQL语句,包括查询、插入、更新和删除操作。...

    pl/sql快捷插件

    需要注意的是,不同的插件可能提供不同的功能和特性,因此在安装前最好了解其具体作用和使用方法,以便充分利用。此外,保持PL/SQL Developer和插件的版本兼容性也非常重要,否则可能会出现无法正常运行或功能受限的...

    Oracle PL/SQL程序设计(第5版)(套装上下册)

    从PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、PL/SQL中的SQL、PL/SQL应用构建、高级PL/SQL主题这6个方面详细系统地讨论了PL/SQL以及如何有效地使用它。《Oracle PL/SQL程序设计(第5版)(套装上下册)》能够帮助...

    PL/SQL开发文档1

    文档中介绍了IN、OUT和INOUT三种参数模式,以及它们的使用方法和示例。 6. 在PL/SQL中,调用过程是一个基本操作,文档中介绍了如何使用SQL Developer来调用过程,并说明了过程调用的语法和可能的执行结果。 7. ...

    oracle 经典资料及PL/SQL 使用指南 英文版

    2. 动态SQL:在PL/SQL中,可以使用动态SQL来构建和执行在运行时才确定的SQL语句,这在处理复杂查询或需要动态构建SQL的情况中很有用。 3.游标:游标允许程序逐行处理查询结果,是处理大量数据时的重要工具。 4. ...

    oracle 中 pl/sql 只是学习方法

    对于初学者,理解并熟练掌握PL/SQL的各项特性和用法至关重要。通过实践和编写小示例,可以逐步提升对PL/SQL的掌控能力。同时,深入学习Oracle数据库的其他功能,如索引优化、性能分析等,将使你在数据库开发和管理...

    Oracle PL/SQL 实例精解(第4版涵盖Oracle 11g)+源码脚本

    3. **过程与函数**:PL/SQL允许用户创建自己的过程和函数,它们可以在数据库中存储并重复使用。这些过程和函数可以接受参数,进行复杂的计算,甚至与其他数据库对象交互。 4. **游标**:游标是PL/SQL中处理单行或...

    Oracle PL/SQL程序设计(第5版)(下册)第二部分

    《Oracle PL/SQL程序设计(第5版)》基于Oracle数据库11g,从PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、PL/SQL中的SQL、PL/SQL应用构建、高级PL/SQL主题这6个方面详细系统地讨论了PL/SQL以及如何有效地使用它。...

    Web pl/sql报表制作过程

    Web PL/SQL报表制作过程是一种将数据库数据转化为用户友好、可编辑的HTML报表的方法,它结合了HTML语言和PL/SQL编程,使得开发者能够创建直观且实用的在线报表。以下是对这一过程的详细说明: 1. **制作报表模板**...

    ORACLE PL/SQL从入门到精通

    最后,还有关于字符串、数值、日期等数据类型的函数介绍,以及SELECT语句的不同使用方法,如合并查询、SELECT INTO、删除、修改、用户管理、添加数据、设置保存点和事务处理等。 这本书籍将为读者提供一个全面、...

    Oracle数据库实用教程第三章 PL/SQL程序设计.pptx

    异常处理是 PL/SQL 中的一种错误处理机制,PL/SQL 提供了多种异常处理方法,包括预定义异常、用户定义异常、异常处理部分等。 本章节为读者提供了 PL/SQL 程序设计的基础知识,帮助读者了解 PL/SQL 的优点、运行...

    oracle pl/sql fundamentals

    8. **动态SQL**:了解如何在PL/SQL中构建和执行动态SQL语句,以适应不断变化的查询需求。 9. **事务管理**:学习如何控制事务的开始、提交和回滚,以及理解并发控制的重要性。 10. **性能优化**:初步接触PL/SQL的...

    Oracle PL SQL程序设计 上 第五版(代码示例)

    《oracle pl/sql程序设计(第5版)》基于oracle数据库11g,从pl/sql编程、pl/sql程序结构、pl/sql程序数据、pl/sql中的sql、pl/sql应用构建、高级pl/sql主题6个方面详细系统地讨论了pl/sql以及如何有效地使用它。...

    PL/SQL 核心基础代码

    在"PL_sql.exe"这个压缩包文件中,可能包含了上述各个知识点的示例代码,学习者可以通过运行和分析这些代码,深入理解PL/SQL的核心概念和用法。实践是学习编程的最好方式,通过这个资源,你可以逐步熟悉并精通PL/SQL...

    PL/SQL语法帮助

    本压缩包"PL/SQL语法帮助"是专为初学者设计的指南,包含Sqlhelp.hlp和Plshelp.hlp两个帮助文件,旨在帮助新手快速掌握PL/SQL的基本概念和用法。 首先,让我们深入了解一下PL/SQL的主要组成部分: 1. **声明部分**...

    Oracle PL/SQL programming(5th Edition)

    - **第16章**:PL/Scope工具的使用方法。 - **第17章**:PL/SQL层级配置器的使用技巧。 - **第18章**:SecureFiles技术的深入探讨。 #### 六、附加资源 - **配套网站**:本书还提供了配套的网站,其中包含了额外...

    PL/SQL使用说明书(完整版)

    这份“PL/SQL使用说明书(完整版)”会详细讲解这些概念,并通过实例解析其用法,帮助读者理解和掌握PL/SQL编程,无论是初学者还是经验丰富的开发者,都能从中受益。阅读并实践这份说明书,将有助于提升在Oracle...

    PL/SQL ExcelDocumentType

    标题中的“PL/SQL ExcelDocumentType”提示我们讨论的主题与Oracle数据库中的PL/SQL编程语言有关,特别是...这篇博客可能提供了详细的代码示例和使用方法,帮助开发者高效地处理Excel与Oracle数据库之间的数据交换。

Global site tag (gtag.js) - Google Analytics