PL SQL插入列表

时间:2016-02-01 10:32:24

标签: plsql plsqldeveloper

我正在尝试使用pl / sql在过程中插入整数列表,但遗憾的是我无法找到方法,任何人都可以指导我如何将整数列表传递给PL / SQL中的过程。

2 个答案:

答案 0 :(得分:0)

使用架构范围类型

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;

答案 1 :(得分:-1)

此代码使用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());
        }
    }