• 动态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;
  • 相关阅读:
    [转]VS 2008 新特性一览
    [转]WCF开发框架形成之旅WCF的几种寄宿方式
    [转]失业的程序员(五):商战之前
    [ 转]Android折叠列表 ExpandableList
    [转]extjs入门——开始
    [转]Jquery操作select
    Ext JS 下载 及 是否收费
    [转]WCF服务的批量寄宿
    [转]Android高手进阶教程(十七)之Android中Intent传递对象的两种方法(Serializable,Parcelable)!
    mat之三PermGen Metaspace永久代内存分析
  • 原文地址:https://www.cnblogs.com/liunanjava/p/4211798.html
Copyright © 2020-2023  润新知