【问题标题】:How can I create a stored procedure to only allow inserts in a particular month?如何创建存储过程以仅允许在特定月份插入?
【发布时间】:2016-02-15 04:00:43
【问题描述】:

我想创建一个只在三月份进行插入的存储过程。存储过程应接受表的值,但使用系统日期来确定是否应插入记录。

这是我正在尝试的,但创建的过程有错误。

CREATE OR REPLACE PROCEDURE sp_time_1203383 (
   p_sales_id IN sales_1203383.SALES_ID%TYPE,
   p_product  IN sales_1203383.PRODUCT%TYPE,
   p_unitcost IN sales_1203383.UNITCOST%TYPE,
   p_quantity IN sales_1203383.QUANTITY%TYPE
)
IS
BEGIN
    IF( MONTH( GETDATE() ) = 3 )
    BEGIN
        INSERT INTO sales_1203383 ("SALES_ID", "PRODUCT", "UNITCOST", "QUANTITY") 
        VALUES (p_sales_id, p_product,p_unitcost, p_quantity);
    END
    ELSE
    BEGIN
        SELECT 'Can Only insert during the month of March'
    END

    COMMIT;

END;

【问题讨论】:

  • 您遇到了什么错误?还有为什么不直接测试IF( MONTH( GETDATE() ) = 3 )
  • 我正在使用 oracle 11g 命令行,它说创建的过程存在编译错误
  • 我尝试了你的建议..同样的错误@Dai
  • 请发布您从数据库系统获得的准确错误消息,包括任何错误代码、行号或字符偏移量。
  • 请求只在某个月份插入的过程,使用sysdate;一个附有数字的表格。这闻起来很糟糕。也许你可以解释一下大局。

标签: stored-procedures oracle11g sql-insert


【解决方案1】:

我认为 Praveen 给了你正确的建议。

我个人不会使用

SELECT count(1) into v_cnt FROM dual WHERE month(sysdate) = 3;

但您可以签入 if ... then ... else ... end;声明代码如下:

if to_char(sysdate,'mm') = '03' then ... end;

【讨论】:

    【解决方案2】:

    您的存储过程中有一些错误:

    1. 你不能有selectif 声明
    2. thenIF 语句一起使用,并在结尾处使用End if
    3. ; 必须与 End 语句一起使用
    4. 您不能从procedure/function/block 返回select set(应使用引用光标)
    5. 如果您想在else 部分引发错误,请使用raise_application_error
    6. 如果您的选择语句类似于select 'something',请使用虚拟表dualselect 'something' from dual

    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

    CREATE OR REPLACE PROCEDURE sp_time_1203383 (
       p_sales_id IN sales_1203383.SALES_ID%TYPE,
       p_product  IN sales_1203383.PRODUCT%TYPE,
       p_unitcost IN sales_1203383.UNITCOST%TYPE,
       p_quantity IN sales_1203383.QUANTITY%TYPE
    ) 
    IS
        v_cnt NUMBER;
    BEGIN
        SELECT count(1) into v_cnt FROM dual WHERE month(sysdate) = 3;
        IF v_cnt > 0 THEN 
            INSERT INTO sales_1203383 ("SALES_ID", "PRODUCT", "UNITCOST", "QUANTITY") 
            VALUES (p_sales_id, p_product, p_unitcost, p_quantity);
        ELSE
            raise_application_error(-20101, 'Can Only insert during the month of March');
        END IF;
    END;
    

    【讨论】:

    • 这不是 OP 所要求的,你不需要计算。如果 sysdate 在 3 月,则允许插入,否则引发错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 2022-11-26
    • 2022-07-30
    • 2018-08-20
    • 1970-01-01
    相关资源
    最近更新 更多