【问题标题】:delete query using execute Immediate使用立即执行删除查询
【发布时间】:2017-11-24 08:50:09
【问题描述】:

我想将 varchar2 转换为日期,但它发生的错误给我解决方案

DECLARE
  ADATE VARCHAR2(100):='02/20/1981';
BEGIN
  EXECUTE IMMEDIATE 'DELETE FROM emp WHERE HIREDATE= '||to_char(to_date(ADATE,'mm/dd/yy'),'mm/dd/yy');
  DBMS_OUTPUT.PUT_LINE('DELETE');
END;

【问题讨论】:

    标签: sql oracle plsql oracle11g oracle-apex-5


    【解决方案1】:

    你也可以用这个:

    DECLARE
       ADATE   VARCHAR2 (100) := '02/20/1981';
    BEGIN
       EXECUTE IMMEDIATE
             'DELETE FROM emp WHERE HIREDATE= :aDate' using TO_DATE(ADATE, 'mm/dd/yyyy');
    
       DBMS_OUTPUT.PUT_LINE ('DELETE');
      COMMIT;
    END;
    

    【讨论】:

      【解决方案2】:

      你可以使用它。确保使用USING 子句传递绑定变量以避免SQL 注入。也正如@Kaushik 所提到的,没有必要做TO_CHAR

      DECLARE
         ADATE   VARCHAR2 (100) := '02/20/1981';
      BEGIN
         EXECUTE IMMEDIATE
               'DELETE FROM emp WHERE HIREDATE= TO_DATE(:ADATE, ''mm/dd/yyyy'')' using adate;
      
         DBMS_OUTPUT.PUT_LINE ('DELETE');
        COMMIT;
      END;
      

      【讨论】:

        【解决方案3】:

        您无需将其转换为TO_CHAR。引号必须正确并使用正确的日期格式。

        DECLARE
          ADATE VARCHAR2(100):='02/20/1981';
        BEGIN
          EXECUTE IMMEDIATE 'DELETE FROM emp WHERE HIREDATE=to_date('''||ADATE||''',''mm/dd/yyyy'')';
          DBMS_OUTPUT.PUT_LINE('DELETE');
        END;
        

        对于您的删除操作,您甚至不需要EXECUTE IMMEDIATE。像这样的块应该足够了。

        DECLARE
          ADATE VARCHAR2(100):='02/20/1981';
        BEGIN
          DELETE FROM emp WHERE HIREDATE=to_date(ADATE,'mm/dd/yyyy');
          DBMS_OUTPUT.PUT_LINE('DELETE');
        END;
        

        【讨论】:

          猜你喜欢
          • 2017-07-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-05
          • 2020-12-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多