NC—语义模型调用存储过程(转)
语义模型中调用存储过程两种方式
- 数据加工中调用存储过程
- 使用存储过程提供者
两中调用方式的比较
- 数据加工中调用存储过程
- 对使用者要求较高
- 要求使用者了解简单的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;
自动生成的代码框架:
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()+"");
使用存储过程提供者
使用存储过程提供者步骤
- 在语义模型业务数据中选择存储过程提供者
- 在存储过程参照中选择存储过程,确定,下一步
- 选择参数类型
- 设置参数值,下一步
- 存储过程被预执行一遍,显示元数据
- 存储过程提供者定义完毕
- (可选)点击语义模型中完成,预览语义模型,得到存储过程执行结果