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