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

oracle 动态sql 绑定变量

 
阅读更多
--无绑定变量的非SQL查询
DECLARE

  v_sql varchar2(4000);
BEGIN   --使用EXECUTE IMMEDIATE执行动态SQL,最后提交事物
  v_sql := 'CREATE TABLE account('||' id NUMBER(3) NOT NULL,'||
        'name VARCHAR2(50) NOT NULL,'||' balance NUMBER(8,2) NOT NULL,'||
        ' btime DATE NOT NULL)';
  EXECUTE IMMEDIATE v_sql;
  v_sql :='INSERT INTO account (id,name,balance,btime)'||
        ' VALUES (1,''张三'',2000.1,TO_DATE(''12-02-2008'',''dd-mm-yyyy''))';
  EXECUTE IMMEDIATE v_sql;
    v_sql :='INSERT INTO account (id,name,balance,btime)'||
        ' VALUES (2,''李四'',530,TO_DATE(''10-12-2008'',''dd-mm-yyyy''))';
  EXECUTE IMMEDIATE v_sql;
    v_sql :='INSERT INTO account (id,name,balance,btime)'||
        ' VALUES (3,''王五'',1631,TO_DATE(''11-05-2007'',''dd-mm-yyyy''))';
  EXECUTE IMMEDIATE v_sql;
    v_sql :='INSERT INTO account (id,name,balance,btime)'||
        ' VALUES (4,''小强'',910.3,TO_DATE(''12-04-2008'',''dd-mm-yyyy''))';
  EXECUTE IMMEDIATE v_sql;
    v_sql :='INSERT INTO account (id,name,balance,btime)'||
        ' VALUES (5,''小周'',8700,TO_DATE(''11-11-2008'',''dd-mm-yyyy''))';
  EXECUTE IMMEDIATE v_sql;
EXCEPTION
  WHEN OTHERS THEN
       DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;

drop table account


--带固定数目绑定变量的非SQL查询
DECLARE

  v_sql     varchar2(4000);

  v_balance account.balance%TYPE;

  v_name account.name%TYPE;
BEGIN       --使用EXCUTE IMMEDIATE语句执行SQL字符串,使用USING将绑定变量与输入的ID和账户金额进行绑定,
            --将更新后的账户名称与账户余额返回到变量中
  v_sql := 'UPDATE account SET balance=:balance WHERE id=:id'||
        ' RETURNING name,balance INTO:1,:2';
  EXECUTE IMMEDIATE v_sql
     USING &balance,&id          --把绑定参数的值传给绑定变量在sql语句中分别有指定
     RETURNING INTO v_name, v_balance;        --返回的数据传给两个定义变量
  IF SQL%NOTFOUND THEN      --假如没找到就抛出一个异常
     RAISE_APPLICATION_ERROR(-20001,'无效的账户ID');
  END IF;
  COMMIT;
  DBMS_OUTPUT.PUT_LINE(v_name || '  ' || v_balance);
EXCEPTION                   
  WHEN OTHERS THEN
       DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;


--带固定数目列和绑定变量的SQL查询
DECLARE
     
       TYPE account_table_type IS TABLE OF account%ROWTYPE INDEX BY BINARY_INTEGER;
     
       account_table account_table_type;
     
       account_cursor SYS_REFCURSOR;
     
       v_sql   varchar2(4000);
BEGIN
       v_sql := 'SELECT * FROM account WHERE TO_CHAR(btime,''YYYY'') = :year';  --通过年份使用绑定变量
       OPEN account_cursor FOR v_sql USING &year;       --open。。for执行sql字符串,使用using进行变量绑定
       FETCH account_cursor BULK COLLECT INTO account_table;         --执行下一条
       IF account_table.COUNT = 0 THEN        --集合长度等于0就抛出异常
          RAISE_APPLICATION_ERROR(-20001,'未找到数据');
       END IF;
       FOR i IN 1..account_table.COUNT LOOP   --把集合中内容打印出来
           DBMS_OUTPUT.PUT_LINE(account_table(i).name || '  ' || account_table(i).balance);
       END LOOP;
       CLOSE account_cursor;                  --关闭游标
EXCEPTION
       WHEN OTHERS THEN
            DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
分享到:
评论

相关推荐

    oracle 数据库的绑定变量特性及应用

    Oracle 数据库的绑定变量特性及应用 绑定变量是 Oracle 数据库的一种特性,它旨在提高数据库系统的性能和可扩展性。在本文中,我们将详细地探讨绑定变量的目的、命名方法、使用限制条件和应用实例。 为什么使用...

    动态SQL与绑定变量

    动态SQL与绑定变量是数据库编程中的重要概念,尤其在Oracle数据库中被广泛应用。动态SQL允许在运行时构建和执行SQL语句,而绑定变量则是在动态SQL中用于替代具体值的占位符,使得SQL语句更为灵活和高效。 ### 1. ...

    浅谈oracle 数据库的绑定变量特性及应用

    - **动态SQL**:在编程语言如Java、Python等与Oracle数据库交互时,经常使用预编译的PreparedStatement,其中就包含了绑定变量的概念。 - **PL/SQL块**:在Oracle的存储过程、函数和触发器中,也可以使用绑定变量...

    也谈oracle 数据库的绑定变量特性及应用

    绑定变量允许开发者创建动态SQL语句,其中的变量在执行时才提供具体的值,而不是硬编码到查询中。这种做法带来了显著的优势,尤其是在处理大量相似但不完全相同的查询时。 1. 为什么使用绑定变量? - **提高性能**...

    sql绑定变量

    标题与描述中的“SQL绑定变量”这一知识点,主要聚焦于SQL语句中如何使用变量,尤其是在存储过程或函数中动态构建SQL语句时的关键技术。绑定变量允许在SQL语句中使用程序变量作为参数,这不仅提高了代码的可读性和...

    Java中Oracle操作绑定变量使用用户工具模块解决方案

    为了克服这个问题,并充分利用绑定变量带来的性能优势,我们可以设计一个通用模块`SQLWhere_ClauseByBind_VariableGeneraterUtils`来帮助动态构建带有绑定变量的SQL语句及其对应的值设置。该模块的核心逻辑如下: `...

    在Java中实现Oracle变量的绑定方法 .doc

    为了解决这些问题,我们可以使用预编译的PreparedStatement对象来绑定变量,例如: ```java String sql = "select name from oms_user where id=?"; PreparedStatement pstmt = connection.prepareStatement(sql); ...

    查找未使用绑定变量sql.sql

    查找未使用绑定变量sql.sql

    Oracle数据库的绑定变量特性及应用.pdf

    开发人员需要编写代码以支持动态SQL,并在可能的地方使用绑定变量。例如,通过预编译的游标(如PL/SQL中的REF CURSOR)或者在Java、C#等编程语言中使用PreparedStatement。 总的来说,Oracle数据库的绑定变量特性是...

    oracle 动态SQL

    - 动态SQL可能导致SQL注入问题,因此在构建SQL语句时应避免使用不安全的用户输入,或者使用绑定变量来防止这类攻击。 6. **性能影响**: - 动态SQL相比静态SQL可能会带来一定的性能损失,因为它需要在解析和执行...

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

    使用`DBMS_SQL.OPEN_CURSOR`打开一个游标,然后通过`DBMS_SQL.PARSE`解析SQL语句,并用`DBMS_SQL.BIND_VARIABLE`绑定变量,最后调用`DBMS_SQL.EXECUTE`执行删除操作。 #### 示例2:执行DDL语句 ```sql CREATE OR ...

    Oracle数据库绑定变量特性及应用

    Oracle数据库的绑定变量特性是其优化SQL性能的关键技术之一,对于构建高效、可扩展和稳定的数据库系统至关重要。本文将深入探讨绑定变量的原理、优势以及如何在实际应用中使用。 首先,为什么我们要使用绑定变量?...

    Oracle中动态SQL详解

    EXECUTE IMMEDIATE '动态SQL语句' USING [绑定变量] RETURNING INTO [输出变量]; ``` - **DDL语句**:可以用来执行DDL语句,如创建表等。 - **DML语句**:支持动态执行各种DML语句,如插入、更新、删除等。 - **...

    oracle 的绑定变量

    绑定变量的作用在于,即使SQL的谓词部分(如WHERE子句)的值不同,Oracle也能通过使用相同的哈希值将它们视为同一SQL。例如,使用绑定变量":X"的SQL `SELECT salary FROM user WHERE name=:X`可以替代多个特定名字的...

    Oracle 中的变量绑定

    不使用绑定变量,例如在Java程序中直接将变量值拼接到SQL语句中,会导致每次SQL语句的值改变时,Oracle都需要重新解析SQL,这称为硬分析(Hard Parse)。硬分析不仅消耗CPU资源,还会增加数据库的负载,因为每次都...

    Oracle绑定变量窥视功能深度分析.pdf

    Oracle 绑定变量窥视功能是 Oracle 数据库中的一种功能,可以使 SQL 语句共享执行计划,从而提高数据库性能。该功能通过在绑定变量中存储执行计划,从而避免了每次执行 SQL 语句时都需要重新生成执行计划的过程。 ...

    oracle动态sql之EXECUTE IMMEDIATE.docx

    3. 如果动态 SQL 中需要绑定变量,则使用 USING,通常绑定的变量为输入入参,此时变量前的 in 可以省略;如果需要绑定输出变量(如调用过程时可能需要输出),则在变量前用 out 显示指明。 下面是 EXECUTE ...

    ORACLE 19C SQL调优指南 中文版 Oracle DBA

    3. **绑定变量**:使用绑定变量可以避免硬解析,提高SQL语句的重用性,减少解析开销。当SQL语句中的参数用绑定变量替代时,数据库只需解析一次,后续相同结构的查询将共享同一个执行计划。 4. **分区技术**:在大型...

    压测Oracle的SQL语句的性能情况

    2. **绑定变量**:使用绑定变量可以防止硬解析,提高SQL执行效率,减少解析开销。 3. **执行计划**:通过EXPLAIN PLAN分析SQL执行路径,了解数据库如何处理查询,找出可能导致性能问题的步骤。 4. **索引策略**:...

Global site tag (gtag.js) - Google Analytics