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

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。