Oracle 游标名称代替额外变量
这是我的程序。其中我使用了名为“CUR_TO_collection_DATA”的游标。 此外,我还使用了一个名为“VAR_CUR_TO_COLLECT_DATA”的变量,该变量是“TBL_试算平衡报告”表类型 现在我不想使用“VAR\u CUR\u to\u COLLECT\u DATA”变量,而是想使用游标的名称,即“CUR\u to\u COLLECT\u DATA”来代替“VAR\u CUR\u to\u COLLECT\u DATA”变量 完成这项任务可能吗?如果是,请如何帮助Oracle 游标名称代替额外变量,oracle,plsql,Oracle,Plsql,这是我的程序。其中我使用了名为“CUR_TO_collection_DATA”的游标。 此外,我还使用了一个名为“VAR_CUR_TO_COLLECT_DATA”的变量,该变量是“TBL_试算平衡报告”表类型 现在我不想使用“VAR\u CUR\u to\u COLLECT\u DATA”变量,而是想使用游标的名称,即“CUR\u to\u COLLECT\u DATA”来代替“VAR\u CUR\u to\u COLLECT\u DATA”变量 完成这项任务可能吗?如果是,请如何帮助 PROC
PROCEDURE PR_TRIAL_BALANCEWITHOUTFOR IS
CURSOR CUR_TO_COLLECT_DATA IS(
SELECT NAME, SUM(CREDIT) AS CREDIT, SUM(DEBIT) AS DEBIT
FROM (
SELECT (SELECT GL_NAME
FROM QM_GL
WHERE QM_GL.GL_ID = QT_ACCOUNTING.GL_ID) AS NAME,
DECODE(QT_ACCOUNTING.TRANS_TYPE,
'CR',
(QT_ACCOUNTING.TRANS_AMOUNT),
0.00) AS CREDIT,
DECODE(QT_ACCOUNTING.TRANS_TYPE,
'DR',
(QT_ACCOUNTING.TRANS_AMOUNT),
0.00) AS DEBIT
FROM QT_ACCOUNTING, QM_ACCOUNTING_PERIOD
WHERE QT_ACCOUNTING.VALUE_DATE BETWEEN
QM_ACCOUNTING_PERIOD.PERIODFROM AND
QM_ACCOUNTING_PERIOD.PERIODTO
AND QM_ACCOUNTING_PERIOD.STATUS = 'O'
)
GROUP BY NAME);
VAR_CUR_TO_COLLECT_DATA TBL_TRIAL_BALANCE_REPORT%ROWTYPE;
BEGIN
OPEN CUR_TO_COLLECT_DATA;
LOOP
FETCH CUR_TO_COLLECT_DATA
INTO VAR_CUR_TO_COLLECT_DATA;
IF (VAR_CUR_TO_COLLECT_DATA.CREDIT - VAR_CUR_TO_COLLECT_DATA.DEBIT) > 0 THEN
INSERT INTO TBL_TRIAL_BALANCE_REPORT
VALUES
(VAR_CUR_TO_COLLECT_DATA.NAME,
(VAR_CUR_TO_COLLECT_DATA.CREDIT - VAR_CUR_TO_COLLECT_DATA.DEBIT),
0);
END IF;
IF (VAR_CUR_TO_COLLECT_DATA.DEBIT - VAR_CUR_TO_COLLECT_DATA.CREDIT) > 0 THEN
INSERT INTO TBL_TRIAL_BALANCE_REPORT
VALUES
(VAR_CUR_TO_COLLECT_DATA.NAME,
0,
(VAR_CUR_TO_COLLECT_DATA.DEBIT - VAR_CUR_TO_COLLECT_DATA.CREDIT));
END IF;
EXIT WHEN CUR_TO_COLLECT_DATA%NOTFOUND;
END LOOP;
CLOSE CUR_TO_COLLECT_DATA;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
BEGIN
CLOSE CUR_TO_COLLECT_DATA;
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
END;
您可以尝试这样做:
PROCEDURE PR_TRIAL_BALANCEWITHOUTFOR IS
CURSOR CUR_TO_COLLECT_DATA IS(
SELECT NAME, SUM(CREDIT) AS CREDIT, SUM(DEBIT) AS DEBIT
FROM (
SELECT (SELECT GL_NAME
FROM QM_GL
WHERE QM_GL.GL_ID = QT_ACCOUNTING.GL_ID) AS NAME,
DECODE(QT_ACCOUNTING.TRANS_TYPE,
'CR',
(QT_ACCOUNTING.TRANS_AMOUNT),
0.00) AS CREDIT,
DECODE(QT_ACCOUNTING.TRANS_TYPE,
'DR',
(QT_ACCOUNTING.TRANS_AMOUNT),
0.00) AS DEBIT
FROM QT_ACCOUNTING, QM_ACCOUNTING_PERIOD
WHERE QT_ACCOUNTING.VALUE_DATE BETWEEN
QM_ACCOUNTING_PERIOD.PERIODFROM AND
QM_ACCOUNTING_PERIOD.PERIODTO
AND QM_ACCOUNTING_PERIOD.STATUS = 'O'
)
GROUP BY NAME);
-- VAR_CUR_TO_COLLECT_DATA TBL_TRIAL_BALANCE_REPORT%ROWTYPE;
BEGIN
FOR REC_TO_COLLECT_DATA IN CUR_TO_COLLECT_DATA LOOP
IF (REC_TO_COLLECT_DATA.CREDIT - REC_TO_COLLECT_DATA.DEBIT) > 0 THEN
INSERT INTO TBL_TRIAL_BALANCE_REPORT
VALUES
(REC_TO_COLLECT_DATA.NAME,
(REC_TO_COLLECT_DATA.CREDIT - REC_TO_COLLECT_DATA.DEBIT),
0);
END IF;
IF (REC_TO_COLLECT_DATA.DEBIT - REC_TO_COLLECT_DATA.CREDIT) > 0 THEN
INSERT INTO TBL_TRIAL_BALANCE_REPORT
VALUES
(REC_TO_COLLECT_DATA.NAME,
0,
(REC_TO_COLLECT_DATA.DEBIT - REC_TO_COLLECT_DATA.CREDIT));
END IF;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
顺便说一句,我不喜欢这个
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
部分-如果有例外,你不应该沉默它