如何创建存储过程以仅允许在特定月份插入?

时间:2016-02-15 04:00:44

标签: stored-procedures oracle11g sql-insert

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

这就是我的尝试,但程序创建时出错。

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;

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

存储过程中存在一些错误:

  1. 您不能select使用if声明
  2. thenIF声明一起使用,最后End if
  3. ;必须与End声明
  4. 一起使用
  5. 您无法从select set返回procedure/function/block(应使用引用光标)
  6. 如果您想在else部分使用raise_application_error
  7. 中出现引发错误
  8. 如果您的select语句与select 'something'类似,请使用虚拟表dualselect 'something' from dual
  9. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

    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;