【问题标题】:Associative array loop and call stored procedure PL/SQL关联数组循环和调用存储过程PL/SQL
【发布时间】:2016-11-04 15:07:58
【问题描述】:

我正在使用 oracle,我从 C# 获得了一个关联数组。我的 pl/sql 包中的代码是:

    PROCEDURE SG_DATA_ARRAY (PROVA IN T_ASSOCIATIVE_ARRAY, P_RESULT OUT VARCHAR2) AS 

    BEGIN

    SAVEPOINT SP1;

    FOR indx IN 1..PROVA.count
    LOOP
        TA_DATA.TA_TABLE_INS (PROVA(indx), INDX);
    END LOOP;

    P_RESULT:='SUCCESS INS';

    EXCEPTION
       WHEN OTHERS THEN
         ROLLBACK TO SAVEPOINT SP1;

           P_RESULT:='ERROR INS';

    END SG_DATA_ARRAY; 

我正在做一个关联数组循环,然后我从包 TA_DATA 中调用我的存储过程 TA_TABLE_INS。在我调用的过程中,我将关联数组中的数据保存到几个变量中:

    PROCEDURE TA_TABLE_INS (PROVA IN T_ASSOCIATIVE_ARRAY, P_DESCR IN NUMBER) AS

      P_ID_TMS NUMBER;

      D1 NVARCHAR2 (20);
      DESCRIPTION NVARCHAR2 (255);
      D3 NVARCHAR2(20);
      D4 NVARCHAR2 (255);
      D5 NVARCHAR2(1000);
      D6_REV_N NUMBER;
      D7_REV_N NUMBER;
      D8 NVARCHAR2(20);
      D9 NVARCHAR2(1000);
      D10 NUMBER;

      INSERT INTO TA_TABLE1 
      VALUES (D1, D2, D3, D4, D5, D6, D7, D8, D9, D10);

这是保存数据的正确方法吗?

【问题讨论】:

  • 您的代码似乎没有意义。正如所写,它不应该编译。您对TA_TABLE_INS 的调用传递了集合的一个元素和一个索引。该过程被定义为将t_associative_array 作为第一个参数,而不是该集合的元素。您的过程似乎没有对输入参数做任何事情,它只是将 10 个 NULL 值插入到表中。您尚未发布收藏的定义。如果它是关联数组,则您的代码假定它由整数和密集索引。这是可能的,但在关联数组中不太可能。
  • TYPE T_ASSOCIATIVE_ARRAY 是 PLS_INTEGER 的 VARCHAR(4000) 索引表。代码编译,但我知道我做错了什么。我不明白如何将集合的元素插入 TA_TABLE1。我该怎么做?
  • 如果是这样定义的,则代码无法编译成功。您将 varchar(4000) 传递给 TA_TABLE_INS 过程。该过程需要t_associative_array。那不会编译。您的收藏只有一个字符串。您的表有 10 列,其中包含多种不同的数据类型。您希望如何获取单个字符串并将其插入到具有 10 列的表中?

标签: arrays oracle plsql associative-array


【解决方案1】:

您的第二个过程 TA_TABLE_INS 不是必需的。您可以使用批量插入,而不是将关联数组行传递给过程。

希望,下面的代码会有所帮助

PROCEDURE SG_DATA_ARRAY (PROVA IN T_ASSOCIATIVE_ARRAY, P_RESULT OUT VARCHAR2) AS 
BEGIN

  SAVEPOINT SP1;

  INSERT INTO TA_TABLE1 
  SELECT SEQUENCE.NETXVAL, --You may use a seq number instead of your prova associative array order 
         tmp.d1, tmp.d2, tmp.d3, 
    FROM TABLE(CAST(PROVA AS T_ASSOCIATIVE_ARRAY) tmp; -- You can directly cast an associative array into a table    


  P_RESULT:='SUCCESS INS';

  EXCEPTION
     WHEN OTHERS THEN
       ROLLBACK TO SAVEPOINT SP1;

         P_RESULT:='ERROR INS';

END SG_DATA_ARRAY; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 2014-05-11
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2018-04-05
    相关资源
    最近更新 更多