游标 oracle 内的 for 循环
for loop inside a cursor oracle
我创建了一个类型
TYPE t_array IS TABLE OF VARCHAR2(15);
一个函数,它将包含“,”的字符串作为分隔符,函数 returns t_array 基本上是拆分字符串并返回值列表。
FUNCTION split_string(id IN VARCHAR2)
...
...
....
RETURN t_array;
END split_string;
现在我的存储过程将长字符串作为输入,调用拆分字符串的函数并循环遍历 t_array 和 returns 一个 CURSOR。
PROCEDURE p_get_xxx(p_id IN VARCHAR2,
p_cur_result OUT SYSREFCURSOR)
AS
l_array schema_name.t_array;
BEGIN
l_array := split_string(p_id);
OPEN p_cur_result FOR
FOR i IN l_array.first .. l_array.last
LOOP
SELECT * FROM ........
WHERE ID = l_array(i);
END LOOP;
END p_get_xxx;
我收到如下编译错误:
Unexpected 'FOR' in the place of '('
是否有更好的方法来处理这种情况,或者我在这里遗漏了什么?
游标总是在 SELECT 语句上打开。据我所知,没有办法在 FOR
循环上打开游标。
在我看来,您确实想动态地创建一个 SELECT 语句。我建议如下:
PROCEDURE p_get_xxx(p_id IN VARCHAR2, p_cur_result OUT SYSREFCURSOR)
AS
l_array schema_name.t_array;
strSelect_statement VARCHAR2(4000);
BEGIN
l_array := split_string(p_id);
-- Set up the basics of the SELECT statement
strSelect_statement := 'SELECT * FROM SOME_TABLE WHERE ID IN (';
FOR i IN l_array.FIRST..l_array.LAST LOOP
strSelect_statement := strSelect_statement ||
'''' || l_array(i) || ''',';
END LOOP;
-- Get rid of the unwanted trailing comma
strSelect_statement := SUBSTR(strSelect_statement, 1,
LENGTH(strSelect_statement)-1);
-- Add a right parentheses to close the IN list
strSelect_statement := strSelect_statement || ')';
-- Open the cursor
OPEN p_cur_result FOR strSelect_statement;
END p_get_xxx;
祝你好运。
我创建了一个类型
TYPE t_array IS TABLE OF VARCHAR2(15);
一个函数,它将包含“,”的字符串作为分隔符,函数 returns t_array 基本上是拆分字符串并返回值列表。
FUNCTION split_string(id IN VARCHAR2)
...
...
....
RETURN t_array;
END split_string;
现在我的存储过程将长字符串作为输入,调用拆分字符串的函数并循环遍历 t_array 和 returns 一个 CURSOR。
PROCEDURE p_get_xxx(p_id IN VARCHAR2,
p_cur_result OUT SYSREFCURSOR)
AS
l_array schema_name.t_array;
BEGIN
l_array := split_string(p_id);
OPEN p_cur_result FOR
FOR i IN l_array.first .. l_array.last
LOOP
SELECT * FROM ........
WHERE ID = l_array(i);
END LOOP;
END p_get_xxx;
我收到如下编译错误:
Unexpected 'FOR' in the place of '('
是否有更好的方法来处理这种情况,或者我在这里遗漏了什么?
游标总是在 SELECT 语句上打开。据我所知,没有办法在 FOR
循环上打开游标。
在我看来,您确实想动态地创建一个 SELECT 语句。我建议如下:
PROCEDURE p_get_xxx(p_id IN VARCHAR2, p_cur_result OUT SYSREFCURSOR)
AS
l_array schema_name.t_array;
strSelect_statement VARCHAR2(4000);
BEGIN
l_array := split_string(p_id);
-- Set up the basics of the SELECT statement
strSelect_statement := 'SELECT * FROM SOME_TABLE WHERE ID IN (';
FOR i IN l_array.FIRST..l_array.LAST LOOP
strSelect_statement := strSelect_statement ||
'''' || l_array(i) || ''',';
END LOOP;
-- Get rid of the unwanted trailing comma
strSelect_statement := SUBSTR(strSelect_statement, 1,
LENGTH(strSelect_statement)-1);
-- Add a right parentheses to close the IN list
strSelect_statement := strSelect_statement || ')';
-- Open the cursor
OPEN p_cur_result FOR strSelect_statement;
END p_get_xxx;
祝你好运。