在PL/SQL中调用Oracle ERP请求(一)-提交单个请求

      最近开发一个从PLM系统中通过工作流程向ORACLE ERP系统中导入项目信息的程序,Oracle ERP系统有独立的请求模块,所以这样我们只需调用到ERP模块中的请求即可,由于PLM系统用的是windchill,底层代码是JAVA程序,并且从PLM系统中导出的数据需要经过验证后才能正式导入ERP,所以采用了使用JAVA调用存储过程的方式,过程为:

      1. PLM导出文件流数据;

      2. PLM系统导出数据导入Oracle ERP系统中临时表;

      3. 验证临时表中数据;

      4. 临时表导入ERP接口表;

      5. 提交单个请求或请求集。

 

       下面是如何提交单个请求代码,希望对大家有帮助。网络上有些文章在对参数是否作为子请求提交解释有错误,大家在使用时建议多看一下Oracle官方文档,以免使用过程中造成错误。

 

PROCEDURE prc_do_import_request(prm_org     IN NUMBER,
                                  prm_appcode OUT NUMBER,
                                  prm_appmsg  OUT VARCHAR2) IS
    custom_exception EXCEPTION;
    success        BOOLEAN;
    v_request_id   NUMBER;
    v_phase        VARCHAR2(30);
    v_status       VARCHAR2(30);
    v_dev_phase    VARCHAR2(30);
    v_dev_status   VARCHAR2(30);
    v_message      VARCHAR2(1000);
    v_request_flag BOOLEAN;
    v_start_time   VARCHAR2(30);
  BEGIN
    prm_appcode := 0;
    --初始化设置
    fnd_global.apps_initialize(user_id      => global_user_id,--用户ID
                               resp_id      => global_resp_id,          --责任ID  
                               resp_appl_id => global_resp_appl_id);   --应用ID
    --设置打印参数
    success := fnd_request.set_print_options(printer => global_printer,
                                             style   => global_style,
                                             copies  => global_copies);
    IF NOT success THEN
      RAISE custom_exception;
    END IF;
    v_start_time := to_char(SYSDATE, 'DD-MON-YYYY HH24:MI:SS');
    --调用请求
    v_request_id := fnd_request.submit_request('INV',   --应用
                                               'INCOIN',                  --程序
                                               '',                              --程序说明
                                               v_start_time,               --开始时间
                                               FALSE,                        --是否作为子请求提交,该请求如果是被其它请求调用设为TRUE,否则为FALSE
                                               prm_org,                    --自定义参数1:组织机构
                                               '1',                             --自定义参数2 :
                                               '1',                             --自定义参数3:
                                               '1',                             --自定义参数4:
                                               '1',                             --自定义参数5:
                                               '1',                             --自定义参数6:
                                               '1',                             --自定义参数7:
                                               chr(0));                       --结束标识
    IF v_request_id = 0 THEN
      RAISE custom_exception;
    ELSE
      COMMIT;
    END IF;
    --等待
    v_request_flag := fnd_concurrent.wait_for_request(request_id => v_request_id,--返回的请求ID
                                                      INTERVAL   => 5,                                     --重复检测时间差
                                                      max_wait   => 0,                                       --最长等待时间,0为一直等待  
                                                      phase      => v_phase,                                                          
                                                      status     => v_status,
                                                      dev_phase  => v_dev_phase,
                                                      dev_status => v_dev_status,
                                                      message    => v_message);
    IF v_request_flag THEN
      IF v_dev_status = 'NORMAL' THEN
        NULL;
      ELSE
        RAISE custom_exception;
      END IF;
    ELSE
      RAISE custom_exception;
    END IF;
  EXCEPTION
    WHEN custom_exception THEN
      prm_appcode := -1;
      prm_appmsg  := '错误提示:导入ERP正式表出错!' || SQLERRM;
    WHEN OTHERS THEN
      prm_appcode := -1;
      prm_appmsg  := '错误提示:导入ERP正式表出错!' || SQLERRM;
  END prc_do_import_request;
 

 

 

 

 

 

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在Java调用OraclePL/SQL可以使用JDBC(Java Database Connectivity) API。以下是一个简单的示例代码,演示如何使用JDBC调用Oracle的存储过程: ```java import java.sql.*; public class PLSQLExample { public static void main(String[] args) { try { // 加载Oracle JDBC驱动程序 Class.forName("oracle.jdbc.driver.OracleDriver"); // 建立数据库连接 Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "username", "password"); // 创建CallableStatement对象 CallableStatement stmt = conn.prepareCall("{ call my_stored_procedure(?, ?, ?) }"); // 设置输入参数 stmt.setString(1, "input_param1_value"); stmt.setInt(2, 123); // 注册输出参数 stmt.registerOutParameter(3, java.sql.Types.VARCHAR); // 执行存储过程 stmt.execute(); // 获取输出参数值 String outputValue = stmt.getString(3); System.out.println("Output Value: " + outputValue); // 关闭连接和语句 stmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 在这个示例,我们首先加载Oracle JDBC驱动程序,并使用`DriverManager`类建立一个数据库连接。然后,我们创建一个`CallableStatement`对象,并将存储过程的调用语句作为参数传递给它。接下来,我们设置输入参数的值,并使用`registerOutParameter()`方法注册输出参数。然后,我们执行存储过程并使用`getString()`方法获取输出参数的值。最后,我们关闭连接和语句。 请注意,这个示例假设你已经有一个名为“my_stored_procedure”的存储过程在Oracle,并且该存储过程有一个输入参数和一个输出参数。如果你想在实际项目使用这个示例代码,请根据你的需求修改代码的参数和存储过程名。 ### 回答2: 以下是一个简单的Java代码示例,演示了如何使用Java JDBC来调用OraclePL/SQL过程: ```java import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class CallPLSQLProcedure { public static void main(String[] args) { Connection conn = null; CallableStatement cs = null; try { // 连接到Oracle数据库 conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "用户名", "密码"); // 准备调用PL/SQL过程的语句 String sql = "{call PROCEDURE_NAME(?, ?)}"; // 替换为实际的存储过程名 // 创建CallableStatement对象 cs = conn.prepareCall(sql); // 设置输入参数的值 cs.setInt(1, 123); // 替换为实际的输入参数值 // 注册输出参数的数据类型 cs.registerOutParameter(2, java.sql.Types.VARCHAR); // 替换为实际的输出参数类型 // 执行存储过程 cs.execute(); // 获取输出参数的值 String output = cs.getString(2); // 替换为实际的输出参数位置 System.out.println("输出参数的值为:" + output); } catch (SQLException e) { e.printStackTrace(); } finally { try { // 关闭连接和语句对象 if (cs != null) { cs.close(); } if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } } } ``` 注意替换代码的以下部分: 1. `"jdbc:oracle:thin:@localhost:1521:XE"`:替换为实际的Oracle数据库连接字符串。 2. `"用户名"`和`"密码"`:替换为实际的数据库用户名和密码。 3. `"PROCEDURE_NAME"`:替换为实际的PL/SQL存储过程名。 4. `setInt(1, 123)`:根据实际情况设置输入参数的值。 5. `registerOutParameter(2, java.sql.Types.VARCHAR)`和`getString(2)`:根据实际情况设置和获取输出参数的值。 这是一个简单的示例,根据实际需求,你可能需要进行更多的参数设置和结果处理。 ### 回答3: 在Java,可以使用JDBC来连接和操作Oracle数据库,并调用OraclePL/SQL过程。以下是一个简单的示例代码,通过Java代码调用Oracle数据库PL/SQL过程: import java.sql.*; public class OraclePLSQL { public static void main(String[] args) { // 定义数据库连接信息 String url = "jdbc:oracle:thin:@localhost:1521/xe"; // 指定数据库连接URL String user = "<your_username>"; // 替换为您的数据库用户名 String password = "<your_password>"; // 替换为您的数据库密码 // 定义Oracle PL/SQL过程调用语句 String plsql = "{call YOUR_PLSQL_PROCEDURE (?, ?, ?)}"; // 替换为您的PL/SQL过程名 try { // 加载Oracle JDBC驱动程序 Class.forName("oracle.jdbc.driver.OracleDriver"); // 建立数据库连接 Connection conn = DriverManager.getConnection(url, user, password); // 创建CallableStatement对象,用于调用PL/SQL过程 CallableStatement cs = conn.prepareCall(plsql); // 设置输入参数 cs.setString(1, "input1"); // 替换为您的输入参数1 cs.setString(2, "input2"); // 替换为您的输入参数2 // 注册输出参数 cs.registerOutParameter(3, Types.VARCHAR); // 替换为您的输出参数 // 执行PL/SQL过程调用 cs.execute(); // 获取输出参数的值 String output = cs.getString(3); System.out.println("Output: " + output); // 输出参数值 // 关闭数据库连接 cs.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } } 上述代码示例,您需要将url、user、password分别替换为您的数据库连接信息;将plsql替换为您要调用PL/SQL过程名;并根据需求设置输入参数和注册输出参数。然后,您可以执行Java代码,以实现对Oracle数据库PL/SQL过程的调用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翟心仁厚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值