`
jeelee
  • 浏览: 637015 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

oracle学习笔记(第十七章:动态SQL)

阅读更多
-- 动态 SQL
-- 使用 dbms_sql 包
-- 步骤:
1)打开游标:dbms_sql.open_cursor, 返回游标 ID 号
2)语法分析:dbms_sql.parse( i_c  INTEGER,i_statement IN VARCHAR2,i_language_flag IN INTEGER),
           i_c打开的光标 ID,i_statement 等待分析的 SQL 语句,i_language_flag,语言版本,取值:6,7,dbms_sql.native,按连接的数据库版本运行
3)绑定输入变量:dbms_sql.bind_variable,注意:DDL,ALTER session语句不能绑定变量,绑定变量前的冒号可有可无
  绑定数字型的变量:bind_variable(i_c IN INTEGER,i_name IN VARCHAR2,i_value IN NUMBER);
  绑定varchar2型的变量:bind_variable(i_c IN INTEGER,i_name IN VARCHAR2,i_value IN VARCHAR2);
                       bind_variable(i_c IN INTEGER,i_name IN VARCHAR2,i_value IN VARCHAR2,o_value_size OUT INTEGER);
  绑定char型的变量:bind_variable_char(i_c IN INTEGER,i_name IN VARCHAR2,i_value IN VARCHAR2[,o_value_size OUT INTEGER]);
  绑定日期型的变量:bind_variable(i_c IN INTEGER,i_name IN VARCHAR2,i_value IN DATE);
  绑定raw型的变量:bind_variable_raw(i_c IN INTEGER,i_name IN VARCHAR2,i_value IN RAW[,o_value_size OUT INTEGER])
  绑定log型的变量:
4)执行语句:dbms_sql.EXECUTE(i_c IN INTEGER) 返回处理的行数,
5)关闭游标:dbms_sql.close_cursor(i_c IN INTEGER)

DECLARE
v_sql VARCHAR2(200);
v_age INTEGER;
v_emp_no CHAR(5);
v_id INTEGER;
v_row INTEGER;
BEGIN
     v_sql :='update emp_m set emp_age = :age where emp_no = :emp_no';
     v_age := 25;
     v_emp_no := '00001';
     v_id := dbms_sql.open_cursor;
     dbms_sql.parse(v_id,v_sql,dbms_sql.native);
     dbms_sql.bind_variable(v_id,':age',v_Age);
     dbms_sql.bind_variable(v_id,':emp_no',v_emp_no);
     v_row := dbms_sql.execute(v_id);
     dbms_sql.close_cursor(v_id);
     dbms_output.put_line('v_row = '||to_char(v_row));
END;
--执行查询语句
-- 步骤:
1)打开游标:dbms_sql.open_cursor, 返回游标 ID 号
2)语法分析:dbms_sql.parse( i_c  INTEGER,i_statement IN VARCHAR2,i_language_flag IN INTEGER),
           i_c打开的光标 ID,i_statement 等待分析的 SQL 语句,i_language_flag,语言版本,取值:6,7,dbms_sql.native,按连接的数据库版本运行
3)绑定输入变量:dbms_sql.bind_variable,注意:DDL,ALTER SESSION 语句不能绑定变量,绑定变量前的冒号可有可无
4)定义选择列表项:dbms_sql.define_column
  定义类型为number的:dbms_sql.define_column(i_c IN INTEGER,i_position IN INTEGER,i_column IN NUMBER)
  定义类型为varchar2的:dbms_sql.define_column(i_c IN INTEGER,i_position IN INTEGER,i_column IN VARCHAR2,i_column_size IN INTEGER)
  定义类型为char的:dbms_sql.define_column_char(i_c IN INTEGER,i_position IN INTEGER,i_column IN CHAR,i_column_size IN INTEGER)
  定义类型为date的:dbms_sql.define_column_date(i_c IN INTEGER,i_position IN INTEGER,i_column IN DATE)
  定义类型为raw的:dbms_sql.define_column_raw(i_c IN INTEGER,i_position IN INTEGER,i_column IN RAW,i_column_size IN INTEGER)             
  i_position 选择列表中项的相对位置,第一个是 1 ,i_column 定义输出变量的类型和长度的变量,i_size 定义输出变量的最大长度
5)执行语句:dbms_sql.EXECUTE(i_c IN INTEGER) 返回处理的行数
6)取回查询到的行:dbms_sql.fetch_rows(i_c IN INTEGER),返回值为 0 表示结束,dbms_sql.EXECUTE 和 dbms_sql.fetch_rows 组合成一个语句:dbms_sql.execute_and_fetch(i_c IN INTEGER,i_exact IN BOOLEAN DEFAULT FALSE) RETURN INTEGER
                 i_exact 如果为真,则在查询是返回一行以上是引发异常too_many_rows,但是程序仍然可以执行fetch和检索操作
                 返回值表示到目前为止取回的行数
7)把查询到的结果返回到PL/SQL变量中:dbms_sql.COLUMN_VALUE
  NUMBER 类型:dbms_sql.COLUMN_VALUE(i_c IN INTEGER,i_position IN INTEGER,o_value OUT NUMBER)
              dbms_sql.COLUMN_VALUE(i_c IN INTEGER,i_position IN INTEGER,o_value OUT NUMBER,o_column_error OUT NUMBER,o_actual_lenth OUT INTEGER)
  VARCHAR2 类型:dbms_sql.COLUMN_VALUE(i_c IN INTEGER,i_position IN INTEGER,o_value OUT VARCHAR2)
                dbms_sql.COLUMN_VALUE(i_c IN INTEGER,i_position IN INTEGER,o_value OUT VARCHAR2,o_column_error OUT NUMBER,o_actual_lenth OUT INTEGER)
  CHAR 类型:dbms_sql.COLUMN_VALUE(i_c IN INTEGER,i_position IN INTEGER,o_value OUT CHAR)
            dbms_sql.COLUMN_VALUE(i_c IN INTEGER,i_position IN INTEGER,o_value OUT CHAR,o_column_error OUT NUMBER,o_actual_lenth OUT INTEGER)
  DATE 类型:dbms_sql.COLUMN_VALUE(i_c IN INTEGER,i_position IN INTEGER,o_value OUT DATE)
            dbms_sql.COLUMN_VALUE(i_c IN INTEGER,i_position IN INTEGER,o_value OUT DATE,o_column_error OUT NUMBER,o_actual_lenth OUT INTEGER)
  RAW 类型:dbms_sql.COLUMN_VALUE(i_c IN INTEGER,i_position IN INTEGER,o_value OUT RAW)
                dbms_sql.COLUMN_VALUE(i_c IN INTEGER,i_position IN INTEGER,o_value OUT RAW,o_column_error OUT NUMBER,o_actual_lenth OUT INTEGER)
8)关闭游标:dbms_sql.close_cursor(i_c IN INTEGER)

DECLARE
v_sql VARCHAR2(200);
v_id INTEGER;
v_emp_name emp_m.emp_name%TYPE;
v_emp_sex emp_m.emp_sex%TYPE;
v_emp_age emp_m.emp_age%TYPE;
v_emp_birthday emp_m.emp_birthday%TYPE;
v_row INTEGER;
BEGIN
   v_sql := 'select emp_name,emp_sex,emp_age,emp_birthday from emp_m  where emp_no = :emp_no';
   v_id := dbms_sql.open_cursor;
   dbms_sql.parse(v_id,v_Sql,dbms_sql.native);
   dbms_sql.bind_variable(v_id,':emp_no','00001');
   dbms_sql.define_column(v_id,1,v_emp_name,10);
   dbms_sql.define_column_char(v_id,2,v_emp_sex,1);
   dbms_sql.define_column(v_id,3,v_emp_age);
   dbms_sql.define_column(v_id,4,v_emp_birthday);
   v_row := dbms_sql.execute(v_id);
   LOOP
     IF dbms_sql.fetch_rows(v_id) = 0 THEN
        EXIT;
     END IF;
     dbms_sql.COLUMN_VALUE(v_id,1,v_emp_name);
     dbms_sql.column_value_char(v_id,2,v_emp_sex);
     dbms_sql.column_value(v_id,3,v_emp_age);
     dbms_sql.column_value(v_id,4,v_emp_birthday);
     dbms_output.put_line('emp_name='||v_emp_name||',emp_sex='||v_emp_sex||',emp_age='||to_char(v_emp_age)||',emp_birthday='||to_char(v_emp_birthday,'yyyy/mm/dd'));
   END LOOP;
   dbms_sql.close_cursor(v_id);
END;

分享到:
评论

相关推荐

    oracle_sql笔记

    Oracle SQL是数据库管理员和开发人员在Oracle数据库系统中进行数据查询和管理的重要工具。这篇笔记主要涵盖了Oracle SQL的...这两份“Oracle SQL笔记”文档应包含了上述各个方面的详细解释和实例,值得仔细阅读和学习。

    ORACLE经典学习笔记

    ### ORACLE经典学习笔记知识点概览 #### 第一章 ORACLE 命令 本章节主要介绍了Oracle数据库中常用的命令及其使用方法。 1. **查看参数文件**: `Desc v$parameter` - 这个命令用于查看Oracle的参数文件信息,通过...

    Oracle 10g 学习笔记

    │ Oracle学习笔记.pdf │ Oracle学习笔记.wps │ 安装Oracle后myEclipse不能正常使用.txt │ 手工配置listener.ora【避免出现ORA-12514错误】.txt │ 贴子树状态存储结构.jpg │ 贴子树状态存储结构.sql │ ├─01...

    最全的ORACLE-SQL笔记

    【Oracle SQL笔记详解】 Oracle SQL是用于访问和操作Oracle数据库的强大工具,涵盖了各种查询、更新和管理数据的方法。以下是对笔记中提及的一些关键知识点的详细解释: 1. **登录Oracle数据库**:通常以超级管理...

    成功之路:Oracle_11g学习笔记17

    本学习笔记以第17章构筑高速运行的SQL语句为例,详细探讨了Oracle数据库性能调整的相关知识点。 首先,需要明确数据库性能调整的概念和范围。数据库性能调整是通过一系列的方法和技术,改善数据库运行效率和响应...

    Oracle学习笔记.doc

    ### Oracle学习笔记知识点详解 #### 一、SQL概述与Oracle简介 - **SQL**(Structured Query Language,结构化查询语言)是一种用于管理关系型数据库的标准语言。它被用来执行各种数据库操作,如查询数据、更新数据...

    ORACLE学习笔记2:日常应用、深入管理、性能优化.

    第1篇 日常应用 第1章 安装和卸载 第2章 数据库管理 第3章 数据库实例管理 ... 第17章 常用性能监测、分析和优化工具 第18章 对SQL语句进行分析和优化 第19章 索引和提示优化 第20章 数据库分区技术

    Oracle-笔记.doc

    第十七章 组函数及分组统计:这部分讨论了GROUP BY语句和聚合函数(如COUNT、SUM、AVG、MAX、MIN)的使用,用于对数据进行汇总和统计。 第十八章 数据库对象:这部分可能涵盖其他数据库对象,如视图、存储过程、...

    Oracle数据库课堂笔记

    第十一讲:PL/SQL编程进阶 进阶PL/SQL编程涵盖游标、复合类型、包(PACKAGE)、记录类型和动态SQL等高级主题。游标用于逐行处理查询结果,复合类型允许创建自定义数据结构,包则将相关过程和变量封装在一起,提高...

    Oracle SQL笔记

    第十一章 使用视图 视图(VIEW)是虚拟表,基于一个或多个表的SELECT查询。视图可以简化复杂的查询,并提供数据的安全性,因为它们可以限制对原始数据的访问。 这些笔记覆盖了Oracle SQL的基础知识,包括查询、数据...

    oracle十八天学习笔记

    本"Oracle十八天学习笔记"涵盖了Oracle数据库的基础到高级概念,旨在帮助初学者和有一定经验的开发者深入理解Oracle的核心技术和应用。 第1天:Oracle简介与安装配置 在第一天的学习中,我们将了解Oracle的历史背景...

    Java开发详解.zip

    031714_【第17章:Java数据库编程】_使用JDBC连接Oracle笔记.pdf 031801_【第18章:图形界面】_AWT、Swing简介笔记.pdf 031802_【第18章:图形界面】_基本容器:JFrame笔记.pdf 031803_【第18章:图形界面】_标签...

    Oracle培训18天笔记

    第十七天:数据库故障诊断与维护 1. 日志管理:理解redo log和archive log,以及如何进行故障恢复。 2. 软件更新与补丁:学习如何应用Oracle数据库的补丁,理解补丁升级流程。 3. 监控工具:了解Oracle Enterprise ...

    Oracle学习笔记

    以下是一些Oracle学习笔记中的关键知识点: 1. **远程访问Oracle数据库**:你可以通过URL `http://127.0.0.1:5560/isqlplus/` 来访问Oracle数据库,不论是自己的还是他人的,这表明Oracle提供了Web接口来操作数据库...

    从实践中学习oracleSQL读书笔记

    以下是从《从实践中学习 oracle/SQL》一书第一章和第二章中提取的知识点: 1. **简单查询语句**:基本的查询语句由`SELECT`和`FROM`构成,如`SELECT * FROM employees`,其中`*`表示选取所有列,而`;`作为语句结束...

    oracle培训18天老师笔记

    - 动态SQL:如何在PL/SQL中执行动态SQL语句。 **第八至九天:索引与性能优化** - 索引类型:B树、位图、函数索引等,以及何时使用它们。 - Explain Plan:学习如何使用Explain Plan来分析查询执行计划,优化查询...

    oracle培训18天笔记

    第十六至十七天:性能优化 了解Oracle的性能监控工具如V$视图,分析SQL执行计划,使用索引、物化视图和绑定变量来提升性能。了解CBO(Cost-Based Optimizer)的工作原理。 第十八天:高可用性与集群 Oracle RAC...

    2009达内SQL学习笔记

    最大优点是可以包含其他 SELECT 语句,使用能够动态地建立 WHERE 子句。 如 SELECT prod_id,prod_price,prod_name FROM Products WHERE vend_id IN(‘DELL’,’RBER’,’TTSR’); 八、单行函数: 函数一般在数据...

Global site tag (gtag.js) - Google Analytics