zoukankan      html  css  js  c++  java
  • 动态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一对多的两个表的update
    textArea 高度自适应
    js切换不同的div的颜色
    [Python]闭包的理解和使用
    运维面试
    [linux]ubuntu修改镜像源
    [vsftpd] ubuntu14.04 ansible剧本安装vsftpd流程及报错排查
    windows环境下使用virtualenv对python进行多版本隔离
    [python]打印异常信息的不同方式
    [python]字典的直接赋值、浅拷贝和深拷贝解析
  • 原文地址:https://www.cnblogs.com/liunanjava/p/4211798.html
Copyright © 2011-2022 走看看