`

Trail: JDBC(TM) Database Access(2)

 
阅读更多
package com.oracle.tutorial.jdbc;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;

public class StoredProcedureMySQLSample {

 private String dbName;
 private Connection con;
 private String dbms;

 public StoredProcedureMySQLSample(Connection connArg, String dbName,
 String dbmsArg) {
 super();
 this.con = connArg;
 this.dbName = dbName;
 this.dbms = dbmsArg;
 }
 
 public void createProcedureRaisePrice() throws SQLException {//新建存储过程
 
 String createProcedure = null;

 String queryDrop = "DROP PROCEDURE IF EXISTS RAISE_PRICE";

 createProcedure =
 "create procedure RAISE_PRICE(IN coffeeName varchar(32), IN maximumPercentage float, INOUT newPrice numeric(10,2)) " +
 "begin " +
 "main: BEGIN " +
 "declare maximumNewPrice numeric(10,2); " +
 "declare oldPrice numeric(10,2); " +
 "select COFFEES.PRICE into oldPrice " +//读取原价格
 "from COFFEES " +
 "where COFFEES.COF_NAME = coffeeName; " +
 "set maximumNewPrice = oldPrice * (1 + maximumPercentage); " +
 "if (newPrice > maximumNewPrice) " +
 "then set newPrice = maximumNewPrice; " +
 "end if; " +
 "if (newPrice <= oldPrice) " +
 "then set newPrice = oldPrice;" +
 "leave main; " +
 "end if; " +
 "update COFFEES " +
 "set COFFEES.PRICE = newPrice " +//写入新价格
 "where COFFEES.COF_NAME = coffeeName; " +
 "select newPrice; " +
 "END main; " +
 "end";
 
 Statement stmt = null;
 Statement stmtDrop = null;

 try {
 System.out.println("Calling DROP PROCEDURE");
 stmtDrop = con.createStatement();
 stmtDrop.execute(queryDrop);
 } catch (SQLException e) {
 JDBCTutorialUtilities.printSQLException(e);
 } finally {
 if (stmtDrop != null) { stmtDrop.close(); }
 }


 try {
 stmt = con.createStatement();
 stmt.executeUpdate(createProcedure);
 } catch (SQLException e) {
 JDBCTutorialUtilities.printSQLException(e);
 } finally {
 if (stmt != null) { stmt.close(); }
 }

 
 }
 
 
 public void createProcedureGetSupplierOfCoffee() throws SQLException {

 String createProcedure = null;

 String queryDrop = "DROP PROCEDURE IF EXISTS GET_SUPPLIER_OF_COFFEE";

 createProcedure =
 "create procedure GET_SUPPLIER_OF_COFFEE(IN coffeeName varchar(32), OUT supplierName varchar(40)) " +
 "begin " +
 "select SUPPLIERS.SUP_NAME into supplierName " +
 "from SUPPLIERS, COFFEES " +
 "where SUPPLIERS.SUP_ID = COFFEES.SUP_ID " +
 "and coffeeName = COFFEES.COF_NAME; " +
 "select supplierName; " +
 "end";
 Statement stmt = null;
 Statement stmtDrop = null;

 try {
 System.out.println("Calling DROP PROCEDURE");
 stmtDrop = con.createStatement();
 stmtDrop.execute(queryDrop);
 } catch (SQLException e) {
 JDBCTutorialUtilities.printSQLException(e);
 } finally {
 if (stmtDrop != null) { stmtDrop.close(); }
 }


 try {
 stmt = con.createStatement();
 stmt.executeUpdate(createProcedure);
 } catch (SQLException e) {
 JDBCTutorialUtilities.printSQLException(e);
 } finally {
 if (stmt != null) { stmt.close(); }
 }
 }
 

 public void createProcedureShowSuppliers() throws SQLException {
 String createProcedure = null;

 String queryDrop = "DROP PROCEDURE IF EXISTS SHOW_SUPPLIERS";

 createProcedure =
 "create procedure SHOW_SUPPLIERS() " +
 "begin " +
 "select SUPPLIERS.SUP_NAME, COFFEES.COF_NAME " +
 "from SUPPLIERS, COFFEES " +
 "where SUPPLIERS.SUP_ID = COFFEES.SUP_ID " +
 "order by SUP_NAME; " +
 "end";
 Statement stmt = null;
 Statement stmtDrop = null;

 try {
 System.out.println("Calling DROP PROCEDURE");
 stmtDrop = con.createStatement();
 stmtDrop.execute(queryDrop);
 } catch (SQLException e) {
 JDBCTutorialUtilities.printSQLException(e);
 } finally {
 if (stmtDrop != null) { stmtDrop.close(); }
 }


 try {
 stmt = con.createStatement();
 stmt.executeUpdate(createProcedure);
 } catch (SQLException e) {
 JDBCTutorialUtilities.printSQLException(e);
 } finally {
 if (stmt != null) { stmt.close(); }
 }
 }

public void runStoredProcedures(String coffeeNameArg, float maximumPercentageArg, float newPriceArg) throws SQLException {
    CallableStatement cs = null;

    try {
      
      System.out.println("\nCalling the procedure GET_SUPPLIER_OF_COFFEE");
      cs = this.con.prepareCall("{call GET_SUPPLIER_OF_COFFEE(?, ?)}");//存储过程语句
      cs.setString(1, coffeeNameArg);//in的跟以前一样赋值
      cs.registerOutParameter(2, Types.VARCHAR);//执行前先注册out参数
      cs.executeQuery();//执行
            
      String supplierName = cs.getString(2);//获取结果,out参数为第二个
      
      if (supplierName != null) {
        System.out.println("\nSupplier of the coffee " + coffeeNameArg + ": " + supplierName);          
      } else {
        System.out.println("\nUnable to find the coffee " + coffeeNameArg);        
      }
      
      System.out.println("\nCalling the procedure SHOW_SUPPLIERS");
      cs = this.con.prepareCall("{call SHOW_SUPPLIERS}");
      ResultSet rs = cs.executeQuery();

      while (rs.next()) {
        String supplier = rs.getString("SUP_NAME");
        String coffee = rs.getString("COF_NAME");
        System.out.println(supplier + ": " + coffee);
      }
      
      System.out.println("\nContents of COFFEES table before calling RAISE_PRICE:");
      CoffeesTable.viewTable(this.con);
      
      System.out.println("\nCalling the procedure RAISE_PRICE");
      cs = this.con.prepareCall("{call RAISE_PRICE(?,?,?)}");
      cs.setString(1, coffeeNameArg);
      cs.setFloat(2, maximumPercentageArg);
      cs.registerOutParameter(3, Types.NUMERIC);//inout类型的也要注册
      cs.setFloat(3, newPriceArg);
      
      cs.execute();//如果不确定会返回几个ResultSet就用这个
      
      System.out.println("\nValue of newPrice after calling RAISE_PRICE: " + cs.getFloat(3));
      
      System.out.println("\nContents of COFFEES table after calling RAISE_PRICE:");
      CoffeesTable.viewTable(this.con);
      


    } catch (SQLException e) {
      JDBCTutorialUtilities.printSQLException(e);
    } finally {
      if (cs != null) { cs.close(); }
    }
  }

 

关于RowSet和几个不常见类型(略) (mysql没有,oracle有)

 

用Swing界面展现结果(略)

 

 

分享到:
评论

相关推荐

    vsce-sourcetrail:VS Code Extension使编辑器与Sourcetrail同步-Source code editor

    VS代码的Sourcetrail扩展 此扩展使VS Code可以与进行通信 链接 项目主页,新闻: 说明文件: 下载,评论: 代码,问题: 特征 插件设置 通过上下文菜单将VS Code中的位置发送到Sourcetrail 显示插件是否连接...

    technoutlarsh-trail:现在不行

    2. **学习曲线**:对于新接触JavaScript的团队,Vue.js通常因其易学性和直观的API而受到青睐。 3. **社区支持**:React和Angular拥有庞大的社区,提供丰富的资源和解决方案,但较小的框架可能更新更快,风险也相对较...

    Trail:Scala平台的路由库

    Trail 是一个专为 Scala 平台设计的轻量级路由库,主要应用于 Web 开发领域。它提供了简洁、高效的 API,使得开发者能够方便地构建和管理应用的路由规则。Trail 的设计目标是零依赖,这意味着它不依赖任何外部库,这...

    sequelize-paper-trail:Sequelize插件,用于跟踪模型实例的修订历史记录

    续篇论文集 想要的帮助:请尝试sequelize-paper-trail@3.0.0-rc.6并给 :...const sequelize = new Sequelize ( 'database' , 'username' , 'password' ) ; 然后添加Sequelize Paper Trail很简单: const PaperTrail =

    trail:Trail 是一个协作的实时任务管理环境

    Trail 是一个协作的实时任务管理环境。 堆 Trail 的客户端使用 AngularJS 构建,使用 Firebase 作为持久性服务。 Trail 还使用 NodeJS 服务器来存储附加(外围)数据。 服务 Firebase:用于获得实时用户体验。 所有...

    proton_trail:Godot引擎的3D Trail附加组件

    ProtonTrail-Godot的3D Trail插件 概述 Godot Engine的3D Trail自​​定义节点 在运行时生成 可调分辨率 它只是一个网格,因此您可以在其上应用自己的材料 如何使用 将存储addons到您的addons文件夹 转到Project ...

    vim-sourcetrail:用于与Sourcetrail通信的Vim插件

    vim-sourcetrail Vim插件可将光标位置与同步。 安装 使用您选择的插件管理器。 git clone https://github.com/CoatiSoftware/vim-sourcetrail ~/.vim/bundle/vim-sourcetrail 将Plugin 'CoatiSoftware/vim-source...

    trail:审核跟踪日志服务

    Trail是一种模块化且灵活的审核跟踪日志服务。 特征 作为独立服务器运行或扩展现有服务 具有灵活架构的Postgres后端 REST和GraphQL接口 支持Fastify和Hapi框架 文献资料 完整文档可在或docs/文件夹中找到。 执照 ...

    matlabauc代码-Trail:踪迹

    该matlab代码包含2个演示: “ demo_tr_te_CI”:matlab代码,通过使用differnet特征选择方法和机器学习分类器来计算交叉组合的诊断性能。 “ demo_heatmap_CI”:matlab代码,用于准备AUC,测试误差,灵敏度和绘制...

    Paper-Trail:OSU Hackathon 2021年Spring

    "Paper-Trail: OSU Hackathon 2021年Spring"是一个编程竞赛项目,可能由俄亥俄州立大学(OSU)的学生在2021年春季黑客马拉松活动中创建。项目名称“纸足迹”暗示它可能关注的是数据跟踪、环境保护或信息记录方面的...

    trail:这是一个用于跟踪的存储库 - 一种跟踪日志的新方法

    这是一个用于跟踪的存储库 - 一...启动 Trail 的步骤: cd kibana/样品 节点服务器.js 转到浏览器并启动: 笔记: 确保 elastic-search 在 localhost:9200 上运行 在elastic-search中保留一些数据以便能够开始查询

    ML-model-deployment-trail:通过在heroku上部署来测试Web API

    2. **准备项目**:确保你的项目结构符合Heroku的部署要求。通常,这需要一个`Procfile`,它定义了应用启动时应执行的命令。对于Python项目,可能还需要一个`requirements.txt`文件,列出所有依赖库及其版本。 3. **...

    trail:将Laravel命名路由导出到JavaScript的另一种尝试

    踪迹该软件包将公开一个@trail刀片指令,您可以将其包含在主刀片或布局文件中。 此刀片指令公开了一个Trail JavaScript对象,该对象包含config和应用程序具有的命名路由的集合。 如果您知道我的意思,该指令还公开了...

    yii-audittrail:AuditTrail Yii Extension的分支

    审计足迹这基本上是对在上进行的先前扩展的修改。...第2步该安装表了。 您可以使用此扩展的原始作者提供的迁移文件,也可以使用迁移文件夹中捆绑SQL文件。 只需在您的数据库服务器上运行它(使用PHPMyAd

    eulerian-trail:Hierholzer算法的实现,以在图中查找欧拉轨迹

    $ npm install --save eulerian-trail 用法 var eulerianTrail = require ( 'eulerian-trail' ) ; eulerianTrail ( { edges : [ [ 0 , 1 ] , [ 1 , 2 ] , [ 2 , 3 ] , [ 3 , 6 ] , [ 6 , 7 ] , [ 7 , 10 ] ,...

    D3-trail:D3 的路径布局

    D3 步道布局 这是用于在 D3 中创建路径的布局函数,其中(与原生 d3.svg.line() 元素不同)您需要将特定的美学应用到行的每个元素。 演示 最初的用例是具有衰减不透明度的轨迹来表示运动:这是一个示例图像: (即将...

    paper_trail:跟踪对Rails模型的更改

    paper_trail 科 Ruby 活动记录 未发行 主 &gt; = 2.5.0 &gt; = 5.2,&lt;6&gt; = 2.4.0 &gt; = 5.2,&lt;6&gt; = 2.3.0 &gt; = 4.2,&lt;6&gt; = 2.3.0 &gt; = 4.2,&lt;5&gt; = 2.2.0 &gt; = 4.2,&lt;5&gt; = 2.1.0 &gt; = 4.0,&lt;5&gt; = 1.9.3 &gt; = 4.0,&lt;5&gt; = ...

    paper_trail:使用Ecto跟踪并记录数据库中的所有更改。 恢复到历史记录中的任何时间

    当启用`paper_trail`后,每当你调用`Repo.insert/2`, `Repo.update/2`或`Repo.delete/2`,它都会自动创建一个新的版本记录。这些版本记录存储在`paper_trail`配置中指定的版本表中。你可以通过`PaperTrail.version_...

    Washington_Trail:该存储库适用于我们的Digital Humanities 1030课程

    2. CSS 文件:这些文件定义了页面的样式,如颜色、布局和字体,使得网站具有更好的视觉效果。 3. JavaScript 文件:可能用于添加交互功能,比如地图的缩放和平移,以及点击事件触发的信息弹出。 4. 图像和媒体文件:...

    blockchain-audit-trail::magnifying_glass_tilted_left:演示应用程序展示了针对以太坊区块链进行验证的审计跟踪

    区块链审计追踪 该存储库包含一个分支,在其顶部构建了概念验证的区块链审计跟踪实现。 该区块链审计追踪是我在阿姆斯特丹大学验证审计追踪数据的学士论文的一部分。 该论文的完整版本可,该实现的演示视频可在获得...

Global site tag (gtag.js) - Google Analytics