iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Oracle中执行动态SQL
  • 823
分享到

Oracle中执行动态SQL

2024-04-02 19:04:59 823人浏览 独家记忆
摘要

一、概述 在一般的sql操作中,sql语句基本上都是固定的,如: SELECT t.empno,t.ename FROM scott.emp t WHERE

一、概述

在一般的sql操作中,sql语句基本上都是固定的,如: 
SELECT t.empno,t.ename FROM scott.emp t WHERE t.deptno = 20; 
但有的时候,从应用的需要或程序的编写出发,都可能需要用到动态SQl,如: 
当 from 后的表 不确定时,或者where 后的条件不确定时,都需要用到动态SQL。

使用execute immediate语句可以处理包括ddl(create、alter和drop)、DCL(grant、revoke)、DML(insert、update、delete)以及单行select语句。

execute immediate语句:

execute immediate dynamic_string
      [into {define_variable[,define_variable]…|record}]
      [using [in|out|in out] bind_argument[,[in|out|in out]bind_argument]…]
      [{returning|return} into bind_argument[, bind_argument]…]
  • define_variable用于指定存放单行查询结果的变量;
  • using in bind_argument用于指定存放传递给动态sql值的变量,即在dynamic中存在占位符时使用;
  • using out bind_argument用于指定存放动态sql返回值的变量。

二、执行ddl、dcl语句

不能使用into和using子句。

begin

execute immediate 'create table ma_org(org_codevarchar2(20),org_name varchar2(254))';
execute immediate 'drop table ma_org';
end;

语句

begin
       execute immediate 'grant insert on ma_org to scott'
end;

三、处理dml语句

1、给动态语句传值(USING 子句)

如果dml语句包含占位符,那么在execute immediate语句之后必须要带有using子句;

declare
         orGCode varchar2(10);
         orgname varchar2(254);
    begin
         orgcode := 1200;
         execute immediate 'select org_name fromma_org 
         where org_code = :X'
         into orgname
         using orgcode; 
         dbms_output.put_line(orgname);
    end;

2、从动态语句检索值(INTO子句)

image

3、动态调用存储过程

declare
  l_routin   varchar2(100) := 'gen2161.get_rowcnt';
  l_tblnam   varchar2(20) := 'emp';
  l_cnt      number;
  l_status   varchar2(200);
begin
  execute immediate 'begin ' || l_routin || '(:2, :3, :4); end;'
  using in l_tblnam, out l_cnt, in out l_status;

  if l_status != 'OK' then
     dbms_output.put_line('error');
  end if;
end;

4、处理包含returing子句的DML语句

如果dml语句带有returning子句,那么在execute immediate语句之后必须带有returning into子句,并且此时只能处理作用的单行上的dml语句,如果dml语句作用在多行上,则必须使用bulk子句。

declare
         orgcode varchar2(10);
         orgname varchar2(254);
         rname varchar2(254);
    begin
         orgcode := '1200';
         orgname := '天津市分行';
         execute immediate 'update ma_org set org_name=:X 
         where org_code = :Y returning org_name into :rname'
         using orgname, orgcode
         returning into rname; 
         dbms_output.put_line(orgname);
    end;

5、在retuing into中使用bulk collect into

image

四、处理多行查询

oracle通过使用bulk collect into子句处理动态sql中的多行查询可以加快处理速度,从而提高应用程序的性能。当使用bulk子句时,集合类型可以是plsql所支持的索引表、嵌套表和varray,但集合元素必须使用sql数据类型。在oracle9i以后,有三种语句支持bulk子句,execute immediate,fetch和forall。

1、使用动态游标(游标变量)处理多行查询类动态sql语句。

DECLARE
    TYPE ref_cur IS REF CURSOR;
    rc ref_cur;
    emprow emp%ROWTYPE;
    v_sql VARCHAR2(100):= 'select * from emp where deptno = :x';   --动态执行的SQL语句
BEGIN
    OPEN rc FOR v_sql USING 30;   --打开游标,绑定执行的SQL语句,并传递参数
  LOOP
        FETCH rc INTO emprow;
        EXIT WHEN rc%NOTFOUND;
        dbms_output.put_line('name:'||emprow.ename||'  sal:'||emprow.sal);
    END LOOP;
    CLOSE rc;
END;

2、在execute immediate中使用bulk collect into

示例:

declare
         type org_table_type is table of ma_org%rowtype;
         org_table org_table_type;
         v_orgcode varchar2(20);
    begin
         v_orgcode := '%00%';
         execute immediate 'select * from ma_org where org_code like:v_orgcode' bulk collect into org_table
         using v_orgcode;
         for i in 1..org_table.count
             loop    
                dbms_output.put_line(org_table(i).org_code||','||org_table(i).org_name);
             end loop; 
    end;

3、在forall语句中使用bulk collect into语句

示例:

declare
         type type_org_code is table of ma_org.org_code%type;
         type type_org_name is table of ma_org.org_name%type;
         v_orgcode type_org_code;
         v_orgname type_org_name;
    begin
         v_orgcode := type_org_code('1100','1200'); 
         forall i in 1..v_orgcode.count
            execute immediate 'update ma_org set org_name = org_code||org_namewhere org_code = :p1 returning org_name into :p2'
            using v_orgcode(i)
            returning bulk collect into v_orgname; 
         for i in v_orgname.first..v_orgname.last

            loop
               dbms_output.put_line(v_orgname(i));
         end loop;
    end;

到此这篇关于Oracle中执行动态SQL的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: Oracle中执行动态SQL

本文链接: https://www.lsjlt.com/news/147934.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Oracle中执行动态SQL
    一、概述 在一般的sql操作中,sql语句基本上都是固定的,如: SELECT t.empno,t.ename FROM scott.emp t WHERE...
    99+
    2022-11-13
  • SQLServer中执行动态SQL
    在Sql Server查询语句中使用变量表示表名、字段名等动态查询方式叫动态查询。 当需要根据外部输入的参数来决定要执行的SQL语句时,常常需要动态来构造SQL查询语句,用得比较多的...
    99+
    2022-11-13
  • SQL Server中怎么执行动态SQL
    这篇“SQL Server中怎么执行动态SQL”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“SQL Se...
    99+
    2023-06-30
  • plsql EXECUTE IMMEDIATE动态执行sql
    select * from BANK t; DECLARE v_money bank.money%TYPE; BEGIN --简单执行sql,注意sql字符串不要带分号结束 EXECUTE IMMEDIATE "S...
    99+
    2015-12-31
    plsql EXECUTE IMMEDIATE动态执行sql
  • Oracle之SQL执行
    1、Oracle Concepts Guide一书中详细地讲解了SQL语言和数据库的每个部分。建议使用Oracle的人都去读一读《Oracle Concepts Guide》。2、共享池和数据库高速缓存2....
    99+
    2022-10-18
  • oracle SQL执行过程
    1.sql执行过程 1>解析(判断对象是否存在,是否有权限查询,语义解析,检查缓存中是否有相同的SQL等等) 2>优化(CBO确定优化模式,确定访问路径,联接顺序,过程中通过...
    99+
    2022-10-18
  • Oracle动态SQL和静态SQL比较
    Oracle动态SQL和静态SQL比较1.静态SQLSQL与动态SQL  Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大...
    99+
    2022-10-18
  • DB2 存储过程中执行动态SQL的两种写法
    样本代码: DROP PROCEDURE QUOTATION.COPY_SAMPLE; CREATE PROCEDURE QUOTATION.COPY_SAMPLE ( IN tableNa...
    99+
    2022-10-18
  • oracle中怎么查看sql执行计划的执行顺序
    这篇文章主要讲解了“oracle中怎么查看sql执行计划的执行顺序”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“oracle中怎么查看sql执行计划的执行顺...
    99+
    2022-10-18
  • 使用SpringAop动态获取mapper执行的SQL,并保存SQL到Log表中
    目录1.背景2.难点3.实现3.1ModelSumbit.java3.2LogAdvice.java3.3SqlUtils.java4.注意事项总结1.背景 工作的时候遇到一个这样的...
    99+
    2023-03-07
    SpringAop动态获取SQL mapper执行SQL 保存SQL到Log表
  • Oracle中怎么获取SQL执行计划
    这篇文章将为大家详细讲解有关Oracle中怎么获取SQL执行计划,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Oracle 获取SQL执行计划方法方法一:D...
    99+
    2022-10-18
  • Oracle Study--Oracle SQL执行计划查看(MindMap)
    Oracle Study--Oracle SQL执行计划查看(MindMap) ...
    99+
    2022-10-18
  • oracle数据库执行sql文件
    使用oracle客户端连接数据库,从oracle官网下载客户端instantclient_18_3工具,到目录下打开cmd命令窗口: 个人网盘客户端工具:https://pan.baidu.com/s/1lM4Faat7Mq0gr7rzmf...
    99+
    2018-10-13
    oracle数据库执行sql文件
  • [转] Oracle sql语句执行顺序
    sql语法的分析是从右到左 一、sql语句的执行步骤: 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义。 2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限。 3)视图转换,将涉及视图的查询语句...
    99+
    2015-06-02
    [转] Oracle sql语句执行顺序 数据库入门 数据库基础教程
  • Oracle固定SQL的执行计划(一)---SQL Profile
    我们都希望对于所有在Oracle数据库中执行的SQL,CBO都能产生出正确的执行计划,但实际情况却并非如此,由于各种各样的原因(比如目标SQL所涉及的对象的统计信息的不准确,或者CBO内部一些成本计算公式的...
    99+
    2022-10-18
  • node.js 动态执行脚本
    node.js最近新增了虚拟机模块,其实也不能说是新增的,只是把一些内部接口暴露出来罢了,从2.x就有了。我们可以从node / src / node.js看到这些代码: var Script = pr...
    99+
    2022-06-04
    脚本 动态 node
  • 动态执行python代码
    最近刚刚学到两个新的命令exec和eval,这两个命令可以在代码中动态执行python脚本。 exec a = 1 exec "a = 2" print a 上述代码输出的结果为2 name = "os" exec "impor...
    99+
    2023-01-31
    代码 动态 python
  • 讨论Oracle 中sql语句的执行顺序
    查询语句的执行顺序:select ename as name from scott.emp emp where emp.job=' CLERK' order by name;sele...
    99+
    2022-10-18
  • 如何使用SpringAop动态获取mapper执行的SQL并保存SQL到Log表中
    本文小编为大家详细介绍“如何使用SpringAop动态获取mapper执行的SQL并保存SQL到Log表中”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何使用SpringAop动态获取mapper执行的SQL并保存SQL到Log表中”文...
    99+
    2023-07-05
  • oracle job可以手动执行不能自动执行
    oracle job之前还可以自动执行,后来不能自动执行?    通过ps -ef |grep ora_j查看oracle 的job进程,未发现相关的job进程;[oracle...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作