如何执行以下包含类型作为输入参数的存储过程

Posted

技术标签:

【中文标题】如何执行以下包含类型作为输入参数的存储过程【英文标题】:How to execute the following stored prcedure containing type as input parameter 【发布时间】:2012-12-21 11:16:10 【问题描述】:

我创建了一个程序来接受用户类型作为输入。谁能告诉我如何通过蟾蜍执行相同的操作? TYPE 和 PROCEDURE 详细信息如下。

CREATE OR REPLACE TYPE CER_GL_ENTRY_TYPE AS OBJECT
                  (idKey NUMBER (3),
                   shortName VARCHAR2 (15),
                   fmrCusip VARCHAR2 (15),
                   incorrectTrdShares NUMBER (10),
                   incorrectTrdPrice NUMBER (10, 2),
                   incorrectTrdBuySell VARCHAR2 (15),
                   incorrectTrdCommRate NUMBER (10, 2),
                   incorrectTrdCommission NUMBER (10, 2),
                   incorrectTrdFees NUMBER (10, 2),
                   incorrectTrdNet NUMBER (10, 2),
                   correctionTrdShares NUMBER (10, 2),
                   correctionTrdPrice NUMBER (10, 2),
                   correctionTrdBuySell VARCHAR2 (15),
                   correctionTrdCommRate NUMBER (10, 2),
                   correctionTrdCommission NUMBER (10, 2),
                   correctionTrdFees NUMBER (10, 2),
                   correctionTrdNet NUMBER (10, 2),
                   currency VARCHAR2 (15),
                   fx VARCHAR2 (15),
                   netUSD NUMBER (10, 2),
                   notes VARCHAR2 (15)
                   );

CREATE or REPLACE TYPE CER_GL_ENTRY_TYPE_LIST AS TABLE OF  CER_GL_ENTRY_TYPE;

CREATE OR REPLACE PROCEDURE GL_PROCESS_BULK_ENTRIES (p_array IN CER_GL_ENTRY_TYPE_LIST, p_status out varchar2)
AS
   v_count   NUMBER;
   row_detail CER_GL_ENTRY_TYPE;
BEGIN
   --p_arr_int := NEW array_int ();
   --p_arr_int.EXTEND (10);
   --len := p_array.COUNT;
   v_count := 0;

   FOR i IN 1 .. p_array.COUNT
   LOOP
      row_detail := p_array(i);
      DBMS_OUTPUT.put_line (row_detail.idKey);
      --p_arr_int (i) := v_count;
      v_count := v_count + 1;
      p_status := 'true';
   END LOOP;
    DBMS_OUTPUT.put_line (v_count);
    DBMS_OUTPUT.put_line (p_status);
   EXCEPTION
      WHEN OTHERS THEN
         -- handle errors here...
         dbms_output.put_line('Error: '||substr(1,255,sqlerrm));
END;
/

谁能告诉我如何执行程序 GL_PROCESS_BULK_ENTRIES?

【问题讨论】:

上述问题有一个更新,我有一个包含 bean 列表的 java 程序,该 bean 具有上面列出的相同实体。我想通过传递该 bean 的列表来调用上述存储过程。我怎样才能做到这一点? 【参考方案1】:

例如,将一些随机数据分配给表:

SQL> set serverout on
SQL> declare
  2    t_mytab  CER_GL_ENTRY_TYPE_LIST := CER_GL_ENTRY_TYPE_LIST();
  3     v_status varchar2(10);
  4  begin
  5
  6    for idx in 1..10 loop
  7      t_mytab.extend;
  8      t_mytab(t_mytab.last) := CER_GL_ENTRY_TYPE(idx, 'x', 'x', 0, 1, 'x', 1, 1, 1, 1, 1, 1, 'x', 1, 1, 1, 1, 'x', 'x', 2, 'foo');
  9    end loop;
 10
 11    GL_PROCESS_BULK_ENTRIES(t_mytab, v_status);
 12
 13  end;
 14  /
1
2
3
4
5
6
7
8
9
10
10
true

PL/SQL procedure successfully completed.

或者你可以,如果你有一个静态列表,只需分配一个:

SQL> declare
  2    t_mytab  CER_GL_ENTRY_TYPE_LIST := CER_GL_ENTRY_TYPE_LIST();
  3     v_status varchar2(10);
  4  begin
  5
  6    t_mytab := CER_GL_ENTRY_TYPE_LIST(
  7                CER_GL_ENTRY_TYPE(123, 'x', 'x', 0, 1, 'x', 1, 1, 1, 1, 1, 1, 'x', 1, 1, 1, 1, 'x', 'x', 2, 'foo'),
  8                CER_GL_ENTRY_TYPE(2, 'x', 'x', 0, 1, 'x', 1, 1, 1, 1, 1, 1, 'x', 1, 1, 1, 1, 'x', 'x', 2, 'foo')
  9              );
 10
 11    GL_PROCESS_BULK_ENTRIES(t_mytab, v_status);
 12
 13  end;
 14  /
123
2
2
true

【讨论】:

非常感谢。像魅力一样工作。 再加上你拯救了我的一天。再次感谢。

以上是关于如何执行以下包含类型作为输入参数的存储过程的主要内容,如果未能解决你的问题,请参考以下文章

如何获取作为数组工作的存储过程输出参数?

调用SQL的存储过程时怎样输入时间类型的参数

使用 NHibernate 作为带有输入参数的命名查询调用存储过程

将xml作为输入参数传递给存储过程

如何通过 SQL Developer 执行带有游标和表 OUT 参数的存储过程?

oracle存储过程输入参数能否为空