【问题标题】:Creating a stored procedure that loops around multiple values passed in for parameters创建一个存储过程,该过程循环传递给参数的多个值
【发布时间】:2018-04-11 17:56:24
【问题描述】:

所以我有一个 JAVA 程序调用一个存储过程并将数据从 XML 文件传递​​到我的存储过程中设置的参数。我尝试从 oracle 中调用存储过程,它们适用于单个值。即使有多个值,这个存储过程也能工作吗?我是否需要包含某种 FOR 循环以确保插入所有值? 以下是我的代码:

CREATE OR REPLACE PROCEDURE pega_submission_value (
    rsubmission_id   IN NUMBER,
    rvalue_tx        IN VARCHAR,
    rutc_offset      IN NUMBER,
    rdata_date       IN VARCHAR,
    rhr_utc          IN VARCHAR,
    rhr              IN TIMESTAMP,
    rhr_num          IN NUMBER,
    rdata_code       IN VARCHAR,
    rdata_type       IN VARCHAR
) IS
    v_value_id   value.value_id%TYPE;
BEGIN
    NULL;
    INSERT INTO value (
        value_id,
        product_id,
        data_source_id,
        unit_cd,
        value_tx,
        utc_offset,
        data_date,
        hr_utc,
        hr,
        hr_num,
        data_code,
        create_dt,
        create_user_id
    ) VALUES (
        NULL,
        555,
        3,
        'NA',
        rvalue_tx,
        rutc_offset,
        rdata_date,
        rhr_utc,
        rhr,
        rhr_num,
        rdata_code,
        SYSDATE,
        '15'
    ) RETURNING value_id INTO v_value_id;

    INSERT INTO submission_value (
        submission_id,
        value_id,
        form_field_id,
        create_dt,
        create_user_id,
        modify_dt,
        modify_user_id,
        effective_dt,
        inactive_dt
    ) VALUES (
        rsubmission_id,
        v_value_id,
        (
            SELECT
                form_field_id
            FROM
                form_field
            WHERE
                form_field_tx = rdata_type
        ),
        SYSDATE,
        '777',
        NULL,
        NULL,
        NULL,
        NULL
    );

    COMMIT;
END pega_submission_value;
/

【问题讨论】:

  • 您当然可以传入多个值,然后使用循环或 FORALL 语句,甚至从表(数组)中插入选择。那么问题来了:你想怎么传入多个值呢?
  • 我将如何使用循环?我真的找不到任何地方如何设置它...... :(

标签: sql oracle plsql


【解决方案1】:

如果你想将多个值插入到表中,你应该在你的 Java 中循环调用过程,或者你应该通过存储过程发送一个数组作为输入参数。

首先为记录创建一个类型:

CREATE OR REPLACE TYPE submission_value_rec AS OBJECT
(
  rsubmission_id NUMBER,
  rvalue_tx      VARCHAR,
  rutc_offset    NUMBER,
  rdata_date     VARCHAR,
  rhr_utc        VARCHAR,
  rhr            TIMESTAMP,
  rhr_num        NUMBER,
  rdata_code     VARCHAR,
  rdata_type     VARCHAR
)
/

然后创建一个类型作为类型表:

CREATE OR REPLACE TYPE submission_value_table FORCE AS TABLE OF submission_value_rec
/

然后像这样更改您的存储过程:

CREATE OR REPLACE PROCEDURE pega_submission_value(submission_values submission_value_table) IS
  v_value_id value.value_id%TYPE;
BEGIN
 FOR i IN 1 .. submission_value_table.count LOOP
INSERT INTO VALUE
  (value_id,
   product_id,
   data_source_id,
   unit_cd,
   value_tx,
   utc_offset,
   data_date,
   hr_utc,
   hr,
   hr_num,
   data_code,
   create_dt,
   create_user_id)
VALUES
  (NULL,
   555,
   3,
   'NA',
   submission_value_table(i).rvalue_tx,
   submission_value_table(i).rutc_offset,
   submission_value_table(i).rdata_date,
   submission_value_table(i).rhr_utc,
   submission_value_table(i).rhr,
   submission_value_table(i).rhr_num,
   submission_value_table(i).rdata_code,
   SYSDATE,
   '15')
RETURNING value_id INTO v_value_id;

INSERT INTO submission_value
  (submission_id,
   value_id,
   form_field_id,
   create_dt,
   create_user_id,
   modify_dt,
   modify_user_id,
   effective_dt,
   inactive_dt)
VALUES
  (submission_value_table(i).rsubmission_id,
   v_value_id,
   (SELECT form_field_id
      FROM form_field
     WHERE form_field_tx = submission_value_table(i).rdata_type),
   SYSDATE,
   '777',
   NULL,
   NULL,
   NULL,
   NULL);

COMMIT;
  END LOOP;
END pega_submission_value;

如您所见,我使用循环将值插入到表中。现在您可以在Java程序中创建一个数组,并且可以使用新的输入参数调用过程。

【讨论】:

  • 我需要指定 varchar 长度吗?
  • 我还能用那些给定的列/参数加载某种文件(csv 和/或 xml)吗?
  • 另外,我注意到 proc 不再具有我最初拥有的所有参数,我现在如何传递它们?或者当您列出“submission_values”时,您指的是我最初列出的参数吗?
  • adilkun 建议您传入一个对象类型数组,而不是传入单个参数。数组中的每个元素都是一个包含多个属性的实例,与您列出的参数相匹配。是的,就对象类型声明而言,切换到 VARCHAR2 并指定最大长度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
  • 2020-07-13
  • 2013-08-29
  • 2021-11-23
  • 2022-11-01
  • 2015-08-24
相关资源
最近更新 更多