动态SQL

EXECUTE IMMEDIATE 动态SQL字符串 [BUCK COLLECT] INTO 自定义的变量,,|记录类型

USING [IN |OUT|IN OUT]绑定的参数]

[RETURNING |RETURN ][BULK COLLECT]INTO 绑定参数

示例1

--根据用记输入的员工ID来输入员工信息

DECLARE
v_sql_smst VARCHAR2(200); --定义变量用来存放SQL语句
v_emp emp%ROWTYPE; --定义量行变量
v_id emp.empno%TYPE:=&empno; --定义用户输入的ID
BEGIN
v_sql_smst:='SELECT * FROM EMP WHERE EMPNO=:EMPNO';
EXECUTE IMMEDIATE v_sql_smst INTO v_emp USING v_id;
dbms_output.put_line('员工编号: '||v_id||' 姓名:'||v_emp.ename||' 职位'||v_emp.job);
END;

动态游标返回多行数据

--根据输入的工资,返回员工信息

DECLARE
cur_emp SYS_REFCURSOR; --定义游标
v_sal emp.sal%TYPE:=&sal; --定义用户输入工资
v_emp emp%ROWTYPE; --定义行变量
BEGIN
OPEN cur_emp FOR 'SELECT * FROM EMP WHERE SAL>:SAL ORDER BY SAL' USING v_sal; --打开游标并执行SQL查询多行,返回结果 dbms_output.put_line('工资高于 '||v_sal||'员工有:');
LOOP
FETCH cur_emp INTO v_emp;
EXIT WHEN cur_emp%NOTFOUND;
dbms_output.put_line('员工编号:'||v_emp.empno||' 姓名:'||v_emp.ename||' 工资:'||v_emp.sal);
END LOOP;
CLOSE cur_emp;
END;

--动态创建表和插入表

DECLARE
v_sql_creat VARCHAR2(220):='CREATE TABLE stuinfo(ID NUMBER(5),NAME VARCHAR2(20),sex VARCHAR2(5))';
v_into1 VARCHAR2(220):='INSERT INTO stuinfo VALUES(1,''张三'',''男'')';
v_into2 VARCHAR2(220):='INSERT INTO stuinfo VALUES(2,''李四'',''女'')';
BEGIN
EXECUTE IMMEDIATE v_sql_creat;
EXECUTE IMMEDIATE v_into1;
EXECUTE IMMEDIATE v_into2;
commit
END;

--动态增加

DECLARE
v_id stuinfo.id%TYPE:=&ID;
v_name stuinfo.name%TYPE:='&name';
v_sex stuinfo.sex%TYPE:='&sex';
v_into1 VARCHAR2(220):='INSERT INTO stuinfo VALUES(:id,:name,:sex)'; BEGIN
EXECUTE IMMEDIATE v_into1 USING v_id,v_name,v_sex;
COMMIT;
END;

--动态删除

DECLARE
v_id stuinfo.id%TYPE:=&ID; v_sql_del VARCHAR2(220):='delete from stuinfo where id=:id ';
BEGIN
EXECUTE IMMEDIATE v_sql_del USING v_id; EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END;

--动态更新

--动态更新
DECLARE
v_id stuinfo.id%TYPE:=&ID;
v_name stuinfo.name%TYPE:='&name';
v_sex stuinfo.sex%TYPE:='&sex';
v_sql_update VARCHAR2(200):='UPDATE stuinfo SET name=:1,sex=:2 where id=:3';
BEGIN
EXECUTE IMMEDIATE v_sql_update USING v_name,v_sex,v_id;
IF SQL%ROWCOUNT > 0 THEN
COMMIT;
dbms_output.put_line('ok');
END IF;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
END;
--USING中的绑定顺序与执行语句中的顺序要一致
SELECT * FROM stuinfo;

--动态查询

DECLARE
stu stuinfo%ROWTYPE;
cur_r SYS_REFCURSOR;
v_id stuinfo.id%TYPE:=&ID;
v_sql_sel VARCHAR2(220):='select * from stuinfo where id=:id ';
BEGIN
OPEN cur_r FOR v_sql_sel USING v_id;
LOOP
FETCH cur_r INTO stu;
EXIT WHEN cur_r%NOTFOUND;
dbms_output.put_line(stu.id||' '||stu.name||' '||stu.sex);
END LOOP; EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
END;

动态SQL(学习笔记)的更多相关文章

  1. ORALCE PL/SQL学习笔记

    ORALCE  PL/SQL学习笔记 详情见自己电脑的备份数据资料

  2. mybatis原理分析学习记录,mybatis动态sql学习记录

    以下个人学习笔记,仅供参考,欢迎指正. MyBatis 是支持定制化 SQL.存储过程以及高级映射的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转 ...

  3. Oracle之PL/SQL学习笔记

    自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整理了一下,给大家分享,有不足之处还望大家 ...

  4. SQL学习笔记

    SQL(Structured Query Language)学习笔记 [TOC] Terminal登录数据库 1.登录mysql -u root -p ; 2.显示所有数据库show database ...

  5. mybatis 动态sql 的笔记 以及标签

    MyBatis常用OGNL表达式 e1 or e2 e1 and e2 e1 == e2,e1 eq e2 e1 != e2,e1 neq e2 e1 lt e2:小于 e1 lte e2:小于等于, ...

  6. sql学习笔记--存储过程

    存储过程(stored procedure)有时也称sproc,它是真正的脚本,更准确地说,它是批处理(batch),但都不是很确切,它存储与数据库而不是单独的文件中. 存储过程中有输入参数,输出参数 ...

  7. [Oracle] PL/SQL学习笔记

    -- 1. 使用一个变量 declare -- Local variables here v_name ); begin -- Test statements here select t.user_n ...

  8. [SQL学习笔记][用exists代替全称量词 ]

    学习sql的必经问题. 学生表student (id学号 Sname姓名 Sdept所在系) 课程表Course (crscode课程号 name课程名) 学生选课表transcript (studi ...

  9. SQL学习笔记——SQL初入门,Ubuntu下MySQL的安装

          刚开始接触sql,于是准备在Ubuntu下学习sql,就跟着itercast的sql教程开始入门了. 下面只是我个人的记录,高手请绕道: 一. 在安装之前,我们可以用下面这个命令通过开放端 ...

随机推荐

  1. hrbust 2176 Mac的投票 二分/水题

    Mac的投票 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 52(12 users) Total Accepted: 12(10 us ...

  2. 读书笔记_Effective_C++_条款三十六:绝不重新定义继承而来的non-virtual函数

    这个条款的内容很简单,见下面的示例: class BaseClass { public: void NonVirtualFunction() { cout << "BaseCla ...

  3. GIT(6)----fork和clone的区别,fetch与pull的区别

    参考资料: [1].Git学习笔记:fork和clone的区别,fetch与pull的区别 [2].在Github和Git上fork之简单指南

  4. 编写简单登陆和注册功能的demo时遇到的问题

    一.注册功能中添加数据不成功 给数据库添加EditText中的内容后,数据库中找不到添加后的数据,并且存在字符串为空的数据 解决方法:EditText registerAccount = (EditT ...

  5. py2exe使用方法 (含一些调试技巧,如压缩email 类)(转)

    一.简介 py2exe是一个将python脚本转换成windows上的可独立执行的可执行程序(*.exe)的工具,这样,你就可以不用装python而在windows系统上运行这个可执行程序. py2e ...

  6. HDU 1890 Robotic Sort (splay tree)

    Robotic Sort Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  7. WP8.1 VS iOS VS Android全方面大比拼

    众所周知,苹果的OS和谷歌的Android系统都有着相对成熟的设计和较好的用户体验,而随着WP8.1的发布,微软WP系统在交互方面也有了很多改进和提升,而今天小编便为大家全面对比一下这三大系统.   ...

  8. Linux系统不可不知的命令:sudo

    转自:http://www.embeddedlinux.org.cn/html/xinshourumen/201308/05-2608.html sudo是个统管一切的命令.它的字面意思是代表“超级用 ...

  9. datagrid在MVC中的运用06-固定连续列

    本文主要体验datagrid的frozenColumns属性. □ frozenColumns效果: 在frozenColumns的列将保持不动,而其他列横向滚动. □ frozenColumns效果 ...

  10. msgpack和protobuf的对比

    msgpack和protobuf的对比 msgpack的序列化速度比protobuf要快一些,但反序列化要比protobuf要慢一些,但总体都接近msgpack可以直接序列化类对象,但protobuf ...