【发布时间】:2016-11-21 16:40:02
【问题描述】:
我必须使用来自 clob 的数据在循环中执行查询并将每个查询的结果存储在游标中。但是我不确定如何/在哪里打开游标。如果我在循环中执行此操作,那么我假设只会出现最后一个查询的数据。
遇到这种情况怎么办。
这就是我想要达到的目标:
https://www.mkyong.com/jdbc/jdbc-callablestatement-stored-procedure-cursor-example/
PROCEDURE PRC(
P_DATE IN VARCHAR,
P_CLOB IN CLOB,
P_CUR OUT SYS_REFCURSOR
) IS
V_DATE DATE;
V_STR VARCHAR;
BEGIN
V_DATE := TO_DATE(P_DATE, 'DD/MM/YYYY');
V_CLOB_LENGTH := DBMS_LOB.getlength(P_CLOB);
V_START_CHAR := 1;
V_LEN := 5;
WHILE (V_START_CHAR + V_LEN) <= V_CLOB_LENGTH
LOOP
V_STR := SUBSTR(
P_CLOB,
V_START_CHAR,
V_LEN
);
V_START_CHAR := V_START_CHAR + V_LEN;
OPEN P_CUR FOR /* I know this is wrong */
SELECT A , B, C
FROM TAB
WHERE DATE = V_DATE
AND COL = V_STR;
END LOOP;
END PRC;
【问题讨论】:
-
说你可以在每次循环迭代中打开一个游标;你想对打开的游标做什么?
-
游标不存储查询结果,所以我不确定您要做什么。
-
不能在游标中存储数据;要使用不同的过滤器为每次迭代运行游标,您必须使用游标参数;例如:docs.oracle.com/cloud/latest/db112/LNPLS/static.htm#BABHBHIC
-
我在 java 中使用可调用语句来调用此存储过程并在 java 中的结果集中获取结果。我已经在问题中添加了我想要做的事情的链接
-
所以你正在对传入的 clob 进行分块,并将每个块与表中的一行进行比较?这是跨行存储 clob 的一种奇怪方式。看起来很奇怪的设计。