使用cfprocparam将数组或列表导入Oracle

使用cfprocparam将数组或列表导入Oracle,oracle,stored-procedures,coldfusion,tokenize,cfstoredproc,Oracle,Stored Procedures,Coldfusion,Tokenize,Cfstoredproc,我有一个要通过存储过程插入到表中的值列表。 我想我会将一个数组传递给oracle,并在数组中循环,但我不知道如何将数组传递给oracle。我会传递一个列表,但我不知道如何使用该列表将其转换为使用PL/SQL的数组(我对PL/SQL相当陌生)。我是不是走错了路 使用Oracle 9i和CF8 编辑 也许我想得不对?我确信我在这里没有做任何新的事情。。。 我想我应该将列表转换为关联数组,然后循环该数组,因为Oracle似乎不能很好地处理列表(在我有限的观察中) 我正在尝试添加产品,然后为管理团队添加

我有一个要通过存储过程插入到表中的值列表。 我想我会将一个数组传递给oracle,并在数组中循环,但我不知道如何将数组传递给oracle。我会传递一个列表,但我不知道如何使用该列表将其转换为使用PL/SQL的数组(我对PL/SQL相当陌生)。我是不是走错了路

使用Oracle 9i和CF8

编辑

也许我想得不对?我确信我在这里没有做任何新的事情。。。 我想我应该将列表转换为关联数组,然后循环该数组,因为Oracle似乎不能很好地处理列表(在我有限的观察中)

我正在尝试添加产品,然后为管理团队添加记录。
--产品表

产品名称='foo' productDescription='bar' ... ... 等

--managementteam表仅包含从下拉列表中选择的产品id和用户id

用户ID通过类似“1,3,6,20”的列表传入

如何将记录添加到管理团队表中


这就是我对代码的理解 理论上,我将列表“1,2,3,4”传递给inserts.addProduct。
inserts.addProduct应调用tools.listToArray并返回一个数组。
inserts.addProduct以*delim作为测试重新创建列表。
根据需要创建或替换包工具

  TYPE array_type is TABLE OF VARCHAR2(225) INDEX BY BINARY_INTEGER;

  FUNCTION listToArray(in_list IN VARCHAR,
                     in_delim IN VARCHAR2 DEFAULT ',') 
  RETURN array_type;

END tools;



CREATE OR REPLACE PACKAGE BODY tools
AS

FUNCTION listToArray(in_list IN VARCHAR,
                         in_delim IN VARCHAR2 DEFAULT ',') 
    RETURN array_type

    IS
    l_token_count BINARY_INTEGER := 0;
    -- l_token_tbl type_array; 
    i pls_integer;
    l_start_pos INTEGER := 1;
    l_end_pos INTEGER :=1;
    p_parsed_table array_type;

    BEGIN -- original work by John Spencer  
       WHILE l_end_pos <> 0 LOOP
          l_end_pos := instr(in_list,in_delim,l_start_pos);
          IF l_end_pos <> 0 THEN
             l_token_count  := l_token_count  + 1;
             p_parsed_table(l_token_count ) :=
                      substr(in_list,l_start_pos,l_end_pos - l_start_pos);
             l_start_pos := l_end_pos + 1;
          END IF;
       END LOOP;
       IF l_token_count = 0 THEN /* We haven't parsed anything so */ 
          l_token_count := 1;
          p_parsed_table(l_token_count) := in_list;
       ELSE  /* We need to get the last token */ 
          l_token_count := l_token_count + 1;
          p_parsed_table(l_token_count) := substr(in_list,l_start_pos);
       END If;
       RETURN p_parsed_table;
    END listToArray;  -- Procedure

END tools;



CREATE OR REPLACE PACKAGE inserts AS
    TYPE array_type is TABLE OF VARCHAR2(225) INDEX BY BINARY_INTEGER;

    PROCEDURE addProduct (inList         IN  VARCHAR2,
                          outList        OUT VARCHAR2
                         );

END inserts;  




CREATE OR REPLACE PACKAGE BODY inserts                      

    AS
    PROCEDURE addProduct (inList         IN  VARCHAR2,
                          outList        OUT VARCHAR2
                         )
    IS
    i NUMBER;
    localArray array_type := tools.listToArray(inList);
    BEGIN       
       outList := '';
       FOR i IN localArray.first .. localArray.last LOOP
          outList := outList || '*' ||localArray(i); -- return a string just to test this mess 
       END LOOP;

    END addProduct;

END inserts;
TYPE数组_TYPE是VARCHAR2(225)索引由二进制_整数组成的表;
函数listToArray(在VARCHAR中的\u列表中,
在VARCHAR2中的默认值“,”)
返回数组类型;
末端工具;
创建或替换包体工具
作为
函数listToArray(在VARCHAR中的\u列表中,
在VARCHAR2中的默认值“,”)
返回数组类型
是
l_令牌\u计数二进制\u整数:=0;
--l_令牌\u tbl类型\u数组;
我喜欢整数;
l_开始位置整数:=1;
l_end_pos整数:=1;
p_解析_表数组_类型;
开始——约翰·斯宾塞的原创作品
而l_end_pos 0循环
l_end_pos:=instr(在列表中、在列表中、在开始位置);
如果l_end_位置为0,则
l_令牌计数:=l_令牌计数+1;
p_解析_表(l_令牌计数):=
substr(在列表中,l_开始位置,l_结束位置-l_开始位置);
l_开始位置:=l_结束位置+1;
如果结束;
端环;
如果l_token_count=0,那么/*我们还没有解析出这样的内容*/
l_令牌计数:=1;
p_解析_表(l_令牌_计数):=在_列表中;
ELSE/*我们需要获取最后一个令牌*/
l_令牌计数:=l_令牌计数+1;
p_解析的_表(l_令牌计数):=substr(在_列表中,l_开始位置);
如果结束;
返回p_解析的_表;
结束列表阵列;——程序
末端工具;
根据需要创建或替换软件包插件
类型数组_TYPE是VARCHAR2(225)索引由二进制_整数组成的表;
程序addProduct(在VARCHAR2中列出),
比瓦查尔活得长
);
端部插入件;
创建或替换包体插件
作为
程序addProduct(在VARCHAR2中列出),
比瓦查尔活得长
)
是
i编号;
localArray_type:=tools.listToArray(inList);
开始
最长:='';
对于localArray.first中的i。。localArray.last循环
outList:=outList | |'*'| | localArray(i);--返回一个字符串来测试这个混乱
端环;
最终产品;
端部插入件;
我目前在localArray_type:=tools.listToArray(inList)上收到一个错误“PLS-00382:表达式的类型错误”


最终工作代码(非常感谢!) --创建sql类型集合

CREATE OR REPLACE TYPE array_type is TABLE OF VARCHAR2(225);
/



CREATE OR REPLACE PACKAGE tools AS

  FUNCTION listToArray(in_list IN VARCHAR,
                     in_delim IN VARCHAR2 DEFAULT ',') 
  RETURN array_type;

END tools;   
/



CREATE OR REPLACE PACKAGE BODY tools
AS

    FUNCTION listToArray(in_list IN VARCHAR,
                         in_delim IN VARCHAR2 DEFAULT ',') 
    RETURN array_type

    IS
    l_token_count BINARY_INTEGER := 0;
    i pls_integer;
    l_start_pos INTEGER := 1;
    l_end_pos INTEGER :=1;
    p_parsed_table array_type := array_type();

    BEGIN
       WHILE l_end_pos <> 0 LOOP
          l_end_pos := instr(in_list,in_delim,l_start_pos);
          IF l_end_pos <> 0 THEN
             p_parsed_table.extend(1);
             l_token_count  := l_token_count  + 1;
             p_parsed_table(l_token_count ) :=
                      substr(in_list,l_start_pos,l_end_pos - l_start_pos);
             l_start_pos := l_end_pos + 1;
          END IF;

       END LOOP;
       p_parsed_table.extend(1);
       IF l_token_count = 0 THEN /* We haven't parsed anything so */ 
          l_token_count := 1;
          p_parsed_table(l_token_count) := in_list;
       ELSE  /* We need to get the last token */ 
          l_token_count := l_token_count + 1;
          p_parsed_table(l_token_count) := substr(in_list,l_start_pos);
       END If;
       RETURN p_parsed_table;
    END listToArray;  -- Procedure

END tools;
/



CREATE OR REPLACE PACKAGE inserts AS

    PROCEDURE addProduct (inList  IN  VARCHAR2,
                             outList OUT VARCHAR2
                         );

END inserts;
/




CREATE OR REPLACE PACKAGE BODY inserts
AS
    PROCEDURE addProduct (inList  IN  VARCHAR2,
                          outList OUT VARCHAR2
                         )
    IS
    i NUMBER;
    mylist VARCHAR(100);
    localArray array_type := array_type();

    BEGIN     
    localArray := tools.listToArray(inList);
       mylist := '';
       FOR i IN localArray.first .. localArray.last LOOP
          mylist := mylist || localArray(i) || '*';
       END LOOP;
       aList := mylist;
    END addProduct;

END inserts;  
/
创建或替换类型数组_类型为VARCHAR2(225)的表;
/
根据需要创建或替换包工具
函数listToArray(在VARCHAR中的\u列表中,
在VARCHAR2中的默认值“,”)
返回数组类型;
末端工具;
/
创建或替换包体工具
作为
函数listToArray(在VARCHAR中的\u列表中,
在VARCHAR2中的默认值“,”)
返回数组类型
是
l_令牌\u计数二进制\u整数:=0;
我喜欢整数;
l_开始位置整数:=1;
l_end_pos整数:=1;
p_解析的_表数组_类型:=数组_类型();
开始
而l_end_pos 0循环
l_end_pos:=instr(在列表中、在列表中、在开始位置);
如果l_end_位置为0,则
p_解析_表扩展(1);
l_令牌计数:=l_令牌计数+1;
p_解析_表(l_令牌计数):=
substr(在列表中,l_开始位置,l_结束位置-l_开始位置);
l_开始位置:=l_结束位置+1;
如果结束;
端环;
p_解析_表扩展(1);
如果l_token_count=0,那么/*我们还没有解析出这样的内容*/
l_令牌计数:=1;
p_解析_表(l_令牌_计数):=在_列表中;
ELSE/*我们需要获取最后一个令牌*/
l_令牌计数:=l_令牌计数+1;
p_解析的_表(l_令牌计数):=substr(在_列表中,l_开始位置);
如果结束;
返回p_解析的_表;
结束列表阵列;——程序
末端工具;
/
根据需要创建或替换软件包插件
程序addProduct(在VARCHAR2中列出),
比瓦查尔活得长
);
端部插入件;
/
创建或替换包体插件
作为
程序addProduct(在VARCHAR2中列出),
比瓦查尔活得长
)
是
i编号;
mylist VARCHAR(100);
localArray_-type:=数组_-type();
开始
localArray:=tools.listToArray(inList);
mylist:='';
对于localArray.first中的i。。localArray.last循环
mylist:=mylist | | localArray(i)| |'*';
端环;
列表:=mylist;
最终产品;
端部插入件;
/

PL/SQL自Oracle 8.0以来一直支持阵列。他们
"Fox in socks, Mr Knox, Sam-I-Am, The Lorax"
create or replace type tok_tbl as table of varchar2(225) 
/

create or replace package parser is

    function my_parse(
          p_str_to_search in varchar2
            , p_delimiter in varchar2 default ',')
          return tok_tbl;

    procedure my_parse(
          p_str_to_search in varchar2
          , p_delimiter in varchar2 default ','
          , p_parsed_table out tok_tbl);

end parser;
/
create or replace package body parser is

    procedure my_parse ( p_str_to_search in varchar2
                          , p_delimiter in varchar2 default ','
                          , p_parsed_table out tok_tbl)
    is
        l_token_count binary_integer := 0;
        l_token_tbl tok_tbl := tok_tbl();
        i pls_integer;
        l_start_pos integer := 1;
        l_end_pos integer :=1;   
    begin

        while l_end_pos != 0
        loop
            l_end_pos := instr(p_str_to_search,p_delimiter,l_start_pos);

            if l_end_pos  != 0 then
                l_token_count := l_token_count + 1;
                l_token_tbl.extend();
                l_token_tbl(l_token_count ) :=
                    substr(p_str_to_search,l_start_pos,l_end_pos - l_start_pos);
                l_start_pos := l_end_pos + 1;
            end if;
        end loop;

        l_token_tbl.extend();
        if l_token_count = 0 then /* we haven't parsed anything so */
            l_token_count := 1;
            l_token_tbl(l_token_count) := p_str_to_search;
        else /* we need to get the last token */
            l_token_count := l_token_count + 1;
            l_token_tbl(l_token_count) := substr(p_str_to_search,l_start_pos);
        end if;
        p_parsed_table := l_token_tbl;
    end my_parse;

    function my_parse ( p_str_to_search in varchar2
                            , p_delimiter in varchar2 default ',')
                          return tok_tbl
    is
        rv tok_tbl;
    begin
        my_parse(p_str_to_search, p_delimiter, rv);
        return rv;
    end my_parse;

end parser;
/
SQL> insert into t23
  2  select trim(column_value)
  3  from table(parser.my_parse('Fox in socks, Mr Knox, Sam-I-Am, The Lorax'))
  4  /

4 rows created.

SQL> select * from t23
  2  /

TXT
------------------------------------------------------------------------------
Fox in socks
Mr Knox
Sam-I-Am
The Lorax

SQL>