0

我有一个表 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:
4

2 回答 2

2
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;
于 2018-02-17T12:10:11.197 回答
0

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

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

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

于 2018-02-17T16:46:02.080 回答