我正在尝试使用pl / sql在过程中插入整数列表,但遗憾的是我无法找到方法,任何人都可以指导我如何将整数列表传递给PL / SQL中的过程。
答案 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语句或“对象”填充值 - 功能访问器,如.EXTEND
和V_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());
}
}