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

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

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

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

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

--代码16.10 定义并打开动态SQL语句游标 DECLARE TYPE emp_cur_type IS REF CURSOR; --定义游标类型 emp_cur emp_cu...

PL/SQL开发中动态SQL的使用与过程分页

在Oracle数据库开发PL/SQL块中我们使用的SQL分为:静态SQL语句和动态SQL语句。所谓静态SQL指在PL/SQL块中使用的SQL语句在编译时是明确的,执行的是确定对象。而动态SQL是指在P...

PL/SQL 动态Sql拼接where条件

DECLARE SQLSTR VARCHAR(200) := 'SELECT * FROM hr.employees where 1=1'; TYPE EMPCURTYP IS R...

PL/SQL中使用动态SQL编程

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

PL/SQL --> 动态SQL

使用动态SQL是在编写PL/SQL过程时经常使用的方法之一。很多情况下,比如根据业务的需要,如果输入不同查询条件,则生成不同的执行 SQL查询语句,对于这种情况需要使用动态SQL来完成。再比如,对于...

PL/SQL --> 动态SQL的常见错误

动态SQL在使用时,有很多需要注意的地方,如动态SQL语句结尾处不能使用分号(;),而动态PL/SQL结尾处需要使用分号(;),但不能使用正 斜杠结尾(/),以及shcema对象不能直接作为变量绑定...

PL/SQL开发中动态SQL的使用方法(原文http://dev.yesky.com/187/2029687.shtml)

内容摘要:在PL/SQL开发过程中,使用SQL,PL/SQL可以实现大部份的需求,但是在某些特殊的情况下,在PL/SQL中使用标准的SQL语句或DML语句不能实现自己的需求,比如需要动态建表或某个不确...

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

1.1 PL/SQL简介     PL/SQL是ORACLE的过程化语言,包括一整套的数据类型、条件结构、循环结构和异常处理结构,PL/SQL可以执行SQL语句,SQL语句中也可以使用PL/SQ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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