--无绑定变量的非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 数据库的一种特性,它旨在提高数据库系统的性能和可扩展性。在本文中,我们将详细地探讨绑定变量的目的、命名方法、使用限制条件和应用实例。 为什么使用...
动态SQL与绑定变量是数据库编程中的重要概念,尤其在Oracle数据库中被广泛应用。动态SQL允许在运行时构建和执行SQL语句,而绑定变量则是在动态SQL中用于替代具体值的占位符,使得SQL语句更为灵活和高效。 ### 1. ...
- **动态SQL**:在编程语言如Java、Python等与Oracle数据库交互时,经常使用预编译的PreparedStatement,其中就包含了绑定变量的概念。 - **PL/SQL块**:在Oracle的存储过程、函数和触发器中,也可以使用绑定变量...
绑定变量允许开发者创建动态SQL语句,其中的变量在执行时才提供具体的值,而不是硬编码到查询中。这种做法带来了显著的优势,尤其是在处理大量相似但不完全相同的查询时。 1. 为什么使用绑定变量? - **提高性能**...
标题与描述中的“SQL绑定变量”这一知识点,主要聚焦于SQL语句中如何使用变量,尤其是在存储过程或函数中动态构建SQL语句时的关键技术。绑定变量允许在SQL语句中使用程序变量作为参数,这不仅提高了代码的可读性和...
为了克服这个问题,并充分利用绑定变量带来的性能优势,我们可以设计一个通用模块`SQLWhere_ClauseByBind_VariableGeneraterUtils`来帮助动态构建带有绑定变量的SQL语句及其对应的值设置。该模块的核心逻辑如下: `...
为了解决这些问题,我们可以使用预编译的PreparedStatement对象来绑定变量,例如: ```java String sql = "select name from oms_user where id=?"; PreparedStatement pstmt = connection.prepareStatement(sql); ...
查找未使用绑定变量sql.sql
开发人员需要编写代码以支持动态SQL,并在可能的地方使用绑定变量。例如,通过预编译的游标(如PL/SQL中的REF CURSOR)或者在Java、C#等编程语言中使用PreparedStatement。 总的来说,Oracle数据库的绑定变量特性是...
- 动态SQL可能导致SQL注入问题,因此在构建SQL语句时应避免使用不安全的用户输入,或者使用绑定变量来防止这类攻击。 6. **性能影响**: - 动态SQL相比静态SQL可能会带来一定的性能损失,因为它需要在解析和执行...
使用`DBMS_SQL.OPEN_CURSOR`打开一个游标,然后通过`DBMS_SQL.PARSE`解析SQL语句,并用`DBMS_SQL.BIND_VARIABLE`绑定变量,最后调用`DBMS_SQL.EXECUTE`执行删除操作。 #### 示例2:执行DDL语句 ```sql CREATE OR ...
Oracle数据库的绑定变量特性是其优化SQL性能的关键技术之一,对于构建高效、可扩展和稳定的数据库系统至关重要。本文将深入探讨绑定变量的原理、优势以及如何在实际应用中使用。 首先,为什么我们要使用绑定变量?...
EXECUTE IMMEDIATE '动态SQL语句' USING [绑定变量] RETURNING INTO [输出变量]; ``` - **DDL语句**:可以用来执行DDL语句,如创建表等。 - **DML语句**:支持动态执行各种DML语句,如插入、更新、删除等。 - **...
绑定变量的作用在于,即使SQL的谓词部分(如WHERE子句)的值不同,Oracle也能通过使用相同的哈希值将它们视为同一SQL。例如,使用绑定变量":X"的SQL `SELECT salary FROM user WHERE name=:X`可以替代多个特定名字的...
不使用绑定变量,例如在Java程序中直接将变量值拼接到SQL语句中,会导致每次SQL语句的值改变时,Oracle都需要重新解析SQL,这称为硬分析(Hard Parse)。硬分析不仅消耗CPU资源,还会增加数据库的负载,因为每次都...
Oracle 绑定变量窥视功能是 Oracle 数据库中的一种功能,可以使 SQL 语句共享执行计划,从而提高数据库性能。该功能通过在绑定变量中存储执行计划,从而避免了每次执行 SQL 语句时都需要重新生成执行计划的过程。 ...
3. 如果动态 SQL 中需要绑定变量,则使用 USING,通常绑定的变量为输入入参,此时变量前的 in 可以省略;如果需要绑定输出变量(如调用过程时可能需要输出),则在变量前用 out 显示指明。 下面是 EXECUTE ...
3. **绑定变量**:使用绑定变量可以避免硬解析,提高SQL语句的重用性,减少解析开销。当SQL语句中的参数用绑定变量替代时,数据库只需解析一次,后续相同结构的查询将共享同一个执行计划。 4. **分区技术**:在大型...
2. **绑定变量**:使用绑定变量可以防止硬解析,提高SQL执行效率,减少解析开销。 3. **执行计划**:通过EXPLAIN PLAN分析SQL执行路径,了解数据库如何处理查询,找出可能导致性能问题的步骤。 4. **索引策略**:...