【问题标题】:How to put result of a query inside a loop in a Cursor in a PL SQL procedure?如何将查询结果放入 PL SQL 过程中游标的循环中?
【发布时间】: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 的一种奇怪方式。看起来很奇怪的设计。

标签: sql oracle plsql cursor


【解决方案1】:

如果我是你,我会在查询中对 clob 进行分块,然后你可以简单地将其加入到你的表中 - 类似于:

PROCEDURE PRC(P_DATE IN VARCHAR,
              P_CLOB IN CLOB,
              P_CUR  OUT SYS_REFCURSOR)
IS
  v_length constant number := 5;
BEGIN
  OPEN p_cur FOR
    SELECT tab.a,
           tab.b,
           tab.c
    FROM   tab
           INNER JOIN (SELECT to_char(p_date, 'dd/mm/yyyy') dt,
                              dbms_lob.SUBSTR(p_clob, v_length, (LEVEL - 1)*v_length + 1) substring
                       FROM   dual
                       CONNECT BY dbms_lob.SUBSTR(p_clob, v_length, (LEVEL - 1)*v_length + 1) IS NOT NULL) str
             ON tab.dt = str.dt
                AND tab.col = str.substring;
END prc;

【讨论】:

    猜你喜欢
    • 2018-11-30
    • 2012-03-27
    • 2012-04-28
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多