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