【问题标题】:PL SQL Insert ListPL SQL 插入列表
【发布时间】:2016-05-09 18:31:12
【问题描述】:

我正在尝试使用 pl/sql 在过程中插入整数列表,但不幸的是我找不到方法,谁能指导我如何将整数列表传递到 PL/SQL 中的过程中。

【问题讨论】:

  • 您可以为此使用 pl\sql 集合。或者更混乱的方法是在一个字符串中使用逗号分隔的整数。
  • 是的,您可以使用用户定义的表类型 w8 来做,我将与您分享我的代码
  • 感谢 vikas,请分享您的代码,它将帮助我指导。
  • 请检查下面的代码
  • 明白了吗?

标签: plsql plsqldeveloper


【解决方案1】:

使用架构范围的类型

CREATE TYPE TY_INT_ARRAY IS TABLE OF INTEGER;

或包类型

CREATE OR REPLACE PACKAGE PKG_INT_TEST AS

  TYPE TY_INT_ARRAY IS TABLE OF INTEGER;

  /*
    ... more stuff
  */

END PKG_INT_TEST;
/

注意:不能在 SQL 中使用包类型!仅在 PLSQL 内部。

请尝试以下示例:

SET SERVEROUTPUT ON;
SET FEEDBACK OFF;
CLEAR;

-- create a schema type of table of integers
CREATE TYPE TY_INT_ARRAY IS TABLE OF INTEGER;
/

-- Create a dumping procedure with array "list" parameter
CREATE OR REPLACE PROCEDURE DUMP_INT_ARRAY(P_ARRAY IN TY_INT_ARRAY) IS
BEGIN
  FOR L_I IN P_ARRAY.FIRST .. P_ARRAY.LAST LOOP
    DBMS_OUTPUT.PUT_LINE(TO_CHAR(P_ARRAY(L_I)));
  END LOOP;
END;
/

-- Test the procedure:
DECLARE
  -- Declare an int array variable
  V_MY_ARRAY TY_INT_ARRAY;

BEGIN
  -- Assign values
  V_MY_ARRAY := TY_INT_ARRAY(1, 2, 3, 4, 5, 6, 7, 8, 9);

  DUMP_INT_ARRAY(V_MY_ARRAY);
END;
/

DROP PROCEDURE DUMP_INT_ARRAY;
DROP TYPE TY_INT_ARRAY;

您可以使用 BULK COLLECT INTO 语句或“对象”函数访问器(如 .EXTENDV_MY_ARRAY(V_MY_ARRAY.LAST) := 10;)填充值

【讨论】:

    【解决方案2】:

    使用XMLTYPE怎么样,创建如下程序,

    CREATE OR REPLACE PROCEDURE sp_list_n (
        list_n IN XMLTYPE
    ) AS
    BEGIN
        FOR vl_idx IN (
            SELECT
                item_number
            FROM
                XMLTABLE ( '/r/n' PASSING list_n COLUMNS item_number NUMBER PATH 'text()' )
        ) LOOP
            dbms_output.put_line(vl_idx.item_number);
        END LOOP;
    END;
    /
    

    然后执行,

    begin
    sp_list_n(xmltype('<r>
       <n>1</n>
       <n>2</n>
       <n>3</n>
       <n>4</n>
       <n>5555</n>
    </r>'));
    end;
    

    你有以下输出:

    Procedimiento PL/SQL terminado correctamente.
    1
    2
    3
    4
    5555
    

    你也可以添加数字

    【讨论】:

      【解决方案3】:

      此代码使用 C# 和 MS-SQL SERVER

      创建您的用户定义表类型:

      CREATE TYPE [dbo].[IntegersList] AS TABLE(
          [Item] INT NULL
      );
      

      //存储过程

      CREATE PROCEDURE [dbo].[sp_UserIntegersList]
          @IntList IntegersList READONLY
      AS
      BEGIN
          -- Just return the items we passed in
          SELECT l.Item FROM @IntList l;
      END
      

      C#代码

      using (var con = new SqlConnection(constr))
      {
          con.Open();
          using (SqlCommand cmd = new SqlCommand("exec sp_UserIntegersList @IntList", con))
          {
              var table = new DataTable();
              table.Columns.Add("Item", typeof(int));
      
              for (int i = 0; i < 10; i++)
                  table.Rows.Add("Item " + i);
      
              var pList = new SqlParameter("@IntList", SqlDbType.Structured);
              pList.TypeName = "dbo.StringList";
              pList.Value = table;
      
              cmd.Parameters.Add(pList);
      
              using (var dr = cmd.ExecuteReader())
              {
                  while (dr.Read())
                      Console.WriteLine(dr["Item"].ToString());
              }
          }
      

      【讨论】:

      • 作者明确说明了plsql(oracle)而不是sql server。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多