语义模型中调用存储过程两种方式
- 数据加工中调用存储过程
- 使用存储过程提供者
两中调用方式的比较
- 数据加工中调用存储过程
- 对使用者要求较高
- 要求使用者了解简单的Java语法
- 要求使用者对使用JDBC调用存储过程的代码有一定了解
- 如果使用Oracle的Cursor返回结果集需要自己修改代码
- 使用灵活,可以任意修改代码
- 使用存储过程提供者
- 对使用者要求低,直接选择存储过程,设置输入参数
- 处理逻辑固定,不能修改
- 输入参数支持语义模型参数、宏变量、常量
- 输出参数处理逻辑固定,输出参数中有ResultSet直接返回第一个ResultSet转成的DataSet,输出参数中没有ResultSet每个输出参数对应DataSet中一列
数据加工中调用存储过程
数据加工中调用存储过程步骤
- 使用数据加工代码向导中的调用存储过程
- 在存储过程参照中选择要调用的存储过程,点击确定
- 修改生成的代码框架
- 为输入参数赋值
- 处理输出参数
- 如果有需要,可以修改其他部分的代码
数据加工调用存储过程代码修改示例
存储过程定义:
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
使用存储过程提供者
使用存储过程提供者步骤
- 在语义模型业务数据中选择存储过程提供者
- 在存储过程参照中选择存储过程,确定,下一步
- 选择参数类型
- 设置参数值,下一步
- 存储过程被预执行一遍,显示元数据
- 存储过程提供者定义完毕
- (可选)点击语义模型中完成,预览语义模型,得到存储过程执行结果
-
- 参考链接:http://doc.yonyoucloud.com/doc/ae/919807.html