使用嵌套表作为过程的参数

时间:2018-02-17 09:59:31

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

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

class FeedViewModel : ViewModel() {
    // Variables, Boilerplate, ...
    val newsFeed: LiveData<List<Article>>
    private val articles = mutableListOf<Article>()

    fun loadNewsFeed() {
        // ...
        repository.loadFeed()
                   //...
                   // On success, clear the feed and append the loaded articles.
                  .subscribe({articles.clear(); articles.addAll(it)})
        // ...
    } 

    fun loadMore() {
        // ...
        repository.loadMore()
                   //...
                   // On success, append the newly loaded articles to the feed.
                  .subscribe({articles.addAll(it)}) 
        // ...
    }
}
执行

后出现

错误

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;

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

@hekko“:它不是一个关于格式化的字符串。可以从这样的应用程序传递多个值(n),并且所有值都应该立即插入到表中。

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

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