动态SQL--PL/SQL

转载 2007年09月27日 17:12:00

动态SQL

1. 使用execute immediate语句

1.1 语法:
 execute immediate dynamic_sql
 [into { variable[,variable]... | record } ]
 [using [in | out | in out ] bind_argument[,[in | out | in out ] bind_argument]
 [{ returning | return } into bind_argument [, bind_argument]...];
 
 dynamic_sql : 代表一个SQL语句或者PL/SQL块的字符表达式。
 variable : 是存储选择的列的一个变量值,record是存储在所选行的一用户定义的或%rowtype纪录。
 bind_argument : 是传入和传出值。
 using : 缺省模式为in。
 returning | return : 仅在DML语句中使用。
 
1.2 实例:

1.2.1 执行DDL

BEGIN
 execute immediate ' create table j_dynamic_sql_test '
 || ' ( id integer, name varchar2(8) )' ;
END;
/

1.2.2 绑定变量

DECLARE
 sql_str varchar2(200);
 type id_table is table of integer; -- ? 1. 此处定义的是什么数据类型,oracle提供了几种集合类型 ? --
 type name_table is table of varchar2(8); -- ? 2. 定义表的时候,表的名字最高可以有几个字符 ? --
 t_id id_table := id_table(1,2,3,4,5);
 t_name name_table := name_table('test1','test2','test3','test4','test5');
 v_returned_id integer;
 v_returned_name varchar2(8);
BEGIN
 sql_str := ' insert into j_dynamic_sql_test values ( :1 , :2 ) ';
 for i in t_id.first.. t_id.last loop
  execute immediate sql_str using t_id(i), t_name(i);
 end loop;
 
 sql_str := ' select id, name from j_dynamic_sql_test where id = :1';
 
 for i in t_id.first.. t_id.last loop
  execute immediate sql_str into v_returned_id, v_returned_name using t_id(i);
  dbms_output.put_line('SQL inserted with id: '||v_returned_id||' and table name: '||v_returned_name);
 end loop;
END;
/

1.2.3 use return

DECLARE
          sql_str varchar2(512);
          v_returned_id integer;
          v_returned_name varchar2(32);
 BEGIN

          sql_str := ' insert into j_dynamic_sql_test values (:1, ''test'' ) returning id,name into :2,:3' ;
          for i in 1..100 loop
                execute immediate sql_str using i returning into v_returned_id,v_returned_name;
              dbms_output.put_line('SQL inserted with id: '||v_returned_id ||'  name: ' || v_returned_name);
          end loop;

 END;
 
2. 使用open-for , fetch 和 close语句

DECLARE
 type ref_cursor_type is ref cursor;
 my_cursor ref_cursor_type;
 tab_rec j_dynamic_sql_test%rowtype;
 sql_str varchar2(200);
BEGIN
 sql_str := ' select id, name from j_dynamic_sql_test ';
 sql_str := sql_str || ' order by id desc';
 open my_cursor for sql_str;
 loop
  fetch my_cursor into tab_rec;
  exit when my_cursor%notfound;
  dbms_output.put_line('id: '||tab_rec.id||' and name: '||tab_rec.name);
 end loop;
 close my_cursor;
END;
/


ANSWERS WITH --? * ?--

1. 此处为嵌套表.oracle 提供了两个集合类型: TABLE类型和变长数组.TABLE类型又分为nested tables & index-by tables.
2. 表的名字可以有32位.

 

PL/SQL 动态Sql拼接where条件

DECLARE SQLSTR VARCHAR(200) := 'SELECT * FROM hr.employees where 1=1'; TYPE EMPCURTYP IS R...
  • u012557814
  • u012557814
  • 2017年03月15日 14:57
  • 1708

在pl/sql中执行动态sql

动态sql就是把sql写在一个字符串里,在存储过程中解析字符串执行sql。这种动态sql很多时候会在别的语言里写,再连接数据库进行操作,这样的确方便很多,例如在java中使用JDBC。但是如果涉及到s...
  • yhb315279058
  • yhb315279058
  • 2014年12月18日 09:08
  • 1741

【Oracle】PL/SQL 显式游标、隐式游标、动态游标

在PL/SQL块中执行SELECT、INSERT、DELETE和UPDATE语句时,ORACLE会在内存中为其分配上下文区(Context Area),即缓冲区。游标是指向该区的一个指针,或是命名一个...
  • vking_wang
  • vking_wang
  • 2013年06月17日 09:02
  • 11196

PL/SQL开发中动态SQL的使用方法

来源:BLOG 作者:DINYA  内容摘要:在PL/SQL开发过程中,使用SQL,PL/SQL可以实现大部份的需求,但是在某些特殊的情况下,在PL/SQL中使用标准的SQL语句或DML语句不能实现...
  • zuoshiduodongnaozi
  • zuoshiduodongnaozi
  • 2013年08月12日 14:42
  • 299

源码-PL/SQL从入门到精通-第十六章-动态SQL语句-Part 1

学到后面几章,发现实用性大大提高。 心得: 1. 代码尽量放到集成开发环境(PL/SQL)中查看,效率要比在书本上看高多了。 2. 卖油翁言“我亦无他,唯手熟尔”,软件开发不是纸上谈兵,必须在开...
  • hpdlzu80100
  • hpdlzu80100
  • 2016年07月26日 15:41
  • 763

动态SQL和PL/SQL的EXECUTE选项分析

EXECUTE IMMEDIATE代替了以前Oracle8i中DBMS_SQL package包.它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前,EX...
  • it_taojingzhan
  • it_taojingzhan
  • 2015年11月23日 10:09
  • 119

PL/SQL中使用动态SQL编程

PL/SQL中使用动态SQL编程    在PL/SQL程序设计过程中,会遇到很多必须使用动态sql的地方,oracle系统所提供的DMBS_SQL包可以帮助你解决问题。  (一)介绍  DBMS_SQ...
  • myownluckystar
  • myownluckystar
  • 2011年04月12日 15:11
  • 161

PL/SQL开发中动态SQL的使用方法

PL/SQL开发中动态SQL的使用方法 内容摘要:在PL/SQL开发过程中,使用SQL,PL/SQL可以实现大部分的需求,但是在某些特殊的情况下,在PL/SQL中使用标准的SQL语句或DML语句不能...
  • li19236
  • li19236
  • 2014年11月25日 18:12
  • 196

oracle pl/sql 入门+ 数组使用+游标+动态SQL

1.1 PL/SQL简介     PL/SQL是ORACLE的过程化语言,包括一整套的数据类型、条件结构、循环结构和异常处理结构,PL/SQL可以执行SQL语句,SQL语句中也可以使用PL/SQ...
  • shojia
  • shojia
  • 2014年02月28日 10:26
  • 555

PL/SQL执行动态SQL(二)

PL/SQL动态SQL 原文地址:http://ajita.iteye.com/blog/1487663 依据: DBMS_SQL包:这个包提供了一种使用动态sql来访问数据库的方法。 ...
  • xing_sky
  • xing_sky
  • 2013年01月03日 16:11
  • 435
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:动态SQL--PL/SQL
举报原因:
原因补充:

(最多只允许输入30个字)