• sql编程


    --打开控制台显示程序
    set serveroutput on;
    --最基本的匿名块
    begin
        dbms_output.put_line('hello world');
    end;
    --带有声明部分的匿名块
    declare
      v_info varchar2(30);
    begin
      v_info:='hello world';
      dbms_output.put_line(v_info);
    end;

    declare
      empname varchar(50);
    begin
      select ename into empname from emp where empno=7788;
      dbms_output.put_line(empname);
    end;
    --if语句
    declare
      v_sal number(5,0);
      v_level nvarchar2(1);
    begin
      select sal into v_sal from emp where empno=7788;
      if v_sal<3000 then
        v_level:='低';
      elsif v_sal>5000 then
        v_level:='高';
      else
        v_level:='中';
      end if;
      dbms_output.put_line(v_sal||' '||v_level);
    end;
    --case语句
    declare
      v_sal number(5,0);
      v_level nvarchar2(1);
      v_area nvarchar2(20);
    begin
      select sal into v_sal from emp where empno=7788;
      case
      when v_sal < 3000 then
           v_level:='低';
      when v_sal > 5000 then
           v_level:='高';
      else
           v_level:='中';
      end case;
     
      case v_level
      when '低' then
           v_area:='3000以下';
      when '高' then
           v_area:='5000以上';
      else
           v_area:='3000-5000';
      end case;
      dbms_output.put_line(v_sal||' '||v_level||' '||v_area);
    end;
    --for循环
    begin
      for i in 1..10 loop
          dbms_output.put_line(i);
      end loop;
    end;
    --while循环
    declare
      i number(2):=0;
    begin
      while i < 10 loop
            i:=i+1;
            dbms_output.put_line(i);
      end loop;
    end;
    --loop循环
    --将emp表中所有工资低于2000的加上100,直到都高于2000;
    declare
      count_low number(5);
    begin
      loop
          select count(*) into count_low from emp where sal < 2000;
          if count_low > 0 then
            update emp set sal=sal+100 where sal < 2000;
          else
            exit;
          end if;
      end loop;
    end;
    --声明与表中变量相同类型的变量
    declare
      e_name emp.ename%type;
      e_sal emp.sal%type;
    begin
      select ename into e_name from emp where empno=7788;
      select sal into e_sal from emp where empno=7788;
      dbms_output.put_line(e_name||' '||e_sal);
    end;
    --声明一个与表中一行类型相同的变量
    declare
      row_emp emp%rowtype;
    begin
      select * into row_emp from emp where empno=7839;
      dbms_output.put_line(row_emp.ename||' '||row_emp.sal);--打印出该行变量其中两个值
    end;
    --声明一个复合变量
    declare
      type emp_record is record--定义一个类型
      (
        e_name emp.ename%type,
        e_sal emp.sal%type
      );
      e_info emp_record;--定义一个该类型的变量
    begin
      select ename,sal into e_info from emp where empno=7788;
      dbms_output.put_line(e_info.e_name||' '||e_info.e_sal);--打印出变量中的元素
    end;
    --索引表
    declare
      type name_emp is table of emp.ename%type
      index by binary_integer;--定义一个索引类型
      e_name name_emp;--定义一个索引变量
    begin
      select ename into e_name(-1) from emp where empno=7788;
      select ename into e_name(1) from emp where empno=7839;
      dbms_output.put_line(e_name(-1)||' '||e_name(1));--打印出变量中的值
    end;
    --游标
    declare
      type emp_cur is ref cursor;--定义游标类型
      e_cur emp_cur;--声明游标变量
      e_name emp.ename%type;
      e_sal emp.sal%type;
    begin
      open e_cur for select ename,sal from emp;--打开游标
      loop
           fetch e_cur into e_name,e_sal;--从游标变量中取值
      exit when e_cur%notfound;--判断游标变量里的值是否被找到,找不到时退出loop循环
           dbms_output.put_line(e_name||' '||e_sal);
      end loop;
    end;
    --建立一个测试表student;
    create table student(
      stid number(4) primary key,--系统编号
      sno nvarchar2(5) not null,--将系统编号前加一S作为学生编号
      sname nvarchar2(10) not null,
      sex number(1) not null,
      cid number(3) not null--班级编号
    );
    --建立一个序列seq_stu;
    create sequence seq_stu
    start with 1
    increment by 1;
    commit;
    --建立触发器
    create or replace trigger ad_stu
    before insert on student
    FOR EACH ROW
    declare
    begin
      SELECT seq_stu.nextval INTO :new.stid FROM dual;
      SELECT LPAD(:new.stid,5,'S0000') INTO :new.sno FROM dual;
    end;
    --测试
    INSERT INTO student VALUES('','','小波',1,1);
    --查询
    SELECT * FROM student;

    --存储过程
    --定义包
    CREATE OR REPLACE PACKAGE pack_emp IS
      TYPE cur_emp IS REF CURSOR;--定义一个游标
    END;
    --定义存储过程
    CREATE OR REPLACE PROCEDURE proc_sal(sal_result OUT pack_emp.cur_emp)
    AS
    BEGIN
      OPEN sal_result FOR SELECT d.dname, SUM(sal), ROUND(AVG(sal)) FROM dept d LEFT JOIN emp e ON d.deptno = e.deptno GROUP BY dname;
    END;
    --JAVA代码
            Connection conn = null;
            CallableStatement cs = null;
            ResultSet rs = null;
            try {
                Class.forName("oracle.jdbc.driver.OracleDriver");
                conn = DriverManager.getConnection("jdbc:oracle:thin:@10.25.129.6:1521:Orcl", "SCOTT", "TIGER");
                cs = conn.prepareCall("{call proc_sal(?)}");
                cs.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
                cs.execute();
                rs = (ResultSet)cs.getObject(1);
                while (rs.next()) {
                    System.out.println(rs.getString(1) + ": " + rs.getInt(2) + " "
                            + rs.getInt(3));
                }
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                try {
                    rs.close();
                    cs.close();
                    conn.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
          
          
    --建立分页
    --声明一个包
    CREATE OR REPLACE PACKAGE pack_page IS
      TYPE cur_page IS REF CURSOR;--游标,返回分布结果集
      PROCEDURE pro_page (
        p_currentPage IN NUMBER,--当前页
        p_recoredInPage IN NUMBER,--每页记录条数
        p_tableName IN VARCHAR2,--表名
        p_pageSize OUT NUMBER,--总页数
        p_result OUT pack_page.cur_page--结果集  
      );
    END;
    --建立包体
    CREATE OR REPLACE PACKAGE BODY pack_page IS
      PROCEDURE pro_page(
        p_currentPage IN NUMBER,--当前页
        p_recoredInPage IN NUMBER,--每页记录条数
        p_tableName IN VARCHAR2,--表名
        p_pageSize OUT NUMBER,--总页数
        p_result OUT pack_page.cur_page--结果集  
      )
      IS
        v_recordSize NUMBER(5);--总记录数
        v_sql VARCHAR2(300);
        v_begin NUMBER(5);--每页起始记录
        v_end NUMBER(5);--每页的终止记录
    BEGIN
        v_sql:='select count(*) from '||p_tableName;
      EXECUTE IMMEDIATE v_sql INTO v_recordSize;
        p_pageSize := CEIL(v_recordSize/p_recoredInPage);
        v_begin := (p_currentPage-1) * p_recoredInPage + 1;
        v_end := p_currentPage * p_recoredInPage;
        v_sql := 'select * from (select t.*, rownum rn from '||p_tableName||' t where rownum<='||v_end||') where rn>='||v_begin;
      OPEN p_result FOR v_sql;
      END;
    END;


  • 相关阅读:
    Performance and Design
    返回数组中不重复的元素
    IE的button元素bug
    (转)Google Closure: 糟糕的JavaScript
    Why do we have an IMG element?
    About this and that
    C#中的Attribute
    C#检查字体是否存储,以及安装
    ZipFile压缩文件后,解压文件后有多层目录的处理方法
    Office系列在线预览
  • 原文地址:https://www.cnblogs.com/sand-tiny/p/3733478.html
Copyright © 2020-2023  润新知