如何搜索用户输入的月份

How to search for a month that is input by the user

我正在做一些作业,并且已经坚持了一个星期。我试过使用 TO_CHAR、MONTH(search) 和 EXTRACT(MONTH from...),它们都以标识符 'JAN'(我正在搜索的月份)未声明结束,或者表达式的类型错误。此任务是显示指定月份内作出的认捐的所有行。 PLEDGEDATE 列的类型为日期,格式为 'dd-mmm-yy'。有什么想法可以实现吗?

Declare
Pledges UNIT_2_ASSIGNMENT%ROWTYPE;
SEARCH DATE;

Begin
SEARCH := &M0NTH;
FOR PLEDGES IN
(SELECT IDPLEDGE, IDDONOR, PLEDGEAMT,
CASE 
WHEN PAYMONTHS = 0 THEN 'LUMP SUM'
ELSE'MONHTLY - '||PAYMONTHS
END AS MONTHLY_PAYMENT
FROM UNIT_2_ASSIGNMENT
WHERE TO_CHAR(PLEDGEDATE,'MMM') = 'SEARCH'
ORDER BY PAYMONTHS)

LOOP 
DBMS_OUTPUT.PUT_LINE('Pledge ID: '||UNIT_2_ASSIGNMENT.IDPLEDGE||
' Donor ID: '||UNIT_2_ASSIGNMENT.IDDONOR||
' Pledge Amount: '||TO_CHAR(UNIT_2_ASSIGNMENT.PLEDGEAMT)||
' Lump Sum: '||MONTHLY_PAYMENT);
END LOOP;

END;

您可以使用(对更改的评论是内联的):

DECLARE
  Pledges UNIT_2_ASSIGNMENT%ROWTYPE;
  SEARCH VARCHAR2(3); -- Use VARCHAR2 not DATE data type.
BEGIN
  SEARCH := 'JAN'; -- Replace with your substitution variable.


  FOR PLEDGES IN (
    SELECT IDPLEDGE,
           IDDONOR,
           PLEDGEAMT,
           CASE 
           WHEN PAYMONTHS = 0
           THEN 'LUMP SUM'
           ELSE 'MONHTLY - '||PAYMONTHS
           END AS MONTHLY_PAYMENT
    FROM   UNIT_2_ASSIGNMENT
    WHERE  TO_CHAR(PLEDGEDATE,'MON') = SEARCH -- Unquote variable and use MON not MMM
    ORDER BY PAYMONTHS
  )
  LOOP 
    DBMS_OUTPUT.PUT_LINE(
      'Pledge ID: '||Pledges.IDPLEDGE|| -- Use rowtype variable name not table name.
      ' Donor ID: '||Pledges.IDDONOR||
      ' Pledge Amount: '||TO_CHAR(Pledges.PLEDGEAMT)||
      ' Lump Sum: '||Pledges.MONTHLY_PAYMENT
    );
  END LOOP;
END;
/

其中,对于示例数据:

CREATE TABLE unit_2_assignment( idpledge, iddonor, pledgeamt, pledgedate, paymonths ) AS
SELECT LEVEL,
       'Donor' || LEVEL,
       LEVEL * 1000,
       ADD_MONTHS( DATE '2020-01-01', LEVEL - 1 ),
       LEVEL
FROM   DUAL
CONNECT BY LEVEL <= 12;

输出:

Pledge ID: 1 Donor ID: Donor1 Pledge Amount: 1000 Lump Sum: MONHTLY - 1

您应该将替换变量括在单引号 ('&MONTH') 中,因为 SQLPlus 将其视为简单的单词并且可以替换任何内容,根据如此古老的 8i reference 中的示例。从报错信息可以看出:他试图使用JAN作为标识符,所以没有正确包含。

Declare
Pledges UNIT_2_ASSIGNMENT%ROWTYPE;
SEARCH DATE;

Begin
SEARCH := '&M0NTH';

它说的是什么:

For example, if the variable SORTCOL has the value JOB and the variable 
MYTABLE has the value EMP, SQL*Plus executes the commands

SQL> BREAK ON &SORTCOL
SQL> SELECT &SORTCOL, SAL
  2  FROM &MYTABLE
  3  ORDER BY &SORTCOL;

但对于您的任务,不需要使用 PL/SQL,只需以适当的方式格式化 SQLPlus 脚本的输出(没有 SQLPlus 控制台来放置直接格式化选项,但最好阅读 SQLPlus 上的文档你自己)。