Fork me on GitHub

动态SQL(学习笔记)

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

 

posted @ 2015-01-09 18:56  森林森  阅读(544)  评论(0编辑  收藏  举报