Oracle 使用%ROWTYPE创建pl/sql过程时出现问题
我在创建执行操作的过程时遇到问题。基本上我有两个表,一个是收入表,另一个是重复交易。我计划在oracle 11g中创建一个作业,每天执行一个过程。该过程将有一个开始日期、结束日期和出现次数,因此我的过程应检查开始日期是否为今天的日期和出现次数=0然后它应该在我的第一个表(收入表)中插入一行。下面是我的表格说明和数据 如果我执行上面的脚本,它会给我以下错误。我是PL/SQL新手。有人能解释错误的含义和修复错误的方法吗Oracle 使用%ROWTYPE创建pl/sql过程时出现问题,oracle,stored-procedures,plsql,rowtype,Oracle,Stored Procedures,Plsql,Rowtype,我在创建执行操作的过程时遇到问题。基本上我有两个表,一个是收入表,另一个是重复交易。我计划在oracle 11g中创建一个作业,每天执行一个过程。该过程将有一个开始日期、结束日期和出现次数,因此我的过程应检查开始日期是否为今天的日期和出现次数=0然后它应该在我的第一个表(收入表)中插入一行。下面是我的表格说明和数据 如果我执行上面的脚本,它会给我以下错误。我是PL/SQL新手。有人能解释错误的含义和修复错误的方法吗 /*您好,您可以尝试下面的代码片段。因为我现在没有工作区,所以可能包含语法错
/*您好,您可以尝试下面的代码片段。因为我现在没有工作区,所以可能包含语法错误。让我知道这是否有帮助*/
CREATE OR REPLACE PROCEDURE recurTransDaily(
currTransID IN NUMBER)
IS
type r_currentTransRowrcrd
IS
record
(
RECTRANSACTIONID RECURRINGTRANSACTION.RECTRANSACTIONID%TYPE,
AMOUNT RECURRINGTRANSACTION.AMOUNT%TYPE,
DESCRIPTION RECURRINGTRANSACTION.DESCRIPTION%TYPE,
ISEXPENSE RECURRINGTRANSACTION.ISEXPENSE%TYPE,
ISINCOME RECURRINGTRANSACTION.ISINCOME%TYPE,
NOOFOCCURENSES RECURRINGTRANSACTION.NOOFOCCURENSES%TYPE,
TRANSACTIONDATE RECURRINGTRANSACTION.TRANSACTIONDATE%TYPE,
TRANSSACTIONENDDATE RECURRINGTRANSACTION.TRANSSACTIONENDDATE%TYPE,
CATEGORYID RECURRINGTRANSACTION.CATEGORYID%TYPE,
PAYEEID RECURRINGTRANSACTION.PAYEEID%TYPE,
RECURRINGTRANSACTIONTYPE RECURRINGTRANSACTION.RECURRINGTRANSACTIONTYPE%TYPE,
PERSONID RECURRINGTRANSACTION.PERSONID%TYPE);
TYPE lv_tab
IS
TABLE OF r_currentTransRowrcrd;
r_currentTransRow lv_tab;
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION set nls_timestamp_format = ''DD-MON-YY HH24:MI:SS.FF6''';
EXECUTE IMMEDIATE 'ALTER SESSION set nls_date_format = ''DD-MON-YY''';
SELECT * BULK COLLECT
INTO r_currentTransRow
FROM RECURRINGTRANSACTION
WHERE RECTRANSACTIONID =currTransID;
FOR I IN r_currentTransRow.FIRST..r_currentTransRow.LAST
LOOP
IF TO_CHAR(TO_TIMESTAMP(r_currentTransRow(i).TRANSACTIONDATE,'DD-MON-YY HH24:MI:SS.FF6'),'DD-MON-YY') = to_char(sysdate,'DD-MON-YY') THEN
-- insert a record into income table
INSERT
INTO income
(
AMOUNT,
DESCRIPTION,
TRANSACTIONDATE,
CATEGORYID,
PAYEEID,
PERSONID
)
VALUES
(
r_currentTransRow(i).AMOUNT,
r_currentTransRow(i).DESCRIPTION,
r_currentTransRow(i).TRANSACTIONDATE,
r_currentTransRow(i).CATEGORYID,
r_currentTransRow(i).PAYEEID,
r_currentTransRow(i).PERSONID
);
-- update the present RECURRINGTRANSACTION row with TRANSACTIONDATE=sysdate+1 and NOOFOCCURENSES=NOOFOCCURENSES-1
UPDATE RECURRINGTRANSACTION
SET RECURRINGTRANSACTION.TRANSACTIONDATE =SYSTIMESTAMP+1,
RECURRINGTRANSACTION.NOOFOCCURENSES =r_currentTransRow(i).NOOFOCCURENSES-1
WHERE RECURRINGTRANSACTION.RECTRANSACTIONID=r_currentTransRow(i).RECTRANSACTIONID;
COMMIT;
END IF;
END LOOP;
END;
:非常感谢您的及时回复和更新的代码。我会尝试使用它,如果我遇到任何问题,我会告诉你。我使用了与你提供的代码相同的代码,并且创建了这个过程。但当我尝试将“171”作为过程的参数执行时,它给了我以下错误:ORA-01843:不是有效的月份ORA-06512:在“HR.RECURTRANSDAILY”第35行ORA-06512:在第1 01843行。00000-“非有效月份”TRANSACTIONDATE RECURRINGTRANSACTION.TRANSACTIONDATE%TYPE的数据类型是什么?正如您在我的帖子中看到的,我将表格描述的图像放在了这里。列TRANSACTIONDATE是时间戳(6)类型,它与收入表相同。您现在可以尝试检查一下吗。
CREATE OR REPLACE PROCEDURE recurTransDaily(
currTransID IN NUMBER)
IS
type r_currentTransRowrcrd
IS
record
(
RECTRANSACTIONID RECURRINGTRANSACTION.RECTRANSACTIONID%TYPE,
AMOUNT RECURRINGTRANSACTION.AMOUNT%TYPE,
DESCRIPTION RECURRINGTRANSACTION.DESCRIPTION%TYPE,
ISEXPENSE RECURRINGTRANSACTION.ISEXPENSE%TYPE,
ISINCOME RECURRINGTRANSACTION.ISINCOME%TYPE,
NOOFOCCURENSES RECURRINGTRANSACTION.NOOFOCCURENSES%TYPE,
TRANSACTIONDATE RECURRINGTRANSACTION.TRANSACTIONDATE%TYPE,
TRANSSACTIONENDDATE RECURRINGTRANSACTION.TRANSSACTIONENDDATE%TYPE,
CATEGORYID RECURRINGTRANSACTION.CATEGORYID%TYPE,
PAYEEID RECURRINGTRANSACTION.PAYEEID%TYPE,
RECURRINGTRANSACTIONTYPE RECURRINGTRANSACTION.RECURRINGTRANSACTIONTYPE%TYPE,
PERSONID RECURRINGTRANSACTION.PERSONID%TYPE);
TYPE lv_tab
IS
TABLE OF r_currentTransRowrcrd;
r_currentTransRow lv_tab;
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION set nls_timestamp_format = ''DD-MON-YY HH24:MI:SS.FF6''';
EXECUTE IMMEDIATE 'ALTER SESSION set nls_date_format = ''DD-MON-YY''';
SELECT * BULK COLLECT
INTO r_currentTransRow
FROM RECURRINGTRANSACTION
WHERE RECTRANSACTIONID =currTransID;
FOR I IN r_currentTransRow.FIRST..r_currentTransRow.LAST
LOOP
IF TO_CHAR(TO_TIMESTAMP(r_currentTransRow(i).TRANSACTIONDATE,'DD-MON-YY HH24:MI:SS.FF6'),'DD-MON-YY') = to_char(sysdate,'DD-MON-YY') THEN
-- insert a record into income table
INSERT
INTO income
(
AMOUNT,
DESCRIPTION,
TRANSACTIONDATE,
CATEGORYID,
PAYEEID,
PERSONID
)
VALUES
(
r_currentTransRow(i).AMOUNT,
r_currentTransRow(i).DESCRIPTION,
r_currentTransRow(i).TRANSACTIONDATE,
r_currentTransRow(i).CATEGORYID,
r_currentTransRow(i).PAYEEID,
r_currentTransRow(i).PERSONID
);
-- update the present RECURRINGTRANSACTION row with TRANSACTIONDATE=sysdate+1 and NOOFOCCURENSES=NOOFOCCURENSES-1
UPDATE RECURRINGTRANSACTION
SET RECURRINGTRANSACTION.TRANSACTIONDATE =SYSTIMESTAMP+1,
RECURRINGTRANSACTION.NOOFOCCURENSES =r_currentTransRow(i).NOOFOCCURENSES-1
WHERE RECURRINGTRANSACTION.RECTRANSACTIONID=r_currentTransRow(i).RECTRANSACTIONID;
COMMIT;
END IF;
END LOOP;
END;