java下促成调用oracle的囤积进度和函数,存款和储蓄进程重回游标的拍卖

By admin in 美高梅手机版4858 on 2019年10月1日

创建表:

在oracle下开创三个test的账户,然后按一动手续实行:

Pl/SQL 编程

美高梅手机版4858 1美高梅手机版4858 2

1.创建表:STOCK_PRICES

美高梅手机版4858 3View
Code

--创建表格CREATETABLE STOCK_PRICES(    RIC VARCHAR(6) PRIMARYKEY,    PRICE NUMBER(7,2),    UPDATED DATE );

java下促成调用oracle的存款和储蓄进度和函数

在oracle下创建三个test的账户,然后按一入手续推行:

一:前言

美高梅手机版4858 4

1 1 create table tb1(
2 2 
3 3 id int ,
4 4 
5 5 name nvarchar(20)
6 6 
7 7 )

2.插入测验数据:

美高梅手机版4858 5View
Code

--插入数据INSERTINTO stock_prices values('1111',1.0,SYSDATE);INSERTINTO stock_prices values('1112',2.0,SYSDATE);INSERTINTO stock_prices values('1113',3.0,SYSDATE);INSERTINTO stock_prices values('1114',4.0,SYSDATE);

1.创建表:STOCK_PRICES

美高梅手机版4858 6

--创建表格
CREATE TABLE STOCK_PRICES(
    RIC VARCHAR(6) PRIMARY KEY,
    PRICE NUMBER(7,2),
    UPDATED DATE );

二:Pl/Sql 概述

美高梅手机版4858 7

View Code

3.建构三个重临游标: PKG_PUB_UTILS

美高梅手机版4858 8View
Code

--建立一个返回游标CREATEORREPLACE PACKAGE PKG_PUB_UTILS IS--动态游标    TYPE REFCURSOR IS REF CURSOR;END PKG_PUB_UTILS;

2.插入测量试验数据:

美高梅手机版4858 9

--插入数据
INSERT INTO stock_prices values('1111',1.0,SYSDATE);
INSERT INTO stock_prices values('1112',2.0,SYSDATE);
INSERT INTO stock_prices values('1113',3.0,SYSDATE);
INSERT INTO stock_prices values('1114',4.0,SYSDATE);

二     ——  1: Pl/Sql块结构

美高梅手机版4858 10

  1 【declare】
  2 --声明部分,可选
  3 begin
  4 --执行部分,必须
  5 [exception]
  6 --异常处理部分,可选
  7 end

美高梅手机版4858 11美高梅手机版4858 12

美高梅手机版4858 13美高梅手机版4858 14

  1 SQL> set serveroutput on;
  2 SQL>
  3 SQL> declare
  4   2  a int:=10;
  5   3  b int:=200;
  6   4  c number;
  7   5  begin
  8   6    c:=(a+b)/(a-b);
  9   7    dbms_output.put_line(c);
 10   8  exception
 11   9     when zero_divide then
 12  10       dbms_output.put_line('除数不许为零');
 13  11   end;
 14  12  /
 15 
 16 -1.10526315789473684210526315789473684211
 17 
 18 PL/SQL procedure successfully completed
 19 
 20 SQL>

View Code

美高梅手机版4858 15

美高梅手机版4858 16


4.创造和储存进度:P_GET_PRICE

美高梅手机版4858 17View
Code

美高梅手机版4858 18

--创建存储过程CREATEORREPLACEPROCEDURE P_GET_PRICE(  AN_O_RET_CODE OUT NUMBER,  AC_O_RET_MSG  OUT VARCHAR2,  CUR_RET OUT PKG_PUB_UTILS.REFCURSOR,  AN_I_PRICE INNUMBER) ISBEGIN    AN_O_RET_CODE :=0;    AC_O_RET_MSG  :='操作成功';        OPEN CUR_RET FORSELECT*FROM STOCK_PRICES WHERE PRICE< span>AN_I_PRICE;EXCEPTION    WHEN OTHERS THEN        AN_O_RET_CODE :=-1;        AC_O_RET_MSG  :='错误代码:'|| SQLCODE || CHR(13) ||'错误信息:'|| SQLERRM;END P_GET_PRICE;

美高梅手机版4858 19

</span>

3.确立贰个回去游标: PKG_PUB_UTILS

美高梅手机版4858 20

--建立一个返回游标
CREATE OR REPLACE PACKAGE PKG_PUB_UTILS IS
    --动态游标
    TYPE REFCURSOR IS REF CURSOR;
END PKG_PUB_UTILS;

二     ——  2:  代码注释和标志符

美高梅手机版4858 21

创办重回游标的仓库储存进度:

5.开立函数:

美高梅手机版4858 22View
Code

美高梅手机版4858 23

--创建函数:F_GET_PRICECREATEORREPLACEFUNCTION F_GET_PRICE(v_price INNUMBER)    RETURN PKG_PUB_UTILS.REFCURSORAS    stock_cursor PKG_PUB_UTILS.REFCURSOR;BEGINOPEN stock_cursor FORSELECT*FROM stock_prices WHERE price < span> v_price;    RETURN stock_cursor;END;

美高梅手机版4858 24

</span>

4.创建和存款和储蓄进度:P_GET_PRICE

美高梅手机版4858 25

美高梅手机版4858 26

--创建存储过程
CREATE OR REPLACE PROCEDURE P_GET_PRICE
(
  AN_O_RET_CODE OUT NUMBER,
  AC_O_RET_MSG  OUT VARCHAR2,
  CUR_RET OUT PKG_PUB_UTILS.REFCURSOR,
  AN_I_PRICE IN NUMBER
) 
IS
BEGIN
    AN_O_RET_CODE := 0;
    AC_O_RET_MSG  := '操作成功';

    OPEN CUR_RET FOR
        SELECT * FROM STOCK_PRICES WHERE PRICE<AN_I_PRICE;
EXCEPTION
    WHEN OTHERS THEN
        AN_O_RET_CODE := -1;
        AC_O_RET_MSG  := '错误代码:' || SQLCODE || CHR(13) || '错误信息:' || SQLERRM;
END P_GET_PRICE;

美高梅手机版4858 27

二     —— 2_____1:单行注释

美高梅手机版4858 28

美高梅手机版4858 29美高梅手机版4858 30

  1 SQL>  set serveroutput on;       --在服务器端 输出结果
  2 SQL>  declare
  3   2
  4   3     Num_sal number;          --- 声明一个数值变量
  5   4     Var_ename varchar(20);   --- 声明一个字符串变量
  6   5   begin
  7   6      select e.ename,e.sal into Var_ename,Num_sal  from emp e where empno=7839;  --检索指定的值并储存到变量中
  8   7      dbms_output.put_line(Var_ename||'工资是'||Num_sal);
  9   8  end;
 10   9
 11  10
 12  11  /
 13 
 14 KING工资是5000
 15 
 16 PL/SQL procedure successfully completed

View Code

美高梅手机版4858 31

美高梅手机版4858 32

美高梅手机版4858 33美高梅手机版4858 34

6.JAVA调用存款和储蓄进程重返结果集

代码示例:JDBCoracle10G_INVOKEPROCEDURE.java

美高梅手机版4858 35View
Code

美高梅手机版4858 36

import java.sql.*;import oracle.jdbc.OracleCallableStatement;import oracle.jdbc.OracleTypes;/* 本例是通过调用oracle的存储过程来返回结果集: * oracle 9i、10G 的jdbc由1个jar包组成:classes12.zip */publicclass JDBCoracle10G_INVOKEPROCEDURE {    Connection conn = null;    Statement statement = null;    ResultSet rs = null;    CallableStatement stmt = null;    String driver;    String url;    String user;    String pwd;    String sql;    String in_price;    public JDBCoracle10G_INVOKEPROCEDURE()     {        driver = "oracle.jdbc.driver.OracleDriver";        url = "jdbc:oracle:thin:@localhost:1521:ORCL";        // oracle 用户        user = "test";        // oracle 密码        pwd = "test";        init();        // mysid:必须为要连接机器的sid名称,否则会包以下错:        // java.sql.SQLException: Io 异常: Connection        // refused(DESCRIPTION=(TMP=)(VSNNUM=169870080)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4))))        // 参考连接方式:        // Class.forName( "oracle.jdbc.driver.OracleDriver" );        // cn = DriverManager.getConnection(        // "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd );    }    publicvoid init() {        System.out.println("oracle jdbc test");        try {            Class.forName(driver);            System.out.println("driver is ok");            conn = DriverManager.getConnection(url, user, pwd);            System.out.println("conection is ok");            statement = conn.createStatement();            // conn.setAutoCommit(false);            // 输入参数            in_price = "3.0";            // 调用函数            stmt = conn.prepareCall("call P_GET_PRICE(?,?,?,?)");            stmt.registerOutParameter(1, java.sql.Types.FLOAT);            stmt.registerOutParameter(2, java.sql.Types.CHAR);            stmt.registerOutParameter(3, oracle.jdbc.OracleTypes.CURSOR);            stmt.setString(4, in_price);            stmt.executeUpdate();            int retCode = stmt.getInt(1);            String retMsg = stmt.getString(2);            if (retCode == -1) { // 如果出错时,返回错误信息                System.out.println("报错!");            } else {                // 取的结果集的方式一:                rs = ((OracleCallableStatement) stmt).getCursor(3);                // 取的结果集的方式二:                // rs = (ResultSet) stmt.getObject(3);                String ric;                String price;                String updated;                // 对结果进行输出while (rs.next()) {                    ric = rs.getString(1);                    price = rs.getString(2);                    updated = rs.getString(3);                    System.out.println("ric:" + ric + ";-- price:" + price                            + "; --" + updated + "; ");                }            }        } catch (Exception e) {            e.printStackTrace();        } finally {            System.out.println("close ");        }    }    publicstaticvoid main(String args[])// 自己替换[]    {        new JDBCoracle10G_INVOKEPROCEDURE();    }}

美高梅手机版4858 37

5.开立函数:

美高梅手机版4858 38View
Code

二     —— 2_____2:多行注释

美高梅手机版4858 39

美高梅手机版4858 40美高梅手机版4858 41

  1 set serveroutput on;      /*在服务器端 输出结果*/
  2  declare
  3    Num_sal number;
  4    Var_ename varchar2(20);
  5  begin
  6    /*检索指定的值并储存到变量中*/
  7       select e.ename,e.sal into Var_ename,Num_sal  from emp e where empno=7839;  --检索指定的值并储存到变量中
  8     dbms_output.put_line(Var_ename||'工资是'||Num_sal);
  9 end;
 10 /

View Code

美高梅手机版4858 42

美高梅手机版4858 43

 1 create proc tb1_proc (
 2 
 3 @cur cursor varying output
 4 
 5 )
 6 
 7 as
 8 
 9 begin
10 
11   set @cur=cursor for
12 
13   select * from tb1
14 
15 end
16 
17 open @cur

7.开辟JAVA调用函数重临结果集

代码示例:JDBCoracle10G_INVOKEFUNCTION.java

美高梅手机版4858 44View
Code

美高梅手机版4858 45

import java.sql.*;import oracle.jdbc.OracleCallableStatement;import oracle.jdbc.OracleTypes;/* /* 本例是通过调用oracle的函数来返回结果集: * oracle 9i、10G 的jdbc由1个jar包组成:classes12.zip   */publicclass JDBCoracle10G_INVOKEFUNCTION {    Connection conn = null;    Statement statement = null;    ResultSet rs = null;    CallableStatement stmt = null;    String driver;    String url;    String user;    String pwd;    String sql;    String in_price;    public JDBCoracle10G_INVOKEFUNCTION()    {        driver = "oracle.jdbc.driver.OracleDriver";        url = "jdbc:oracle:thin:@localhost:1521:ORCL";        // oracle 用户        user = "test";        // oracle 密码        pwd = "test";        init();        // mysid:必须为要连接机器的sid名称,否则会包以下错:        // java.sql.SQLException: Io 异常: Connection        // refused(DESCRIPTION=(TMP=)(VSNNUM=169870080)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4))))        // 参考连接方式:        // Class.forName( "oracle.jdbc.driver.OracleDriver" );        // cn = DriverManager.getConnection(        // "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd );    }    publicvoid init() {        System.out.println("oracle jdbc test");        try {            Class.forName(driver);            System.out.println("driver is ok");            conn = DriverManager.getConnection(url, user, pwd);            System.out.println("conection is ok");            statement = conn.createStatement();            // conn.setAutoCommit(false);            // 输入参数            in_price = "5.0";            // 调用函数            stmt = conn.prepareCall("{? = call F_GET_PRICE(?)}");            // stmt.registerOutParameter(1, java.sql.Types.FLOAT);            // stmt.registerOutParameter(2, java.sql.Types.CHAR);            stmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);            stmt.setString(2, in_price);            stmt.executeUpdate();            // 取的结果集的方式一:            rs = ((OracleCallableStatement) stmt).getCursor(1);            // 取的结果集的方式二:            // rs = (ResultSet) stmt.getObject(1);            String ric;            String price;            String updated;            while (rs.next()) {                ric = rs.getString(1);                price = rs.getString(2);                updated = rs.getString(3);                System.out.println("ric:" + ric + ";-- price:" + price + "; --"                        + updated + "; ");            }        } catch (Exception e) {            e.printStackTrace();        } finally {            System.out.println("close ");        }    }    publicstaticvoid main(String args[])// 自己替换[]    {        new JDBCoracle10G_INVOKEFUNCTION();    }}

美高梅手机版4858 46

 

 

 

6.JAVA调用存款和储蓄进度重临结果集

代码示例:JDBCoracle10G_INVOKEPROCEDURE.java

美高梅手机版4858 47

美高梅手机版4858 48

import java.sql.*;
import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleTypes;

/* 本例是通过调用oracle的存储过程来返回结果集:
 * oracle 9i、10G 的jdbc由1个jar包组成:classes12.zip
 */
public class JDBCoracle10G_INVOKEPROCEDURE {
    Connection conn = null;
    Statement statement = null;
    ResultSet rs = null;
    CallableStatement stmt = null;

    String driver;
    String url;
    String user;
    String pwd;
    String sql;
    String in_price;

    public JDBCoracle10G_INVOKEPROCEDURE() 
    {
        driver = "oracle.jdbc.driver.OracleDriver";
        url = "jdbc:oracle:thin:@localhost:1521:ORCL";
        // oracle 用户
        user = "test";
        // oracle 密码
        pwd = "test";
        init();
        // mysid:必须为要连接机器的sid名称,否则会包以下错:
        // java.sql.SQLException: Io 异常: Connection
        // refused(DESCRIPTION=(TMP=)(VSNNUM=169870080)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4))))
        // 参考连接方式:
        // Class.forName( "oracle.jdbc.driver.OracleDriver" );
        // cn = DriverManager.getConnection(
        // "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd );

    }

    public void init() {
        System.out.println("oracle jdbc test");
        try {
            Class.forName(driver);
            System.out.println("driver is ok");
            conn = DriverManager.getConnection(url, user, pwd);
            System.out.println("conection is ok");
            statement = conn.createStatement();
            // conn.setAutoCommit(false);
            // 输入参数
            in_price = "3.0";
            // 调用函数
            stmt = conn.prepareCall("call P_GET_PRICE(?,?,?,?)");
            stmt.registerOutParameter(1, java.sql.Types.FLOAT);
            stmt.registerOutParameter(2, java.sql.Types.CHAR);
            stmt.registerOutParameter(3, oracle.jdbc.OracleTypes.CURSOR);
            stmt.setString(4, in_price);
            stmt.executeUpdate();
            int retCode = stmt.getInt(1);
            String retMsg = stmt.getString(2);
            if (retCode == -1) { // 如果出错时,返回错误信息
                System.out.println("报错!");
            } else {
                // 取的结果集的方式一:
                rs = ((OracleCallableStatement) stmt).getCursor(3);
                // 取的结果集的方式二:
                // rs = (ResultSet) stmt.getObject(3);
                String ric;
                String price;
                String updated;
                // 对结果进行输出
                while (rs.next()) {
                    ric = rs.getString(1);
                    price = rs.getString(2);
                    updated = rs.getString(3);
                    System.out.println("ric:" + ric + ";-- price:" + price
                            + "; --" + updated + "; ");
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("close ");
        }
    }

    public static void main(String args[])// 自己替换[]
    {
        new JDBCoracle10G_INVOKEPROCEDURE();
    }
}

美高梅手机版4858 49

二     —— 2_____3:PL/SQL字符集

美高梅手机版4858 50

View Code

7.开采JAVA调用函数再次来到结果集

代码示例:JDBCoracle10G_INVOKEFUNCTION.java

美高梅手机版4858 51

美高梅手机版4858 52

import java.sql.*;
import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleTypes;

/*
 /* 本例是通过调用oracle的函数来返回结果集:
 * oracle 9i、10G 的jdbc由1个jar包组成:classes12.zip  
 */
public class JDBCoracle10G_INVOKEFUNCTION {
    Connection conn = null;
    Statement statement = null;
    ResultSet rs = null;
    CallableStatement stmt = null;

    String driver;
    String url;
    String user;
    String pwd;
    String sql;
    String in_price;

    public JDBCoracle10G_INVOKEFUNCTION()
    {
        driver = "oracle.jdbc.driver.OracleDriver";
        url = "jdbc:oracle:thin:@localhost:1521:ORCL";
        // oracle 用户
        user = "test";
        // oracle 密码
        pwd = "test";
        init();
        // mysid:必须为要连接机器的sid名称,否则会包以下错:
        // java.sql.SQLException: Io 异常: Connection
        // refused(DESCRIPTION=(TMP=)(VSNNUM=169870080)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4))))
        // 参考连接方式:
        // Class.forName( "oracle.jdbc.driver.OracleDriver" );
        // cn = DriverManager.getConnection(
        // "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd );
    }

    public void init() {
        System.out.println("oracle jdbc test");
        try {
            Class.forName(driver);
            System.out.println("driver is ok");
            conn = DriverManager.getConnection(url, user, pwd);
            System.out.println("conection is ok");
            statement = conn.createStatement();
            // conn.setAutoCommit(false);
            // 输入参数
            in_price = "5.0";
            // 调用函数
            stmt = conn.prepareCall("{? = call F_GET_PRICE(?)}");
            // stmt.registerOutParameter(1, java.sql.Types.FLOAT);
            // stmt.registerOutParameter(2, java.sql.Types.CHAR);
            stmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
            stmt.setString(2, in_price);
            stmt.executeUpdate();
            // 取的结果集的方式一:
            rs = ((OracleCallableStatement) stmt).getCursor(1);
            // 取的结果集的方式二:
            // rs = (ResultSet) stmt.getObject(1);
            String ric;
            String price;
            String updated;

            while (rs.next()) {
                ric = rs.getString(1);
                price = rs.getString(2);
                updated = rs.getString(3);
                System.out.println("ric:" + ric + ";-- price:" + price + "; --"
                        + updated + "; ");
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("close ");
        }
    }

    public static void main(String args[])// 自己替换[]
    {
        new JDBCoracle10G_INVOKEFUNCTION();
    }
}

三:数据类型与概念变量和常量

美高梅手机版4858 53美高梅手机版4858 54


三     —— 1:基本数据类型

美高梅手机版4858 55

 使用存储进度再次回到的游标:

三     —— 1_____1:数值类型

美高梅手机版4858 56

美高梅手机版4858 57美高梅手机版4858 58

三     —— 1_____2:字符类型

美高梅手机版4858 59

美高梅手机版4858 60

 1 declare @my_cur cursor
 2 
 3 declare @id int, @name nvarchar(20)
 4 
 5 exec tb1_proc @my_cur output
 6 
 7 --open @cursor    -- @cursor already opened
 8 
 9 fetch next from @my_cur into @id, @name
10 
11 while(@@fetch_status=0)
12 
13   begin
14 
15     print '编号:' + convert(nvarchar,@id)
16 
17     print '姓名:' + @name
18 
19     print '......................'
20 
21     fetch next from @my_cur into @id, @name
22 
23   end

三     —— 1_____3:日期类型

美高梅手机版4858 61

View Code

三     —— 1_____4:布尔类型

美高梅手机版4858 62

 注意:存储进度中创建游标后要开辟

三     —— 2 :特殊数据类型

美高梅手机版4858 63

java下促成调用oracle的囤积进度和函数,存款和储蓄进程重回游标的拍卖。三     —— 2_____1: %TYPE 类型

美高梅手机版4858 64

美高梅手机版4858 65

美高梅手机版4858 66

美高梅手机版4858 67

美高梅手机版4858 68美高梅手机版4858 69

  1 SQL>  set serveroutput on      /*在服务器端 输出结果*/
  2 SQL>  declare
  3   2     var_ename emp.ename%type; /*声明与ename 列类型相同的变量*/
  4   3     var_job   emp.job%type;   /*声明与job列类型相同的变量*/
  5   4   begin
  6   5      select ename,job into var_ename,var_job from emp where empno=7839 ;/*检索数据,并保存在变量中*/
  7   6      dbms_output.put_line(var_ename||'工资是'||var_job);
  8   7  end;
  9   8  /
 10 
 11 KING工资是PRESIDENT
 12 
 13 PL/SQL procedure successfully completed

View Code

美高梅手机版4858 70

美高梅手机版4858 71

三     —— 2_____2:  record  类型

美高梅手机版4858 72

美高梅手机版4858 73

美高梅手机版4858 74

美高梅手机版4858 75美高梅手机版4858 76

  1 set serveroutput on  /**/
  2 declare
  3   type emp_type is record
  4    (
  5     var_ename varchar2(20),  /*定义字段--成员变量  */
  6     var_job varchar2(20),
  7     var_sal number
  8    );
  9    empinfo emp_type;  /*定义变量*/
 10 begin
 11   select ename,job,sal into empinfo from emp where empno=7839 ;/*检索数据*/
 12     dbms_output.put_line( '雇员'||empinfo.var_ename||'的职位是'||empinfo.var_job||'、工资是'||empinfo.var_sal);
 13 
 14 end;
 15 /

View Code

美高梅手机版4858 77

三     —— 2_____3:   %rowtype 类型

美高梅手机版4858 78

美高梅手机版4858 79

美高梅手机版4858 80美高梅手机版4858 81

  1 SQL> set serveroutput  on
  2 SQL> declare
  3   2       rowVar_emp emp%rowtype;/*定义能够储存emp表中一行数据的变量 rowVar_emp*/
  4   3  begin
  5   4    select * into rowVar_emp from emp where empno=7839 ;/*检索数据*/
  6   5      dbms_output.put_line( '雇员'||rowVar_emp.ename||'的职位是'||rowVar_emp.job||'、工资是'||rowVar_emp.sal);
  7   6
  8   7  end;
  9   8  /
 10 
 11 雇员KING的职位是PRESIDENT、工资是5000
 12 
 13 PL/SQL procedure successfully completed
 14 
 15 SQL>

View Code

美高梅手机版4858 82

美高梅手机版4858 83

三     —— 3: 定义变量和常量

美高梅手机版4858 84

四  :流程序调整制语句

美高梅手机版4858 85

四    —— 1:选拔语句   if …then 语句

美高梅手机版4858 86

美高梅手机版4858 87

美高梅手机版4858 88美高梅手机版4858 89

  1 SQL> set serveroutput on
  2 SQL> declare
  3   2    var_name1 varchar2(50); --//定义2个字符串变量
  4   3    var_name2 varchar2(50);
  5   4
  6   5  begin
  7   6    var_name1 :='East';    --//给2个变量赋值
  8   7    var_name2 :='xiaoke';
  9   8
 10   9    if length(var_name1)<length(var_name2) then
 11  10      /*输出比较后的结果*/
 12  11      dbms_output.put_line('字符串 “'||var_name1||'”的长度比字符串“'||var_name2||'”的长度小');
 13  12     end if;
 14  13   end;
 15  14  /
 16 
 17 字符串 “East”的长度比字符串“xiaoke”的长度小
 18 
 19 PL/SQL procedure successfully completed
 20 
 21 SQL>

View Code

美高梅手机版4858 90

美高梅手机版4858 91

四    ——1_____ 2:选择语句   if …then … else  语句

美高梅手机版4858 92

美高梅手机版4858 93

美高梅手机版4858 94美高梅手机版4858 95

  1 SQL> set serveroutput on
  2 SQL> declare
  3   2   age int:=55;/*定义整型变量并赋值*/
  4   3  begin
  5   4    if age >=56 then
  6   5      dbms_output.put_line('您可以申请退休了!');
  7   6    else
  8   7       dbms_output.put_line('您小于56岁,不可以申请退休了!');
  9   8    end if;
 10   9  end;
 11  10  /
 12 
 13 您小于56岁,不可以申请退休了!
 14 
 15 PL/SQL procedure successfully completed
 16 

View Code

美高梅手机版4858 96

四    ——1_____3:选择语句   if …then … elseif  语句

美高梅手机版4858 97

美高梅手机版4858 98

美高梅手机版4858 99美高梅手机版4858 100

  1 SQL> set serveroutput on
  2 SQL> declare
  3   2   month int :=10; /*声明整型变量并赋值*/
  4   3
  5   4  begin
  6   5     if month >=0 and month<=3 then /*判断春节*/
  7   6      dbms_output.put_line('这是春季');
  8   7     elsif month >=4 and month <=6 then /*片段夏季*/
  9   8      dbms_output.put_line('这是夏季');
 10   9     elsif month >=7 and month<=9 then
 11  10      dbms_output.put_line('这是秋季');
 12  11     elsif month >=10 and month<=12 then
 13  12      dbms_output.put_line('这是冬季');
 14  13     else
 15  14      dbms_output.put_line('对不起,月份不合法!');
 16  15     end if;
 17  16  end;
 18  17  /
 19 
 20 这是冬季
 21 
 22 PL/SQL procedure successfully completed
 23 
 24 SQL>

View Code

美高梅手机版4858 101

四    ——1_____4:选择语句   case   语句

美高梅手机版4858 102

美高梅手机版4858 103

美高梅手机版4858 104美高梅手机版4858 105

  1 SQL> set serveroutput on
  2 SQL> declare
  3   2   season int:=3;/*定义整型变量并赋值*/
  4   3   aboutInfo varchar2(50);/*声明月份信息*/
  5   4  begin
  6   5      case season  /*片段月份*/
  7   6      when 1 then
  8   7            aboutInfo := season || '季度包括 1,2,3月份';
  9   8       when 2 then
 10   9             aboutInfo := season || '季度包括 4,5,6月份';
 11  10       when 3 then
 12  11             aboutInfo := season || '季度包括 7,8,9月份';
 13  12       when 4 then
 14  13             aboutInfo := season || '季度包括 10,11,12月份';
 15  14       else
 16  15             aboutInfo := season || ' 季度不合法';
 17  16       end case ;
 18  17
 19  18       dbms_output.put_line(aboutInfo);
 20  19
 21  20  end;
 22  21  /
 23 
 24 3季度包括 7,8,9月份
 25 
 26 PL/SQL procedure successfully completed
 27 
 28 SQL>

View Code

美高梅手机版4858 106

四    ——2:循环语句

美高梅手机版4858 107

四    ——2_____1: loop 语句

美高梅手机版4858 108

美高梅手机版4858 109

美高梅手机版4858 110美高梅手机版4858 111

  1 set serveroutput on
  2 declare
  3   sum_i int:=0; /*定义整数变量,存储整数和*/
  4   i int:=0;/*定义整数变量 储存自然数*/
  5 begin
  6   loop   /*循环累加自然数*/
  7     i:= i+1; /*得出自然数*/
  8     sum_i := sum_i + i;/*计算前n个自然数的和*/
  9     exit when i=100;  /*当循环100次后,程序退出循环体*/
 10   end loop;
 11    dbms_output.put_line('前100个自然数的和是'||sum_i);/*计算前100个自然数的和*/
 12 end;
 13 /
 14 

View Code

美高梅手机版4858 112

四    ——2_____2: while 语句

美高梅手机版4858 113

美高梅手机版4858 114

美高梅手机版4858 115美高梅手机版4858 116

  1 set serveroutput on
  2 declare
  3   sum_i int:=0;/*定义变量并赋值*/
  4   i int :=0;/*定义变量并赋值*/
  5 begin
  6   while i<99 loop
  7      i:=i+1;/*当i的值等于100时,程序退款while循环*/
  8     sum_i :=sum_i +i;/*计算前n个自然数的和*/
  9   end loop;
 10    dbms_output.put_line('前100个自然数的和是'||sum_i);/*计算前100个自然数的和*/
 11 end;
 12 /

View Code

美高梅手机版4858 117

四    ——2_____3: for 语句

美高梅手机版4858 118

美高梅手机版4858 119

美高梅手机版4858 120美高梅手机版4858 121

  1 set serveroutput on
  2 declare
  3   sum_i int :=0;/*定义变量并赋值*/
  4 begin
  5    for i in  1..100 loop /*遍历前100个自然数*/
  6      if mod(i,2)=0 then /*判断是否为偶数*/
  7             sum_i:=sum_i +i; /*计算偶数和*/
  8      end if;
  9    end loop;
 10    dbms_output.put_line('前100个自然数的和是'||sum_i);/*计算前100个自然数的和*/
 11 end;
 12 /

View Code

美高梅手机版4858 122

美高梅手机版4858 123

五 :Pl/Sql 游标

美高梅手机版4858 124

五    —1:显示游标 

美高梅手机版4858 125

五    ——1_____1:证明游标 

美高梅手机版4858 126美高梅手机版4858 127

美高梅手机版4858 128

美高梅手机版4858 129

五    ——1_____2:张开游标 

美高梅手机版4858 130

五    ——1_____3: 读取游标 

美高梅手机版4858 131

美高梅手机版4858 132

美高梅手机版4858 133

美高梅手机版4858 134美高梅手机版4858 135

  1 
  2 set serveroutput on
  3 declare
  4   /*声明游标,检索雇员信息*/
  5   cursor cur_emp(var_job varchar2 := 'SALESMAN') is
  6     select empno, ename, sal from emp where job = var_job;
  7   type record_emp is record /*声明一个记录类型 record 类型*/
  8   (
  9     /*定义当前记录的成员变量*/
 10     var_empno emp.empno%type,
 11     var_ename emp.ename%type,
 12     var_sal   emp.sal%type);
 13   emp_row record_emp; /*声明一个record_emp 类型变量*/
 14 begin
 15   open cur_emp('MANAGER'); /*打开游标*/
 16   fetch cur_emp
 17     into emp_row; /*先让指针指向结果集中的第一行,并将值保存到emp_row 中*/
 18   while cur_emp%found loop
 19     dbms_output.put_line(emp_row.var_ename || '的编号是' || emp_row.var_empno ||
 20                          ',工资是' || emp_row.var_sal);
 21 
 22     fetch cur_emp
 23       into emp_row; /*让指针指向结果集的下一行,并将值保存到emp_row中*/
 24   end loop;
 25   close cur_emp; /*关闭游标*/
 26 end;
 27 /

View Code

美高梅手机版4858 136

美高梅手机版4858 137

五    ——1_____4: 关闭游标 

美高梅手机版4858 138

五    ——2: 游标的性质

美高梅手机版4858 139

美高梅手机版4858 140

美高梅手机版4858 141美高梅手机版4858 142

  1 set serveroutput on
  2 declare
  3    var_ename varchar2(50);/*声明变量,用来储存雇员名称*/
  4    var_job   varchar2(50);/*声明变量,用来储存雇员的职务*/
  5    /*声明游标,检索指定员工编号的雇员信息*/
  6   cursor cur_emp /*定义游标,检索指定编号的记录信息*/
  7    is select ename ,job from emp where empno=7499;
  8 begin
  9    open cur_emp;/*打开游标*/
 10    fetch cur_emp into var_ename,var_job ;/*读取游标,并且储存雇员名称和职务*/
 11      if cur_emp%found then /*若检索到数据记录,则输出雇员信息*/
 12        dbms_output.put_line('编号是7499的雇员名称为'||var_ename||',职务是:'||var_job);
 13       else
 14         dbms_output.put_line('无数据记录');/*提示无记录信息*/
 15       end if;
 16 end;
 17 /

View Code

美高梅手机版4858 143

美高梅手机版4858 144

五    ——3: 隐式游标

美高梅手机版4858 145

美高梅手机版4858 146

美高梅手机版4858 147美高梅手机版4858 148

  1 /*在scott 用户下,把emp 表中销售员(即:SALESMAN)的工资上调20% 然后使用隐式游标sql的%rowcount属性输出上调工资的员工数量*/
  2 set serveroutput on
  3 begin
  4   update emp set sal=sal*(1+0.2) where job='SALESMAN';/*把销售员工的工资上调20%*/
  5   if sql%notfound then
  6      dbms_output.put_line(' 没有雇员需要上调工资');
  7   else
  8      dbms_output.put_line('有'||sql%rowcount||'个雇员工资上调20%');
  9   end if;
 10 end;
 11 /

View Code

美高梅手机版4858 149

美高梅手机版4858 150

五    ——3: 通过for 语句循环游标

美高梅手机版4858 151

美高梅手机版4858 152

美高梅手机版4858 153美高梅手机版4858 154

  1 /*使用隐式游标和for语句检索出职务是销售员的雇员信息并输出*/
  2 set serveroutput on
  3 begin
  4    for emp_record in(select empno,ename,sal from emp where job='SALESMAN') /*遍历隐式游标中的记录*/
  5    loop
  6         dbms_output.put_line('雇员编号:'|| emp_record.empno); /*输出雇员编号*/
  7         dbms_output.put_line('雇员名称:'|| emp_record.ename);/*输出雇员名称*/
  8         dbms_output.put_line('雇员工资:'|| emp_record.sal); /*输出雇员工资*/
  9    end loop;
 10 end;
 11 /

View Code

美高梅手机版4858 155

美高梅手机版4858 156

美高梅手机版4858 157

美高梅手机版4858 158美高梅手机版4858 159

  1 /*使用显示游标 和 for 语句检索出部门编号是30的雇员信息并输出 */
  2 set serveroutput on
  3 declare
  4   cursor cur_emp is select * from emp where deptno =30;  /*检索部门编号为30的雇员信息*/
  5 begin
  6   for emp_rocord in cur_emp/*遍历雇员信息*/
  7    loop
  8         dbms_output.put_line('雇员编号:'|| emp_rocord.empno); /*输出雇员编号*/
  9         dbms_output.put_line('雇员名称:'|| emp_rocord.ename);/*输出雇员名称*/
 10         dbms_output.put_line('雇员职务:'|| emp_rocord.job); /*输出雇员工资*/
 11    end loop;
 12 end;
 13 /

View Code

美高梅手机版4858 160

六   :  PL/SQL 相当管理

美高梅手机版4858 161

美高梅手机版4858 162

六   ——1_____1: 预订义万分

美高梅手机版4858 163

美高梅手机版4858 164

美高梅手机版4858 165

美高梅手机版4858 166美高梅手机版4858 167

  1 /*使用select into语句检索emp 表中部门编号为10 的雇员编号记录信息  然后使用too_many_rows一定*/
  2 
  3 
  4 set serveroutput on
  5 declare
  6    var_empno number ;/*定义变量,储存雇员编号*/
  7    var_ename varchar2(50);/*定义变量,储存雇员名称*/
  8 begin
  9    select empno,ename into var_empno,var_ename from  emp where deptno=10;/*查询部门编号为10的雇员的信息*/
 10  if sql%found then /*如果检索成功,则输出雇员信息*/
 11    dbms_output.put_line('雇员编号:'||var_empno||';雇员名称:'||var_ename);
 12  end if;
 13 exception   /*捕获异常*/
 14    when too_many_rows then    /*若 select into 语句返回的记录超过一行*/
 15     dbms_output.put_line('返回记录超出一行');
 16    when no_data_found then   /*若select into  语句的返回结果为0行*/
 17      dbms_output.put_line('无数据记录');
 18 end;
 19 /

View Code

美高梅手机版4858 168

六   ——2: 自定义卓绝

美高梅手机版4858 169

六   ——2_____1:  错误编号格外

美高梅手机版4858 170

美高梅手机版4858 171

美高梅手机版4858 172

美高梅手机版4858 173

美高梅手机版4858 174美高梅手机版4858 175

  1 
  2 set seroutput on
  3 declare
  4  primary_iterant exception;/*定义野怪异常变量*/
  5  pragma exception_init(primary_iterant,-00001);/*关联错误号 和 异常变量名*/
  6 begin
  7   /*向dept表中插入一条与已有主键值重复的记录,以便引发异常*/
  8   insert into dept values(10,'rrr','rrr');
  9 exception
 10    when primary_iterant then /*若Oracle系列捕获到的异常为-000001异常*/
 11    dbms_output.put_line('主键不允许重复!'); /*输出异常描述信息*/
 12 end;
 13 /

View Code

美高梅手机版4858 176

美高梅手机版4858 177

六   ——2_____2:   业务逻辑极度

美高梅手机版4858 178

美高梅手机版4858 179

美高梅手机版4858 180美高梅手机版4858 181

  1 set serveroutput on
  2 declare
  3     null_exception exception ;/*声明一个exception 类型的异常变量*/
  4     dept_row dept%rowtype;   /*声明rowtype 类型的变量 dept_now*/
  5 begin
  6    dept_row.deptno :=66; /*给部门编号变量赋值*/
  7    dept_row.dname := '公关部';/*给部门名称变量赋值*/
  8    insert into  dept values(dept_row.deptno,dept_row.dname,dept_row.loc);/*向dept表插入一条记录*/
  9    if dept_row.loc is null then
 10       raise null_exception; /*引发 null 异常 程序进入exception部分*/
 11    end if;
 12 exception
 13     when null_exception then    /*当 raise 引发的异常是 null_exception 时*/
 14         dbms_output.put_line('loc 字段的值不允许为null');     /*则输出异常提示信息*/
 15         rollback; /*回滚插入的数据记录*/
 16 end ;
 17 /

View Code

美高梅手机版4858 182

六   ——2_____3: Oracle存储进度的不得了管理

  注:本段内容来自:《Oracle存款和储蓄进度的百般管理》

1、为了巩固存款和储蓄进度的健壮性,幸免运维错误,当建构存款和储蓄进程时应饱含非凡管理局地。
2、非凡(EXCEPTION)是一种PL/SQL标志符,包涵预约义万分、非预订义十分和自定义卓越;
3、预约义至极是指由PL/SQL提供的种类十三分;非预订义极度用于拍卖与预约义极度非亲非故的Oracle错误(如完整性约束等);自定义相当用于拍卖与Oracle错误的别的万分意况。
4、RAISE_APPLICATION_EPRADORORAV4用于自定义错误音讯,何况音复信号必需在-20000~-20999中间

命名的种类十三分     产生原因
access_into_null    未定义对象
case_not_found     case中若未满含相应的when,况兼未有安装
collection_is_null    群集成分未早先化
curser_already_open    游标已经开发
dup_val_on_index    独一索引对应的列上有再次的值
invalid_cursor     在违法的游标上实行操作
invalid_number    内嵌的 sql 语句不可能将字符转变为数字
no_data_found     使用 select into
未回来行,或应用索引表未开头化的
too_many_rows     实行 select into 时,结果集超越一行
zero_divide     除数为 0
subscript_beyond_count    成分下标超越嵌套表或varray的最大值
subscript_outside_limit   使用嵌套表或 varray 时,将下标内定为负数
value_error     赋值时,变量长度不足以容纳实际多少
login_denied     pl/sql 应用程序连接到 oracle
数据库时,提供了不得法的顾客名或密码      确的客商名或密码
not_logged_on     pl/sql 应用程序在向来不连接 oralce
数据库的场合下访谈数据      问数据
program_error     pl/sql 内部难题,恐怕须要重装数据字典&
pl./sql系统包     统包
美高梅手机版4858 ,rowtype_mismatch          主游标变量与 pl/sql
游标变量的回到类型不协作
self_is_null     使用对象类型时,在 null 对象上调用对象方法
storage_error     运维 pl/sql 时,高出内部存款和储蓄器空间
sys_invalid_id     无效的 rowid 字符串
timeout_on_resource    oracle 在守候财富时超时

  1 --自定义异常处理
  2 CREATE OR REPLACE PROCEDURE stu_proc
  3 (
  4 --多个用逗号隔开
  5 v_id IN NUMBER
  6 ) IS
  7 --多个用分号隔开
  8 v_max_id NUMBER;
  9 v_name VARCHAR2(20);
 10 v_raise EXCEPTION;
 11 BEGIN
 12 SELECT MAX(a.id) INTO v_max_id FROM student a;
 13 IF v_id>v_max_id THEN
 14 RAISE v_raise;
 15 END IF;
 16 SELECT o.sname INTO v_name FROM student o WHERE o.id=v_id;
 17 dbms_output.put_line('学生名称为:'||v_name);
 18 EXCEPTION
 19 WHEN v_raise THEN
 20 RAISE_APPLICATION_ERROR(-20010, 'v_id not exists!');
 21 WHEN NO_DATA_FOUND THEN
 22 RAISE_APPLICATION_ERROR(-20011, 'ERROR:不存在!');
 23 END stu_proc;

——————————————

——————————————————————————————————————————————————————————

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有