热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

oracle学习笔记(动态SQL)

--动态SQL--使用dbms_sql包--步骤:1)打开游标:dbms_sql.open_cursor,返回游标ID号2)语法分析:dbms_sql.parse(i_cINT
 

-- 动态 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;

 

两个写数据的存储过程

dbms_lob.append 和 dbms_lob.write
append存储过程用于将一个大对象添加到另一个大对象中,此时是将源大对象的内容全部添加过去。append存储过程的语法如下:
dbms_lob.append(
dest_lob in out nocopy blob,
src_lob in blob);

dbms_lob.append(
dest_lob in out nocopy clob character set any_cs,
src_lob in clob character set dest_lob%charset);
其中,各个参数的含义如下:
dest_lob是被源lob添加到的目标lob的定位器
src_lob是源lob的定位器
any_cs用来指定字符集。

write存储过程
write存储过程能够将数据写入大型对象中。写的位置是从大型对象开始处的某个绝对偏移地址,数据从缓冲区参数被写入。写操作将覆盖已经在大型对象偏移地址处存在的任何长度为指定的数据。如果输入数多于在缓冲区的数据,将产生一个错误。如果输入数量小于在缓冲区的数据,那么只有缓冲区的数据字节活字符被写给大型对象。
write存储过程的语法如下:
dbms_lob.write(
lob_loc in out nocopy blob,
amount in binary_integer,
offset in integer,
buffer in raw);

dbms_lob.write(
lob_loc in out nocopy clob character set any_cs,
amount in binary_integer,
offset in integer,
buffer in varchar2 character set lob_loc%charset);

其中各个参数的含义如下:
lob_loc是要操作的大型对象定位器。
amount是要写道大型对象中去的字节数量。
offset是指定将数据写入到大型对象什么位置的偏移地址。
buffer是写入到大型对象的数据缓冲区。
any_cs指定要使用的字符集。

示例:
declare
source_lob clob;
dest_lob clob;
write_amount integer:=18;
writing_position integer;
buffer varchar2(20) := 'Added text to clob';
begin
select clob_locator into dest_lob from mylobs where lob_index = 4 for update;
select clob_locator into source_lob from mylobs where lob_index = 1;
dbms_lob.append(dest_lob, source_lob);
commit;

select clob_locator into dest_lob from mylobs where lob_index = 5 for update;
writing_position := dbms_lob.getlength(dest_lob) + 1;
dbms_lob.write(dest_lob, write_amount, writing_position, buffer);
commit;
end;
/

SQL> select * from mylobs;

 


推荐阅读
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • mysqldinitializeconsole失败_mysql03误删除了所有用户解决办法
    误删除了所有用户解决办法第一种方法(企业常用)1.将数据库down掉[rootdb03mysql]#etcinit.dmysqldstopShuttingdownMySQL..SU ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 如何利用 Myflash 解析 binlog ?
    本文主要介绍了对Myflash的测试,从准备测试环境到利用Myflash解析binl ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • OCI连接MySQL_PLSQL Developer连接远程数据库OCI客户端安装方法
    本文介绍了使用OCI客户端连接MySQL和PLSQL Developer连接远程数据库的安装方法,避免了在本地安装Oracle数据库或类似的开发套件的麻烦,同时解决了PLSQL Dev连接远程Oracle时的配置问题。 ... [详细]
  • PeopleSoft安装镜像版本及导入语言包的方法
    本文介绍了PeopleSoft安装镜像的两个版本,分别是VirtualBox虚拟机版本和NativeOS版本,并详细说明了导入语言包的方法。对于Windows版本,可以通过psdmt.exe登录进入,并使用datamover脚本导入语言包。对于Linux版本,同样可以使用命令行方式执行datamover脚本导入语言包。导入语言包后,可以实现多种语言的登录。参考文献提供了相关链接以供深入了解。 ... [详细]
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
  • 近来有一个需求,是需要在androidjava基础库中插入一些log信息,完成这个工作需要的前置条件有编译好的android源码具体android源码如何编译,这 ... [详细]
  • 前端Angular的Post导出Excel,内容全部乱码(不是文件名),而Get方式导出没问题 ... [详细]
author-avatar
mobiledu2502940947
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有