知识库 : 语义模型中调用存储过程

摘要:

  • 语义模型中调用存储过程两种方式
  • 两中调用方式的比较
  • 数据加工中调用存储过程
    • 数据加工中调用存储过程步骤
    • 数据加工调用存储过程代码修改示例
  • 使用存储过程提供者
    • 使用存储过程提供者步骤

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

  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;

自动生成的代码框架:

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;
}
}

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

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()+"");

使用存储过程提供者

使用存储过程提供者步骤

  1. 在语义模型业务数据中选择存储过程提供者
  2. 在存储过程参照中选择存储过程,确定,下一步
  3. 选择参数类型
  4. 设置参数值,下一步
  5. 存储过程被预执行一遍,显示元数据
  6. 存储过程提供者定义完毕
  7. (可选)点击语义模型中完成,预览语义模型,得到存储过程执行结果