`
fw2003
  • 浏览: 80177 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

个人对ORACLE本地动态SQL的总结

阅读更多
 一般的PL/SQL程序设计中,在DML和事务控制的语句中可以直接使用SQL,但是DDL语句及系统控制语句却不能在PL/SQL中直接使用。也就是说要想在PL/SQL的begin和end之间直接使用类似于“select * from fw.math where n1=2”这样的语句是不行的,会抱错“在select语句中缺少into子句”。更加不能用DDL语句例如创建一个类型为表的对象"create table ss(s int)"。那么,要想实现在PL/SQL中使用DDL语句及系统控制语句,可以通过使用动态SQL来实现。
    在Oracle数据库开发PL/SQL块中我们使用的SQL分为:静态SQL语句和动态SQL语句。所谓静态SQL指
在PL/SQL块中使用的SQL语句在编译时是明确的,执行的是确定对象。而动态SQL是指在PL/SQL块编译时SQL语句是不确定的,如根据用户输入的参数的不同而执行不同的操作。编译程序对动态语句部分不进行处理,只是在程序运行时动态地创建语句、对语句进行语法分析并执行该语句。
     接下来用几个例子来说明本地动态SQL的用法。
     首先,我们可以动态地根据用户的输入来创建一张表,假设表里有2个字段。那么,我现在创建一个带输入参数也就是IN类型的过程:
create or replace procedure
  create_table(table_name in varchar2,column_name1 in varchar2,data_type1 in varchar2,
column_name2 in varchar2,data_type2 in varchar2)
is
sql_stmt varchar2(255);
begin
  sql_stmt := 'create table '||table_name||'('||column_name1||' '||data_type1||','||
  column_name2||' '||data_type2||')';
  execute immediate sql_stmt;
  dbms_output.put_line('名称为'||table_name||'的表已经成功创建');
  exception when others
  then dbms_output.put_line(sqlerrm);
end;
这里的sql_stmt也就是一句拼装而成的动态SQL语句

之后,我在PL/SQL里调用这个过程来动态地创建表:
declare
  table_name  varchar2(200);
  column_name1 varchar2(200);
  data_type1 varchar2(200);
  data_type2 varchar2(200);
  column_name2 varchar2(200);
begin
  table_name := '&请输入表名';
  column_name1 := '&请输入第1列的列名';
  data_type1 := '&请输入第1列的类型';
  column_name2 := '&请输入第2列的列名';
  data_type2 := '&请输入第2列的类型';
  fw.create_table(table_name,column_name1,data_type1,column_name2,data_type2);
end;

这里注意可能会产生“权限不足的异常”,我上网查了下原因是:如果在一个匿名块或者过程中通过动态SQL来执行DDL语句需要直接把CREATE TABLE之类的权限直接赋给该用户,通过角色赋的权限会失效,即可能出现“权限不足”的异常。

那么,最好执行“grant create table to fw”给予权限。


  上面的例子中,动态SQL是接受了过程的输入参数,同样的,它也可以接收绑定到某个被声明了的变量的值。
那么再看一个例子:
   我的需求是根据用户的输入动态地向表里插入一条记录
  表名是math,模式是fw,表的结构如下:
名称                                      是否为空? 类型
----------------------------------------- -------- -------------
N1                                                 NUMBER(38)
N2                                                 NUMBER(38)
MAX                                               NUMBER(38)
  
  首先还是创建一个过程:
create or replace procedure
  insert_into_math(n1_input fw.math.n1%type,n2_input fw.math.n2%type,max_input fw.math.max%type)
is
  sql_stmt varchar2(255);
begin
  sql_stmt := 'insert into fw.math values(:n1,:n2,:max)';
  execute immediate sql_stmt using n1_input,n2_input,max_input;
  commit;
  dbms_output.put_line('插入成功');
  exception when others then
  dbms_output.put_line(sqlerrm);
end;  

  在动态SQL“'insert into fw.math values(:n1,:n2,:max)”中:n1,:n2,:,max都是形式为:xxx的占位符,和Hibernate的HQL里的:xxx是一样的,XXX的实质也就是一个绑定变量,因此在引用的时候要在之前加:。而using xxx的xxx代表这些动态的参数要接收名为xxx的变量的值。其实这里也就相当于JDBC里的预编译SQL“insert into fw.math values(?,?,?)”。

  接下来,我在PL/SQL里调用上面这个过程:
declare
  n1_input fw.math.n1%type;
  n2_input fw.math.n2%type;
  max_input fw.math.max%type;
begin
  n1_input := '&请输入n1的值';
  n2_input := '&请输入n2的值';
  max_input := '&请输入max的值';
  fw.insert_into_math(n1_input,n2_input,max_input);
end;
  

     同样的,动态SQL不仅能接受输入参数,也能用“into XXX”将执行后返回的结果交给一个名为XXX的变量作为输出参数保存。
例如:
declare
    n1_input fw.math.n1%type;
    count_output number;
    sql_stmt varchar2(255);
begin
    n1_input := '&请输入n1的值';
    sql_stmt:='select count(*) from fw.math  where n1=:n1';
    execute immediate sql_stmt into count_output using n1_input;  
    dbms_output.put_line('根据n1='||n1_input||'找到的记录有'||count_output||'条');
    exception when others then
    dbms_output.put_line(sqlerrm);
end;

      

    以上就是ORACLE中本地动态SQL的基本用法,另外还有一种形式的动态SQL是通过PL/SQL的内置包DBMS_SQL的一些过程和函数通过操作游标来进行的,这里就不再多说。   
分享到:
评论

相关推荐

    ORACLE10gSqlTunning.pdf

    通过对上述内容的学习,我们了解到在ORACLE 10G环境下进行SQL调优的重要性,以及如何通过各种技术和工具来优化SQL性能。这些知识点不仅有助于提升个人的技术能力,也能帮助企业提高数据库的整体性能和稳定性。 总之...

    【Oracle原厂培训资料】数据库Oracle 11g Administration Workshop II_3.pdf

    版权由Oracle公司及其关联方所有,未经正式许可,任何个人或机构不得对本资料进行复制、分发或任何形式的传播。此外,该文档明确规定仅可被用于Oracle培训课程中,并且不得进行任何形式的修改。 #### 培训目标 此份...

    oracle入门到精通,好教材,不容错过

    ### Oracle入门到精通关键知识点详解 #### 一、Oracle认证及与其他数据库的比较 ...以上就是关于Oracle的基础知识点总结,希望对你学习Oracle有所帮助。在实际工作中,建议结合具体的应用场景进行深入学习和实践。

    sqlplus 11.2 安装包oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm

    总结来说,"sqlplus 11.2 安装包 oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm"是一个专为64位Linux系统设计的Oracle Instant Client Basic组件,包含了SQL*Plus工具,便于用户在不完整安装Oracle数据库...

    Oracle数据库Web开发工具指南

    APEX不仅易于上手,而且随着开发者对其深入了解,会发现其中包含了许多强大的特性,如动态页面、数据绑定等,这些特性可以显著提升开发效率。对于初学者来说,APEX是一个很好的起点,而对于经验丰富的开发者来说,...

    PL/SQL Developer 7.0

    **PL/SQL Developer** 是一款专为 Oracle 数据库设计的强大集成开发环境(IDE),它旨在简化和提升 PL/SQL 应用程序的开发效率。版本 7.0 作为该系列中的一个重要迭代,引入了许多新功能和改进,旨在提高开发者的...

    Qt操作Oracle解决汉字乱码方案

    在Qt源码中,与Oracle驱动相关的部分通常位于`qt/src/sql/drivers/oci/qsql_oci.cpp`文件中。在该文件的第40行左右,可能存在以下注释代码: ```cpp //uncomment this if you have problems with oracle ...

    数据库课件:第2章Oracle数据库管理与开发工具介绍.ppt

    总结,Oracle数据库的管理与开发工具提供了全面的解决方案,从图形化的Oracle企业管理器到轻量级的SQL Plus,都有各自独特的优点和应用场景。理解并熟练使用这些工具,将极大地提高数据库管理员的工作效率,确保...

    Oracle创建表空间.创建用户.创建表

    在Oracle数据库中创建用户是为了让不同的应用程序和个人能够安全地访问数据库资源。创建用户时,我们需要定义用户的登录密码、默认表空间、临时表空间等信息。 ##### 示例 ```sql CREATE USER sidney IDENTIFIED BY...

    Oracle数据库结课论文

    ### Oracle数据库结课论文知识点梳理 #### 一、系统开发目的 - **背景与目标**:本文档描述了一个针对“九州通工作室”的人员信息管理及签到系统的开发目的。该工作室希望通过这一系统更好地掌握成员的基本信息(如...

    SQL访问Excel电子表格的方法

    链接服务器是一种使SQL Server能够访问其他数据源的技术,例如另一个SQL Server实例、Oracle数据库或文本文件等。这里我们将介绍如何通过链接服务器技术来访问Excel文件。 ##### 创建链接服务器 首先,我们需要...

    Oracle与excel的互换.docx

    学习Oracle不仅能够帮助提升个人技能,还能为企业带来更大的价值。 ##### 5.2 数据库基础 - **主键生成**: Oracle数据库支持多种主键生成策略,例如使用`DBMS_RANDOM.VALUE`结合序列来生成唯一的主键值。 - **...

    PLSQL Developer用户指南.pdf

    总结以上知识点,PL/SQL Developer用户指南详细介绍了该工具的安装、数据库连接、程序编写、测试、性能优化、SQL操作、命令执行、非PL/SQL对象管理、图表制作、工程管理、任务项目处理以及用户界面定制等功能。...

    Oracle9i安装.pdf

    安装完成后,可以通过启动SQL*Plus或其他Oracle提供的工具来验证数据库是否安装成功。此外,还可以通过检查服务是否正常启动等方式来进一步确认。 #### 三、总结 通过上述步骤,可以顺利完成Oracle9i数据库的安装...

    PL/SQL Developer中文使用手册

    ### PL/SQL Developer 7.0 使用手册关键知识点解析 #### 一、介绍 ...通过上述对各个章节的总结,我们可以看到这款工具覆盖了从基本的编程到高级的性能调优等多个方面,是 Oracle 开发者不可或缺的一款利器。

    基于SQL的开发动静态数据库维护.pdf

    此外,还需要在专业人员的个人机器上配置ODBC到Oracle的连接,以建立远程视图访问。 知识点六:技术实现 文章提及了勘探开发数据提供系统,这是一个基于B/S架构的查询系统,具备GIS功能。其底层数据库为勘探开发...

    it个人年度工作总结.doc

    - **多类型数据库**:不仅使用了SQL Server(如SQL Server的本地主机LocalHOST),还接触了Oracle和Access数据库,扩大了数据库技术的覆盖范围。 3. **团队协作**: - **务实精神**:团队成员全心投入工作,不...

    DB_LINK的个人理解

    1. **Private DB_Link**:这类链接只对创建它的用户可见和可用。这意味着只有创建者才能够通过此链接访问远程数据库。 2. **Public DB_Link**:与Private DB_Link不同,公共链接可供所有数据库用户使用。创建公共DB_...

Global site tag (gtag.js) - Google Analytics