zoukankan      html  css  js  c++  java
  • NC—语义模型调用存储过程(转)

    语义模型中调用存储过程两种方式

    1. 数据加工中调用存储过程
    2. 使用存储过程提供者

    两中调用方式的比较

    • 数据加工中调用存储过程
      1. 对使用者要求较高
        1. 要求使用者了解简单的Java语法
        2. 要求使用者对使用JDBC调用存储过程的代码有一定了解
        3. 如果使用Oracle的Cursor返回结果集需要自己修改代码
      2. 使用灵活,可以任意修改代码
    • 使用存储过程提供者
      1. 对使用者要求低,直接选择存储过程,设置输入参数
      2. 处理逻辑固定,不能修改
        1. 输入参数支持语义模型参数、宏变量、常量
        2. 输出参数处理逻辑固定,输出参数中有ResultSet直接返回第一个ResultSet转成的DataSet,输出参数中没有ResultSet每个输出参数对应DataSet中一列

    数据加工中调用存储过程

    数据加工中调用存储过程步骤

    1. 使用数据加工代码向导中的调用存储过程
    2. 在存储过程参照中选择要调用的存储过程,点击确定
    3. 修改生成的代码框架
      1. 为输入参数赋值
      2. 处理输出参数
      3. 如果有需要,可以修改其他部分的代码

    数据加工调用存储过程代码修改示例

    存储过程定义:

    CREATE OR REPLACE PROCEDURE "AE_DESIGN"."TEST_MICHAEL"(P_USERID IN VARCHAR2,
    P_SALARY IN NUMBER,
    P_COUNT OUT NUMBER) IS
    V_SALARY NUMBER := P_SALARY;
    BEGIN
    IF V_SALARY IS NULL THEN
    V_SALARY := 0;
    END IF;
    IF P_USERID IS NULL THEN
    SELECT COUNT(*)
    INTO P_COUNT
    FROM TMP_MICHAEL T
    WHERE T.SALARY >= V_SALARY;
    ELSE
    SELECT COUNT(*)
    INTO P_COUNT
    FROM TMP_MICHAEL T
    WHERE T.SALARY >= V_SALARY
    AND T.USER_ID LIKE '%' || P_USERID || '%';
    END IF;
    DBMS_OUTPUT.PUT_LINE('v_count=:' || P_COUNT);
    END TEST_MICHAEL;
    View Code

    自动生成的代码框架:

    String dsName = "design";
    String sp = "{call TEST_MICHAEL(?,?,?)}";
    
    // 参数名:P_USERID 参数类型:IN 数据类型:java.sql.Types.VARCHAR
    java.lang.String P_USERID = ;
    // 参数名:P_SALARY 参数类型:IN 数据类型:java.sql.Types.DECIMAL
    java.math.BigDecimal P_SALARY = ;
    // 参数名:P_COUNT 参数类型:OUT 数据类型:java.sql.Types.DECIMAL
    java.math.BigDecimal P_COUNT;
    
    nc.jdbc.framework.PersistenceManager persist = null;
    java.sql.CallableStatement stmt = null;
    try {
    dsName = uap.pub.ae.datasource.DataSourceCache.getPhysicalDSName(dsName);
    persist = uap.bs.ae.datasource.DataSourceManager.getInstance().getPersistenceManager(dsName);
    stmt = persist.getJdbcSession().getConnection().prepareCall(sp);
    // 设置参数
    stmt.setString(1, P_USERID);
    stmt.setBigDecimal(2, P_SALARY);
    stmt.registerOutParameter(3, java.sql.Types.DECIMAL);
    // 执行存储过程
    stmt.execute();
    // 获取输出参数值
    P_COUNT = stmt.getBigDecimal(3);
    } catch (Exception e) {
    // TODO 异常处理
    } finally {
    try {
    if (stmt != null) {
    stmt.close();
    }
    if (persist != null) {
    persist.release();
    }
    } catch (Exception e) {
    // TODO 异常处理
    } finally {
    stmt = null;
    }
    }
    View Code

    修改之后的最终代码(粗体红字为增加的代码):

    String dsName = "design";
    String sp = "{call TEST_MICHAEL(?,?,?)}";
    
    // 参数名:P_USERID 参数类型:IN 数据类型:java.sql.Types.VARCHAR
    java.lang.String P_USERID = null;
    // 参数名:P_SALARY 参数类型:IN 数据类型:java.sql.Types.DECIMAL
    java.math.BigDecimal P_SALARY = new java.math.BigDecimal(5000);
    // 参数名:P_COUNT 参数类型:OUT 数据类型:java.sql.Types.DECIMAL
    java.math.BigDecimal P_COUNT = null;
    
    nc.jdbc.framework.PersistenceManager persist = null;
    java.sql.CallableStatement stmt = null;
    try {
    dsName = uap.pub.ae.datasource.DataSourceCache.getPhysicalDSName(dsName);
    persist = uap.bs.ae.datasource.DataSourceManager.getInstance().getPersistenceManager(dsName);
    stmt = persist.getJdbcSession().getConnection().prepareCall(sp);
    // 设置参数
    stmt.setString(1, P_USERID);
    stmt.setBigDecimal(2, P_SALARY);
    stmt.registerOutParameter(3, java.sql.Types.DECIMAL);
    // 执行存储过程
    stmt.execute();
    // 获取输出参数值
    P_COUNT = stmt.getBigDecimal(3);
    } catch (Exception e) {
    // TODO 异常处理
    } finally {
    try {
    if (stmt != null) {
    stmt.close();
    }
    if (persist != null) {
    persist.release();
    }
    } catch (Exception e) {
    // TODO 异常处理
    } finally {
    stmt = null;
    }
    }
    setResultSQL("select * from sm_user where rownum < "+P_COUNT.intValue()+"");
    View Code

    使用存储过程提供者

    使用存储过程提供者步骤

      1. 在语义模型业务数据中选择存储过程提供者
      2. 在存储过程参照中选择存储过程,确定,下一步
      3. 选择参数类型
      4. 设置参数值,下一步
      5. 存储过程被预执行一遍,显示元数据
      6. 存储过程提供者定义完毕
      7. (可选)点击语义模型中完成,预览语义模型,得到存储过程执行结果
        1. 参考链接:http://doc.yonyoucloud.com/doc/ae/919807.html
  • 相关阅读:
    python 快速排序详述
    GitHub 小试牛刀(踩坑记录)
    python 内部类
    Django1.11搭建一个简易上传显示图片的后台
    Ubuntu16.04卸载opencv2.4.9并安装opencv3.2.0+contrib
    OpenCV4Android背景建模(MOG、MOG2)
    CentOS7.3安装NVIDIA-1080ti驱动、cuda、cudnn、TensorFlow
    TensorFlow Object Detection API(Windows下测试)
    关于git常见的一些问题
    聊聊Java中的反射(一)
  • 原文地址:https://www.cnblogs.com/zs-chenkang/p/13965171.html
Copyright © 2011-2022 走看看