Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 使用%ROWTYPE创建pl/sql过程时出现问题_Oracle_Stored Procedures_Plsql_Rowtype - Fatal编程技术网

Oracle 使用%ROWTYPE创建pl/sql过程时出现问题

Oracle 使用%ROWTYPE创建pl/sql过程时出现问题,oracle,stored-procedures,plsql,rowtype,Oracle,Stored Procedures,Plsql,Rowtype,我在创建执行操作的过程时遇到问题。基本上我有两个表,一个是收入表,另一个是重复交易。我计划在oracle 11g中创建一个作业,每天执行一个过程。该过程将有一个开始日期、结束日期和出现次数,因此我的过程应检查开始日期是否为今天的日期和出现次数=0然后它应该在我的第一个表(收入表)中插入一行。下面是我的表格说明和数据 如果我执行上面的脚本,它会给我以下错误。我是PL/SQL新手。有人能解释错误的含义和修复错误的方法吗 /*您好,您可以尝试下面的代码片段。因为我现在没有工作区,所以可能包含语法错

我在创建执行操作的过程时遇到问题。基本上我有两个表,一个是收入表,另一个是重复交易。我计划在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;