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

 

你可能感兴趣的:(动态sql)