`

oracle 动态执行sql

 
阅读更多
oracle 使用DBMS_SQL包动态执行sql
http://blog.csdn.net/wbj1234566/article/details/2634197
DECLARE      

v_cursor NUMBER;      

v_stat NUMBER;      

v_row NUMBER;      

v_id NUMBER;      

v_no VARCHAR(100);      

v_date DATE;      

v_sql VARCHAR(200);      

s_id NUMBER;      

s_date DATE; BEGIN    

s_id := 3000;    

s_date := SYSDATE;    

v_sql := 'SELECT id,qan_no,sample_date FROM "tblno" WHERE id > :sid and sample_date < :sdate';     
v_cursor := dbms_sql.open_cursor; --打开游标;    

dbms_sql.parse(v_cursor, v_sql, dbms_sql.native); --解析动态SQL语句;      dbms_sql.bind_variable(v_cursor, ':sid', s_id); --绑定输入参数;    

dbms_sql.bind_variable(v_cursor, ':sdate', s_date);         

dbms_sql.define_column(v_cursor, 1, v_id); --定义列
     dbms_sql.define_column(v_cursor, 2, v_no, 100);----字符的应该指定长度,否则会出现错误:PLS-00307: 有太多的 'DEFINE_COLUMN' 说明与此次调用相匹配

     dbms_sql.define_column(v_cursor, 3, v_date);    

v_stat := dbms_sql.execute(v_cursor); --执行动态SQL语句。    

LOOP        

EXIT WHEN dbms_sql.fetch_rows(v_cursor)<=0; --fetch_rows在结果集中移动游标,如果未抵达末尾,返回1。                  dbms_sql.column_value(v_cursor, 1, v_id); --将当前行的查询结果写入上面定义的列中。          dbms_sql.column_value(v_cursor, 2, v_no);        

dbms_sql.column_value(v_cursor, 3, v_date);        

dbms_output.put_line(v_id || ';' || v_no || ';' || v_date);    

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





Oracle动态执行SQL四种方式的例子
http://weiwu83.iteye.com/blog/145104

方式1
CREATE OR REPLACE PROCEDURE demo(salary IN NUMBER) AS
    cursor_name INTEGER;
    rows_processed INTEGER;
BEGIN
    cursor_name := dbms_sql.open_cursor;
    dbms_sql.parse(cursor_name, 'DELETE FROM emp WHERE sal >',
                   dbms_sql);
    dbms_sql.bind_variable(cursor_name, ':x', salary);
    rows_processed := dbms_sql.execute(cursor_name);
    dbms_sql.close_cursor(cursor_name);
EXCEPTION
WHEN OTHERS THEN
    dbms_sql.close_cursor(cursor_name);
END;

CREATE OR REPLACE PROCEDURE exec(STRING IN varchar2) AS
    cursor_name INTEGER;
    ret INTEGER;
BEGIN
   cursor_name := DBMS_SQL.OPEN_CURSOR;

   --DDL statements are executed by the parse call, which
   --performs the implied commit
   DBMS_SQL.PARSE(cursor_name, string, DBMS_SQL);
   ret := DBMS_SQL.EXECUTE(cursor_name);
   DBMS_SQL.CLOSE_CURSOR(cursor_name);
END;

execute immediate "drop table tab_temp";

方式2

CREATE OR REPLACE PROCEDURE copy(source      IN VARCHAR2,
                                 destination IN VARCHAR2) is

-- This procedure copies rows from a given source table to a
-- given destination table assuming that both source and
-- destination tables have the following columns:
--   - ID of type NUMBER,
--   - NAME of type VARCHAR2(30),
--   - BIRTHDATE of type DATE.
  id                 NUMBER;
  name               VARCHAR2(30);
  birthdate          DATE;
  source_cursor      INTEGER;
  destination_cursor INTEGER;
  ignore             INTEGER;
BEGIN

  -- prepare a cursor to select from the source table
  source_cursor := dbms_sql.open_cursor;
  DBMS_SQL.PARSE(source_cursor,
       'SELECT id, name, birthdate FROM ' || source,
        DBMS_SQL);
  DBMS_SQL.DEFINE_COLUMN(source_cursor, 1, id);
  DBMS_SQL.DEFINE_COLUMN(source_cursor, 2, name, 30);
  DBMS_SQL.DEFINE_COLUMN(source_cursor, 3, birthdate);
  ignore := DBMS_SQL.EXECUTE(source_cursor);

  -- prepare a cursor to insert into the destination table
  destination_cursor := DBMS_SQL.OPEN_CURSOR;
  DBMS_SQL.PARSE(destination_cursor,
                'INSERT INTO ' || destination ||
                ' VALUES (:id, :name, :birthdate)',
                 DBMS_SQL);

  -- fetch a row from the source table and
  -- insert it into the destination table
  LOOP
    IF DBMS_SQL.FETCH_ROWS(source_cursor)>0 THEN
      -- get column values of the row
      DBMS_SQL.COLUMN_VALUE(source_cursor, 1, id);
      DBMS_SQL.COLUMN_VALUE(source_cursor, 2, name);
      DBMS_SQL.COLUMN_VALUE(source_cursor, 3, birthdate);
  
      -- bind the row into the cursor that inserts into the
      -- destination table
      -- You could alter this example to require the use of
      -- dynamic SQL by inserting an if condition before the
      -- bind.
      DBMS_SQL.BIND_VARIABLE(destination_cursor, 'id', id);
      DBMS_SQL.BIND_VARIABLE(destination_cursor, 'name', name);
      DBMS_SQL.BIND_VARIABLE(destination_cursor, 'birthdate',
                             birthdate);
      ignore := DBMS_SQL.EXECUTE(destination_cursor);
    ELSE

    -- no more row to copy
      EXIT;
    END IF;
  END LOOP;

  -- commit and close all cursors
  COMMIT;
  DBMS_SQL.CLOSE_CURSOR(source_cursor);
  DBMS_SQL.CLOSE_CURSOR(destination_cursor);

EXCEPTION
  WHEN OTHERS THEN
    IF DBMS_SQL.IS_OPEN(source_cursor) THEN
      DBMS_SQL.CLOSE_CURSOR(source_cursor);
    END IF;
    IF DBMS_SQL.IS_OPEN(destination_cursor) THEN
      DBMS_SQL.CLOSE_CURSOR(destination_cursor);
    END IF;
    RAISE;
END;

方式3

declare
  stmt varchar2(200);
  dept_no_array dbms_sql.Number_Table;
  c number;
  dummy number;
begin
  dept_no_array(1) := 10; dept_no_array(2) := 20;
  dept_no_array(3) := 30; dept_no_array(4) := 40;
  dept_no_array(5) := 30; dept_no_array(6) := 40;
  stmt := 'delete from emp where deptno = :dept_array';
  c := dbms_sql.open_cursor;
  dbms_sql.parse(c, stmt, dbms_sql.native);
  dbms_sql.bind_array(c, ':dept_array', dept_no_array, 1, 4);
  dummy := dbms_sql.execute(c);
  dbms_sql.close_cursor(c);

  exception when others then
    if dbms_sql.is_open(c) then
      dbms_sql.close_cursor(c);
    end if;
    raise;
end;

declare
  stmt varchar2(200);
  empno_array dbms_sql.Number_Table;
  empname_array dbms_sql.Varchar2_Table;
  c number;
  dummy number;
begin
  for i in 0..9 loop
    empno_array(i) := 1000 + i;
    empname_array(I) := get_name(i);
  end loop;
  stmt := 'insert into emp values(:num_array, :name_array)';
  c := dbms_sql.open_cursor;
  dbms_sql.parse(c, stmt, dbms_sql.native);
  dbms_sql.bind_array(c, ':num_array', empno_array);
  dbms_sql.bind_array(c, ':name_array', empname_array);
  dummy := dbms_sql.execute(c);
  dbms_sql.close_cursor(c);

  exception when others then
    if dbms_sql.is_open(c) then
      dbms_sql.close_cursor(c);
    end if;
    raise;
end;

declare
  stmt varchar2(200);
  emp_no_array dbms_sql.Number_Table;
  emp_addr_array dbms_sql.Varchar2_Table;
  c number;
  dummy number;
begin
  for i in 0..9 loop
    emp_no_array(i) := 1000 + i;
    emp_addr_array(I) := get_new_addr(i);
  end loop;
  stmt := 'update emp set ename = :name_array
    where empno = :num_array';
  c := dbms_sql.open_cursor;
  dbms_sql.parse(c, stmt, dbms_sql.native);
  dbms_sql.bind_array(c, ':num_array', empno_array);
  dbms_sql.bind_array(c, ':name_array', empname_array);
  dummy := dbms_sql.execute(c);
  dbms_sql.close_cursor(c);

  exception when others then
    if dbms_sql.is_open(c) then
      dbms_sql.close_cursor(c);
    end if;
    raise;
end;


方式4

declare
  c       number;
  d       number;
  n_tab   dbms_sql.Number_Table;
  indx    number := -10;
begin
  c := dbms_sql.open_cursor;
  dbms_sql.parse(c, 'select n from t order by 1', dbms_sql);

  dbms_sql.define_array(c, 1, n_tab, 10, indx);

  d := dbms_sql.execute(c);
  loop
    d := dbms_sql.fetch_rows(c);

    dbms_sql.column_value(c, 1, n_tab);

    exit when d != 10;
  end loop;

  dbms_sql.close_cursor(c);

  exception when others then
    if dbms_sql.is_open(c) then
      dbms_sql.close_cursor(c);
    end if;
    raise;
end;

declare
  c       number;
  d       number;
  n_tab  dbms_sql.Number_Table;
  d_tab1 dbms_sql.Date_Table;
  v_tab  dbms_sql.Varchar2_Table;
  d_tab2 dbms_sql.Date_Table;
  indx number := 10;
begin

  c := dbms_sql.open_cursor;
  dbms_sql.parse(c, 'select * from multi_tab order by 1', dbms_sql);

  dbms_sql.define_array(c, 1, n_tab,  5, indx);
  dbms_sql.define_array(c, 2, d_tab1, 5, indx);
  dbms_sql.define_array(c, 3, v_tab,  5, indx);
  dbms_sql.define_array(c, 4, d_tab2, 5, indx);

  d := dbms_sql.execute(c);

  loop
    d := dbms_sql.fetch_rows(c);

    dbms_sql.column_value(c, 1, n_tab);
    dbms_sql.column_value(c, 2, d_tab1);
    dbms_sql.column_value(c, 3, v_tab);
    dbms_sql.column_value(c, 4, d_tab2);

    exit when d != 5;
  end loop;

  dbms_sql.close_cursor(c);
分享到:
评论

相关推荐

    Oracle动态执行SQL四种方式的例子

    在Oracle数据库管理中,动态执行SQL语句是一种强大的功能,允许开发者在运行时构建和执行SQL语句,这对于处理不确定或变化的数据结构尤其有用。本文将深入探讨Oracle中动态执行SQL的四种主要方法,并通过具体示例...

    oracle监听执行sql语句

    ### Oracle监听执行SQL语句详解 #### 一、Oracle监听执行概述 在Oracle数据库管理与维护过程中,有时候我们需要了解应用程序正在执行哪些SQL语句,这不仅有助于性能优化,还可以帮助我们诊断潜在的问题。通过监听...

    Oracle批量执行传多个参数多个SQL文件

    在Oracle数据库管理中,批量执行SQL脚本是常见的任务,特别是在数据处理、系统维护或自动化测试等场景。本文将深入探讨如何在Oracle环境中批量执行带有多个参数的多个SQL文件,以便进行高效的数据操作和测试。 首先...

    oracle批量执行sql

    // ※只会执行sql文 不会自动删除表内数据 // oracleStup.bat // 命令行 用户名/密码 @库名 不需要修改 sqlplus C3/AISIN@C3 @sqlFile.sql &gt; execute.log // sqlFile.sql // @@需要处理的sql文路径 @@D:/20150922...

    存储过程中怎么动态执行sql语句

    ### 动态执行SQL语句在Oracle中的应用 #### 标题解读 “存储过程中怎么动态执行SQL语句”这一标题表明文章将介绍如何在Oracle数据库的存储过程中编写能够动态执行的SQL语句。动态SQL是指在运行时才能确定其具体内容...

    shell连接oracle数据库执行SQL工具脚本-支持select+inset+update

    dbExecurteSQL.sh:数据库执行SQL脚本 根据配置文件获取数据库连接,根据传入sql执行sql 调用案例:dbConnectTest.sh "pssc_jk" "select sysdate from dual;" 参数介绍: "pssc_jk" 指配置文件中配置的数据库...

    oracle执行动态sql

    ### Oracle 执行动态 SQL 的几种方法 在数据库管理和应用程序开发中,经常需要处理不固定、不可预知的数据查询和更新需求。此时,静态 SQL(即硬编码的 SQL 语句)无法满足这些灵活多变的需求,这就需要使用动态 ...

    Oracle中SQL语句执行效率的查找与解决

    本文将深入探讨Oracle中SQL语句执行效率的查找与解决方法,特别关注于如何识别和优化那些导致性能瓶颈的查询。 ### Oracle SQL执行效率:查找与解决 #### 一、资源消耗分析 在Oracle中,SQL语句执行效率低下通常...

    oracle 查看当前会话执行的sql语句

    ### Oracle 查看当前会话执行的SQL语句 在Oracle数据库管理中,有时我们需要了解某个特定会话(Session)正在执行哪些SQL语句。这在性能调优、问题诊断等场景下尤为重要。以下将详细介绍如何通过不同的方法来查看...

    oracle查看执行最慢与查询次数最多的sql语句

    在Oracle数据库管理中,了解SQL语句的执行性能和频率对于系统优化至关重要。本文将详细介绍如何查看Oracle数据库中执行最慢和查询次数最多的SQL语句,以帮助DBA(数据库管理员)识别潜在的性能瓶颈。 首先,我们来...

    oracle利用批处理文件执行SQL语句,bat连接oracle数据库并执行语句

    批处理文件(如.bat文件)在Windows环境中是一种高效的方式,可以自动化执行一系列命令,包括连接数据库和执行SQL语句。在这个场景中,我们可以利用批处理文件来简化Oracle数据库的操作,如删除用户、创建用户、创建...

    oracle动态过程执行

    ### Oracle 动态 SQL 执行详解 在 Oracle 数据库中,动态 SQL 提供了一种灵活的方式来执行不预先定义好的 SQL 语句。这种方式允许开发者在运行时构建 SQL 语句并执行它们,这对于处理未知数据结构或需要动态生成...

    在Oracle中执行动态SQL

    3. 在执行SQL语句时,不要用分号,在执行PL/SQL块时,在其尾部用分号。 EXECUTE IMMEDIATE的优点是可以减小企业费用并获得较高的性能,但是需要注意其使用技巧和限制。 Oracle中执行动态SQL可以使用动态游标或...

    性能调优分析之:Oracle SQL执行计划报告生成器

    Oracle SQL执行计划分析器功能的创建3步曲: 1 首先,编译XYG_ALD_SESS_PKG的Package头。 (XYG_ALD_SESS_PKG.sql) 2 接着要建立好下面的4个视图对象。因为XYG_ALD_SESS_PKG包体会用到。(View Create Script v...

    Oracle中动态SQL详解

    ### Oracle中动态SQL详解 #### 一、动态SQL概述与特点 在Oracle数据库中,动态SQL是一种非常重要的技术,尤其对于开发人员来说更是必不可少的一部分。动态SQL是指在运行时构建并执行的SQL语句,与静态SQL(在编译...

    oracle-function-执行动态sql

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

    Oracle批处理:使用C# 自带Oracle驱动一次执行多条Sql语句

    然后,创建一个OracleCommand对象,并设置其CommandType为Text,因为我们将执行SQL文本。接下来,使用CommandText属性添加SQL语句,可以是一条或多条。为了实现批处理,我们可以使用分号(`;`)作为每条SQL语句的分隔...

    Linux下定时自动执行Oracle_SQL

    2. **创建Shell脚本**:接下来,创建一个Shell脚本来调用Oracle客户端工具(如sqlplus)并执行SQL脚本。Shell脚本(ss.sh)中包含了执行日期的记录、输出文件路径的设定以及调用SQL脚本的具体命令。 3. **设置...

    oracle 动态SQL

    Oracle 动态SQL是数据库编程中的一个重要概念,它允许在运行时构建和执行SQL语句,从而提高了灵活性和适应性。动态SQL的使用通常在处理不确定的查询结构、执行基于条件的DML操作或者需要根据运行时信息生成SQL语句时...

    Windows环境下批量执行Oracle的SQL的脚本

    个人博客中的Windows环境下批量执行Oracle的SQL的一种方法这篇文章的附件 个人博客中的Windows环境下批量执行Oracle的SQL的一种方法这篇文章的附件

Global site tag (gtag.js) - Google Analytics