【问题标题】:using nested table as in Parameter to a Procedure使用嵌套表作为过程的参数
【发布时间】:2018-02-17 09:59:31
【问题描述】:

我有一个表 T1,我想通过一个使用集合的过程一次插入多行。我已经编写了代码,但是当我尝试执行它时会引发错误。请指教。

create table t1 ( id number , name varchar2(10));
/

create or replace PACKAGE PKG1 AS
   TYPE TAB_LIST IS TABLE OF T1%ROWTYPE;
   PROCEDURE PROC1 (p_val IN TAB_LIST);
END PKG1;
/

create or replace PACKAGE BODY PKG1 AS
PROCEDURE PROC1 (P_VAL IN TAB_LIST
                )
IS
BEGIN
    FOR i IN p_val.FIRST..p_val.LAST
    LOOP
        insert  INTO T1
            (
              id, name
            )
        VALUES
            (
              p_val(i).id,
              p_val(i).name
            );
        END LOOP;
    END;
END;

执行后出错

DECLARE
    p_val PKG1.TAB_LIST;
BEGIN
    p_val := PKG1.TAB_LIST(123,'XYZ');
END;

Error report -
ORA-06550: line 5, column 11:
PLS-00306: wrong number or types of arguments in call to 'TAB_LIST'
ORA-06550: line 5, column 11:
PLS-00306: wrong number or types of arguments in call to 'TAB_LIST'
ORA-06550: line 5, column 2:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

【问题讨论】:

  • tab_listT1%ROWTYPE 的集合,因此其中的每个项目都需要是T1%ROWTYPE,但您传递的是123XYZ
  • 那么我需要在这里传递什么值?
  • 谢谢 Hekko .. 我怎样才能一次传递多条记录... DECLARE P_VAL PKG1.TAB_LIST := PKG1.TAB_LIST();开始 P_VAL.extend; P_VAL(1).id := 123,456; P_VAL(1).name := 'XYZ','ABC'; PKG1.PROC1(P_VAL);结束;

标签: plsql user-defined-types plsql-package


【解决方案1】:
DECLARE
    P_VAL PKG1.TAB_LIST := PKG1.TAB_LIST();
BEGIN
    P_VAL.extend;
    P_VAL(1).id := 123;
    P_VAL(1).name := 'XYZ';
    PKG1.PROC1( P_VAL );
END;

多条记录示例:

DECLARE
    P_VAL PKG1.TAB_LIST := PKG1.TAB_LIST();
BEGIN
    for i in 1 .. 10
    loop
        P_VAL.extend;
        P_VAL(P_VAL.LAST).id := i;
        P_VAL(P_VAL.LAST).name := 'XYZ' || i;
    end loop;
    PKG1.PROC1( P_VAL );
END;

【讨论】:

  • 以传递多条记录为例编辑答案
  • 再次感谢 .. 但我想传递这样的内容,以便所有三个或更多都应该插入表 t1 .. 123 'AAA' 345 'VVV' 678 'XXX'
  • 您能否发布包含多条记录的源数据格式。是数据库表还是字符串?
  • @kashi :您显示的需要传递的值不是嵌套表,而是字符串。如果您为了方便而希望以这种方式发送并期望 Oracle 自己显式地将字符串转换为嵌套表,那是不可能的。您必须像上面那样编写代码来设置 id 和 name 的值,或者使用 REFCURSOR。使用可用的数据明确您最终想要实现的目标,不要每次都改变问题。
  • 以其他方式,您可以: 1) 为每一行多次调用带有普通参数的 proc。它很慢,但有时很正常 2)当最终在生产表中插入时,在临时表中插入数据 3)在您的 proc 中解析时,作为 clob 参数结构化数据传递,例如在 xml 或 json 中。
【解决方案2】:

@hekko": 它不是一个字符串。抱歉格式化。多个值 (n) 可以像这样从应用程序传递,并且应该一次插入到表中。

123  'XYZ'
456  'DFK'
866  'HKK'

@Kaushik:这不是字符串,而是格式问题.. 问题还是一样“我有一个表 T1,我想通过使用集合的过程一次插入多行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    相关资源
    最近更新 更多