4
    WITH    Q (L) AS
        (
         SELECT  1 FROM DUAL
         UNION ALL
         SELECT  L + 1
         FROM    Q
         WHERE   L < 99
        )
SELECT  MIN(L)
INTO next_priority
FROM Q
LEFT JOIN gxrdird on gxrdird_priority = L 
 and gxrdird_pidm = aPidm_in and gxrdird_ap_ind = 'Y'
WHERE L NOT IN (select gxrdird_priority 
                  from gxrdird where gxrdird_pidm = aPidm_in);

このクエリは、手動で実行したときに必要な結果を返します。私はそれをパッケージプロシージャに入れようとしていますが、次のようになります。

51/5  PL/SQL: SQL Statement ignored 
55/22  PL/SQL: ORA-00932: inconsistent datatypes: expected NUMBER got - 

これは、列Lの「SELECTL + 1」の行に対応します。具体的には、with句内でLをNUMBERとして宣言する方法はありますか?私は1時間グーグルしてきましたが、パラメーターを持つwith句のいくつかの例では、それらをタイプとして宣言していません。

これは私を苛立たせています、そして私が正しい結果を与えることができるより簡単な質問はありません。

編集、コンテキストの追加:

  CURSOR xxx_cur IS
SELECT ROWID, GXRDIRD_PRIORITY
FROM GXRDIRD 
WHERE GXRDIRD_PIDM = aPidm_in 
  AND GXRDIRD_AP_IND = 'A' 
AND GXRDIRD_ATYP_CODE IS NULL 
AND GXRDIRD_ADDR_SEQNO IS NULL
ORDER BY GXRDIRD_PRIORITY DESC;

  xxx_rec   xxx_cur%ROWTYPE;
  next_priority         NUMBER;
BEGIN


OPEN xxx_cur;
LOOP
FETCH xxx_cur INTO xxx_rec;
EXIT WHEN xxx_cur%NOTFOUND;

-- Here we should update that particular row, but we can't just increment it.
WITH    Q (L) AS
        (
         SELECT  1 FROM DUAL
         UNION ALL
         SELECT  L + 1
         FROM    Q
         WHERE   L < 99
        )
SELECT  MIN(L)
INTO next_priority
FROM Q
LEFT JOIN gxrdird on gxrdird_priority = L and gxrdird_pidm = aPidm_in and gxrdird_ap_ind = 'Y'
WHERE L NOT IN (select gxrdird_priority from gxrdird where gxrdird_pidm = aPidm_in);    

-- The above query found the lowest-numbered unused priority, and now we'll set this record to that.
UPDATE GXRDIRD SET GXRDIRD_PRIORITY = next_priority WHERE ROWID = xxx_rec.ROWID;

-- If the above record was originally 7 and the lowest was 15, now 7 is free and will be used if we loop
-- again.
DBMS_OUTPUT.PUT_LINE(OBJECT_NAME || '.P_RESEQUENCE_INACTV_ACCNTS - Changed priority ' || xxx_rec.GXRDIRD_PRIORITY || ' into ' || next_priority);
END LOOP;

51行目:WITH Q(L)AS

55行目:SELECT L + 1

4

1 に答える 1

1

連続した数字でダミー行を生成しようとしているようです。それを行う私の好ましい方法は次のとおりです。

WITH    Q AS
        (
         SELECT  rownum AS l
         FROM    dual
         CONNECT BY level < 100
        )
SELECT  MIN(L)
INTO next_priority
FROM Q
...

これがうまくいくかどうか試してみてください。

于 2012-08-28T08:35:47.073 に答える